Index: tools/vulcanize/node_modules/vulcanize/node_modules/cheerio/lib/parse.js |
diff --git a/tools/vulcanize/node_modules/vulcanize/node_modules/cheerio/lib/parse.js b/tools/vulcanize/node_modules/vulcanize/node_modules/cheerio/lib/parse.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7add78f5fca43e659d3e19ee801ae6029241368f |
--- /dev/null |
+++ b/tools/vulcanize/node_modules/vulcanize/node_modules/cheerio/lib/parse.js |
@@ -0,0 +1,124 @@ |
+/* |
+ Module Dependencies |
+*/ |
+var htmlparser = require('htmlparser2'), |
+ _ = require('underscore'), |
+ isTag = require('./utils').isTag, |
+ camelCase = require('./utils').camelCase; |
+ |
+/* |
+ Parser |
+*/ |
+exports = module.exports = function(content, options) { |
+ var dom = evaluate(content, options); |
+ |
+ // Generic root element |
+ var root = { |
+ type: 'root', |
+ name: 'root', |
+ parent: null, |
+ prev: null, |
+ next: null, |
+ children: [] |
+ }; |
+ |
+ // Update the dom using the root |
+ update(dom, root); |
+ |
+ return root; |
+}; |
+ |
+var evaluate = exports.evaluate = function(content, options) { |
+ // options = options || $.fn.options; |
+ |
+ var handler = new htmlparser.DomHandler(options), |
+ parser = new htmlparser.Parser(handler, options); |
+ |
+ parser.write(content); |
+ parser.done(); |
+ |
+ return connect(handler.dom); |
+}; |
+ |
+var connect = exports.connect = function(dom, parent) { |
+ parent = parent || null; |
+ |
+ var prevElem = null; |
+ |
+ _.each(dom, function(elem) { |
+ |
+ if (isTag(elem.type)) { |
+ // If tag and no attributes, add empty object |
+ if (elem.attribs === undefined) { |
+ elem.attribs = {}; |
+ } else { |
+ // If there are already attributes, add them to the data list. |
+ elem.data = parseData(elem); |
+ } |
+ } |
+ |
+ // Set parent |
+ elem.parent = parent; |
+ |
+ // Previous Sibling |
+ elem.prev = prevElem; |
+ |
+ // Next sibling |
+ elem.next = null; |
+ if (prevElem) prevElem.next = elem; |
+ |
+ // Run through the children |
+ if (elem.children) |
+ connect(elem.children, elem); |
+ else if (isTag(elem.type)) |
+ elem.children = []; |
+ |
+ // Get ready for next element |
+ prevElem = elem; |
+ }); |
+ |
+ return dom; |
+}; |
+ |
+/* |
+ Update the dom structure, for one changed layer |
+ |
+ * Much faster than reconnecting |
+*/ |
+var update = exports.update = function(arr, parent) { |
+ // normalize |
+ if (!Array.isArray(arr)) arr = [arr]; |
+ |
+ // Update neighbors |
+ for (var i = 0; i < arr.length; i++) { |
+ arr[i].prev = arr[i - 1] || null; |
+ arr[i].next = arr[i + 1] || null; |
+ arr[i].parent = parent || null; |
+ } |
+ |
+ // Update parent |
+ parent.children = arr; |
+ |
+ return parent; |
+}; |
+ |
+/** |
+ * Extract data by using element attributes. |
+ * @param {Object} elem Element |
+ * @return {Object} `element.data` object |
+ */ |
+var parseData = exports.parseData = function(elem) { |
+ if (elem.data === undefined) elem.data = {}; |
+ var value; |
+ for (var key in elem.attribs) { |
+ if (key.substr(0, 5) === 'data-') { |
+ value = elem.attribs[key]; |
+ key = key.slice(5); |
+ key = camelCase(key); |
+ elem.data[key] = value; |
+ } |
+ } |
+ return elem.data; |
+}; |
+ |
+// module.exports = $.extend(exports); |