123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- var SINGLE_TAGS = [
- 'area',
- 'base',
- 'br',
- 'col',
- 'command',
- 'embed',
- 'hr',
- 'img',
- 'input',
- 'keygen',
- 'link',
- 'menuitem',
- 'meta',
- 'param',
- 'source',
- 'track',
- 'wbr'
- ]
- var ATTRIBUTE_QUOTES_REQUIRED = /[\t\n\f\r " '`=<>]/
- function render (tree, options) {
-
- options = options || {}
- var singleTags = options.singleTags ? SINGLE_TAGS.concat(options.singleTags) : SINGLE_TAGS
- var singleRegExp = singleTags.filter(function (tag) {
- return tag instanceof RegExp
- })
- var closingSingleTag = options.closingSingleTag
- var quoteAllAttributes = options.quoteAllAttributes
- if (typeof quoteAllAttributes === 'undefined') {
- quoteAllAttributes = true
- }
- return html(tree)
-
- function isSingleTag (tag) {
- if (singleRegExp.length !== 0) {
- for (var i = 0; i < singleRegExp.length; i++) {
- return singleRegExp[i].test(tag)
- }
- }
- if (singleTags.indexOf(tag) === -1) {
- return false
- }
- return true
- }
-
- function attrs (obj) {
- var attr = ''
- for (var key in obj) {
- if (typeof obj[key] === 'string') {
- if (quoteAllAttributes || obj[key].match(ATTRIBUTE_QUOTES_REQUIRED)) {
- attr += ' ' + key + '="' + obj[key].replace(/"/g, '"') + '"'
- } else if (obj[key] === '') {
- attr += ' ' + key
- } else {
- attr += ' ' + key + '=' + obj[key]
- }
- } else if (obj[key] === true) {
- attr += ' ' + key
- } else if (typeof obj[key] === 'number') {
- attr += ' ' + key + '="' + obj[key] + '"'
- }
- }
- return attr
- }
-
- function traverse (tree, cb) {
- if (tree !== undefined) {
- for (var i = 0, length = tree.length; i < length; i++) {
- traverse(cb(tree[i]), cb)
- }
- }
- }
-
- function html (tree) {
- var result = ''
- if (!Array.isArray(tree)) {
- tree = [tree]
- }
- traverse(tree, function (node) {
-
- if (node === undefined ||
- node === null ||
- node === false ||
- node.length === 0 ||
- Number.isNaN(node)) {
- return
- }
-
- if (Array.isArray(node)) {
- result += html(node)
- return
- }
- if (typeof node === 'string' || typeof node === 'number') {
- result += node
- return
- }
-
- if (node.tag === false) {
- result += html(node.content)
- return
- }
- var tag = node.tag || 'div'
- result += '<' + tag
- if (node.attrs) {
- result += attrs(node.attrs)
- }
- if (isSingleTag(tag)) {
- switch (closingSingleTag) {
- case 'tag':
- result += '></' + tag + '>'
- break
- case 'slash':
- result += ' />'
- break
- default:
- result += '>'
- }
- result += html(node.content)
- } else {
- result += '>' + html(node.content) + '</' + tag + '>'
- }
- })
- return result
- }
- }
- module.exports = render
|