Index: node_modules/vulcanize/node_modules/whacko/lib/parse.js |
diff --git a/node_modules/vulcanize/node_modules/whacko/lib/parse.js b/node_modules/vulcanize/node_modules/whacko/lib/parse.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8e1b57e73e3edb37dbf00e5d4c8cc193db9eceb5 |
--- /dev/null |
+++ b/node_modules/vulcanize/node_modules/whacko/lib/parse.js |
@@ -0,0 +1,101 @@ |
+/* |
+ Module Dependencies |
+ */ |
+var parse5 = require('parse5'); |
+ |
+var parser = new parse5.Parser(parse5.TreeAdapters.htmlparser2); |
+ |
+/* |
+ Parser |
+ */ |
+exports = module.exports = function (content, options, isDocument) { |
+ var dom = exports.evaluate(content, options, isDocument); |
+ |
+ // Generic root element |
+ var root = parse5.TreeAdapters.htmlparser2.createDocument(); |
+ |
+ // Update the dom using the root |
+ exports.update(dom, root); |
+ |
+ return root; |
+}; |
+ |
+var shouldParseAsDocument = function (content) { |
+ //NOTE: if evaluate was called in fragment parsing mode, but doctype or <html> tag was passed |
+ //we should switch to document parsing mode. This is a pretty simple heuristic, e.g. we don't expect |
+ //comments at the beginning of the content. |
+ return /^\s*<!doctype/i.test(content) || /^\s*<html/i.test(content); |
+}; |
+ |
+exports.evaluate = function (content, options, isDocument) { |
+ var dom = null; |
+ |
+ if (Buffer.isBuffer(content)) |
+ content = content.toString(); |
+ |
+ if (typeof content === 'string') { |
+ |
+ if (isDocument || shouldParseAsDocument(content)) |
+ dom = parser.parse(content); |
+ else |
+ dom = parser.parseFragment(content); |
+ |
+ dom = dom.children; |
+ |
+ return dom; |
+ } |
+ |
+ return content; |
+}; |
+ |
+/* |
+ Update the dom structure, for one changed layer |
+ */ |
+exports.update = function (arr, parent) { |
+ // normalize |
+ if (!Array.isArray(arr)) arr = [arr]; |
+ |
+ // Update parent |
+ if (parent) { |
+ parent.children = arr; |
+ } else { |
+ parent = null; |
+ } |
+ |
+ // Update neighbors |
+ for (var i = 0; i < arr.length; i++) { |
+ var node = arr[i]; |
+ |
+ // Cleanly remove existing nodes from their previous structures. |
+ var oldParent = node.parent || node.root, |
+ oldSiblings = oldParent && oldParent.children; |
+ if (oldSiblings && oldSiblings !== arr) { |
+ oldSiblings.splice(oldSiblings.indexOf(node), 1); |
+ if (node.prev) { |
+ node.prev.next = node.next; |
+ } |
+ if (node.next) { |
+ node.next.prev = node.prev; |
+ } |
+ } |
+ |
+ if (parent) { |
+ node.prev = arr[i - 1] || null; |
+ node.next = arr[i + 1] || null; |
+ } else { |
+ node.prev = node.next = null; |
+ } |
+ |
+ if (parent && parent.type === 'root') { |
+ node.root = parent; |
+ node.parent = null; |
+ } else { |
+ node.root = null; |
+ node.parent = parent; |
+ } |
+ } |
+ |
+ return parent; |
+}; |
+ |
+// module.exports = $.extend(exports); |