Index: node_modules/vulcanize/node_modules/whacko/lib/render.js |
diff --git a/node_modules/vulcanize/node_modules/whacko/lib/render.js b/node_modules/vulcanize/node_modules/whacko/lib/render.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..02809d10889333570892740609385d9c1a351d8f |
--- /dev/null |
+++ b/node_modules/vulcanize/node_modules/whacko/lib/render.js |
@@ -0,0 +1,160 @@ |
+/* |
+ Module dependencies |
+ */ |
+var parse5 = require('parse5'); |
+var _ = require('lodash'); |
+var utils = require('./utils'); |
+ |
+var encode = utils.encode; |
+ |
+var serializer = new parse5.TreeSerializer(parse5.TreeAdapters.htmlparser2); |
+ |
+/* |
+ Boolean Attributes |
+ */ |
+var rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i; |
+ |
+/* |
+ Format attributes |
+ */ |
+var formatAttrs = function (attributes) { |
+ if (!attributes) return; |
+ |
+ var output = '', |
+ value; |
+ |
+ // Loop through the attributes |
+ for (var key in attributes) { |
+ value = attributes[key]; |
+ if (output) { |
+ output += ' '; |
+ } |
+ |
+ if (!value && (rboolean.test(key) || key === '/')) { |
+ output += key; |
+ } else { |
+ output += key + '="' + encode(value) + '"'; |
+ } |
+ } |
+ |
+ return output; |
+}; |
+ |
+/* |
+ Self-enclosing tags (stolen from node-htmlparser) |
+ */ |
+var singleTag = { |
+ area: 1, |
+ base: 1, |
+ basefont: 1, |
+ br: 1, |
+ col: 1, |
+ frame: 1, |
+ hr: 1, |
+ img: 1, |
+ input: 1, |
+ isindex: 1, |
+ link: 1, |
+ meta: 1, |
+ param: 1, |
+ embed: 1, |
+ include: 1, |
+ 'yield': 1 |
+}; |
+ |
+/* |
+ Tag types from htmlparser |
+ */ |
+var tagType = { |
+ tag: 1, |
+ script: 1, |
+ link: 1, |
+ style: 1, |
+ template: 1 |
+}; |
+ |
+var render = module.exports = function (dom, opts) { |
+ opts = opts || {}; |
+ |
+ if (!Array.isArray(dom) && !dom.cheerio) |
+ dom = dom.type === 'root' ? dom.children : [dom]; |
+ |
+ if (!opts.xmlMode) { |
+ return serializer.serialize({ |
+ type: 'fake-root', |
+ name: 'fake-root', |
+ children: dom |
+ }); |
+ } |
+ |
+ |
+ var output = '', |
+ xmlMode = opts.xmlMode; |
+ |
+ _.each(dom, function (elem) { |
+ var isTag = tagType[elem.type]; |
+ |
+ var pushVal; |
+ if (isTag) |
+ pushVal = renderTag(elem, xmlMode); |
+ else if (elem.type === 'directive') |
+ pushVal = renderDirective(elem); |
+ else if (elem.type === 'comment') |
+ pushVal = renderComment(elem); |
+ else if (elem.type === 'cdata') |
+ pushVal = renderCdata(elem); |
+ else |
+ pushVal = renderText(elem); |
+ |
+ if (elem.children && elem.type !== 'cdata') |
+ pushVal += render(elem.children, opts); |
+ |
+ if (isTag && (!singleTag[elem.name] || xmlMode)) { |
+ if (!isClosedTag(elem, xmlMode)) { |
+ pushVal += '</' + elem.name + '>'; |
+ } |
+ } |
+ |
+ // Push rendered DOM node |
+ output += pushVal; |
+ }); |
+ |
+ return output; |
+}; |
+ |
+var isClosedTag = function (elem, xmlMode) { |
+ return (xmlMode && (!elem.children || elem.children.length === 0)); |
+}; |
+ |
+var renderTag = function (elem, xmlMode) { |
+ var tag = '<' + elem.name, |
+ attribs = formatAttrs(elem.attribs); |
+ |
+ if (attribs) { |
+ tag += ' ' + attribs; |
+ } |
+ |
+ if (isClosedTag(elem, xmlMode)) { |
+ tag += '/'; |
+ } |
+ |
+ return tag + '>'; |
+}; |
+ |
+var renderDirective = function (elem) { |
+ return '<' + elem.data + '>'; |
+}; |
+ |
+var renderText = function (elem) { |
+ return elem.data || ''; |
+}; |
+ |
+var renderCdata = function (elem) { |
+ return '<![CDATA[' + elem.children[0].data + ']]>'; |
+}; |
+ |
+var renderComment = function (elem) { |
+ return '<!--' + elem.data + '-->'; |
+}; |
+ |
+// module.exports = $.extend(exports); |