Index: tools/vulcanize/node_modules/vulcanize/node_modules/cheerio/node_modules/htmlparser2/node_modules/domutils/index.js |
diff --git a/tools/vulcanize/node_modules/vulcanize/node_modules/cheerio/node_modules/htmlparser2/node_modules/domutils/index.js b/tools/vulcanize/node_modules/vulcanize/node_modules/cheerio/node_modules/htmlparser2/node_modules/domutils/index.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d8b2d2baa42b7394643aa216e0dbd262ee744452 |
--- /dev/null |
+++ b/tools/vulcanize/node_modules/vulcanize/node_modules/cheerio/node_modules/htmlparser2/node_modules/domutils/index.js |
@@ -0,0 +1,318 @@ |
+var ElementType = require("domelementtype"), |
+ DomUtils = module.exports; |
+ |
+var isTag = DomUtils.isTag = ElementType.isTag; |
+ |
+function getChildren(elem){ |
+ return elem.children; |
+} |
+function getParent(elem){ |
+ return elem.parent; |
+} |
+function getSiblings(elem){ |
+ var parent = getParent(elem); |
+ return parent ? getChildren(parent) : [elem]; |
+} |
+function getAttributeValue(elem, name){ |
+ return elem.attribs && elem.attribs[name]; |
+} |
+function hasAttrib(elem, name){ |
+ return hasOwnProperty.call(elem.attribs, name); |
+} |
+function getName(elem){ |
+ return elem.name; |
+} |
+ |
+DomUtils.getChildren = getChildren; |
+DomUtils.getParent = getParent; |
+DomUtils.getAttributeValue = getAttributeValue; |
+DomUtils.hasAttrib = hasAttrib; |
+DomUtils.getName = getName; |
+DomUtils.getSiblings = getSiblings; |
+ |
+function find(test, arr, recurse, limit){ |
+ var result = [], childs; |
+ |
+ for(var i = 0, j = arr.length; i < j; i++){ |
+ if(test(arr[i])){ |
+ result.push(arr[i]); |
+ if(--limit <= 0) break; |
+ } |
+ |
+ childs = getChildren(arr[i]); |
+ if(recurse && childs && childs.length > 0){ |
+ childs = find(test, childs, recurse, limit); |
+ result = result.concat(childs); |
+ limit -= childs.length; |
+ if(limit <= 0) break; |
+ } |
+ } |
+ |
+ return result; |
+} |
+ |
+function findOneChild(test, arr){ |
+ for(var i = 0, l = arr.length; i < l; i++){ |
+ if(test(arr[i])) return arr[i]; |
+ } |
+ |
+ return null; |
+} |
+ |
+function findOne(test, arr){ |
+ var elem = null; |
+ |
+ for(var i = 0, l = arr.length; i < l && !elem; i++){ |
+ if(test(arr[i])){ |
+ elem = arr[i]; |
+ } else if(arr[i].children && arr[i].children.length > 0){ |
+ elem = findOne(test, arr[i].children); |
+ } |
+ } |
+ |
+ return elem; |
+} |
+ |
+DomUtils.findOne = findOne; |
+ |
+function findAll(test, elems){ |
+ var result = []; |
+ for(var i = 0, j = elems.length; i < j; i++){ |
+ if(test(elems[i])) result.push(elems[i]); |
+ |
+ var childs = getChildren(elems[i]); |
+ if(childs && childs.length){ |
+ result = result.concat(findAll(test, childs)); |
+ } |
+ } |
+ return result; |
+} |
+ |
+DomUtils.findAll = findAll; |
+ |
+function filter(test, element, recurse, limit){ |
+ if(!Array.isArray(element)) element = [element]; |
+ |
+ if(typeof limit !== "number" || !isFinite(limit)){ |
+ if(recurse === false){ |
+ return element.filter(test); |
+ } else { |
+ return findAll(test, element); |
+ } |
+ } else if(limit === 1){ |
+ if(recurse === false){ |
+ element = findOneChild(test, element); |
+ } else { |
+ element = findOne(test, element); |
+ } |
+ return element ? [element] : []; |
+ } else { |
+ return find(test, element, recurse !== false, limit); |
+ } |
+} |
+ |
+DomUtils.filter = filter; |
+ |
+DomUtils.testElement = function(options, element){ |
+ for(var key in options){ |
+ if(!options.hasOwnProperty(key)); |
+ else if(key === "tag_name"){ |
+ if(!isTag(element) || !options.tag_name(element.name)){ |
+ return false; |
+ } |
+ } else if(key === "tag_type"){ |
+ if(!options.tag_type(element.type)) return false; |
+ } else if(key === "tag_contains"){ |
+ if(isTag(element) || !options.tag_contains(element.data)){ |
+ return false; |
+ } |
+ } else if(!element.attribs || !options[key](element.attribs[key])){ |
+ return false; |
+ } |
+ } |
+ return true; |
+}; |
+ |
+var Checks = { |
+ tag_name: function(name){ |
+ if(typeof name === "function"){ |
+ return function(elem){ return isTag(elem) && name(elem.name); }; |
+ } else if(name === "*"){ |
+ return isTag; |
+ } else { |
+ return function(elem){ return isTag(elem) && elem.name === name; }; |
+ } |
+ }, |
+ tag_type: function(type){ |
+ if(typeof type === "function"){ |
+ return function(elem){ return type(elem.type); }; |
+ } else { |
+ return function(elem){ return elem.type === type; }; |
+ } |
+ }, |
+ tag_contains: function(data){ |
+ if(typeof type === "function"){ |
+ return function(elem){ return !isTag(elem) && data(elem.data); }; |
+ } else { |
+ return function(elem){ return !isTag(elem) && elem.data === data; }; |
+ } |
+ } |
+}; |
+ |
+function getAttribCheck(attrib, value){ |
+ if(typeof value === "function"){ |
+ return function(elem){ return elem.attribs && value(elem.attribs[attrib]); }; |
+ } else { |
+ return function(elem){ return elem.attribs && elem.attribs[attrib] === value; }; |
+ } |
+} |
+ |
+DomUtils.getElements = function(options, element, recurse, limit){ |
+ var funcs = []; |
+ for(var key in options){ |
+ if(options.hasOwnProperty(key)){ |
+ if(key in Checks) funcs.push(Checks[key](options[key])); |
+ else funcs.push(getAttribCheck(key, options[key])); |
+ } |
+ } |
+ |
+ if(funcs.length === 0) return []; |
+ if(funcs.length === 1) return filter(funcs[0], element, recurse, limit); |
+ return filter( |
+ function(elem){ |
+ return funcs.some(function(func){ return func(elem); }); |
+ }, |
+ element, recurse, limit |
+ ); |
+}; |
+ |
+DomUtils.getElementById = function(id, element, recurse){ |
+ if(!Array.isArray(element)) element = [element]; |
+ return findOne(getAttribCheck("id", id), element, recurse !== false); |
+}; |
+ |
+DomUtils.getElementsByTagName = function(name, element, recurse, limit){ |
+ return filter(Checks.tag_name(name), element, recurse, limit); |
+}; |
+ |
+DomUtils.getElementsByTagType = function(type, element, recurse, limit){ |
+ return filter(Checks.tag_type(type), element, recurse, limit); |
+}; |
+ |
+DomUtils.removeElement = function(elem){ |
+ if(elem.prev) elem.prev.next = elem.next; |
+ if(elem.next) elem.next.prev = elem.prev; |
+ |
+ if(elem.parent){ |
+ var childs = elem.parent.children; |
+ childs.splice(childs.lastIndexOf(elem), 1); |
+ } |
+}; |
+ |
+DomUtils.replaceElement = function(elem, replacement){ |
+ if(elem.prev){ |
+ elem.prev.next = replacement; |
+ replacement.prev = elem.prev; |
+ } |
+ if(elem.next){ |
+ elem.next.prev = replacement; |
+ replacement.next = elem.next; |
+ } |
+ if(elem.parent){ |
+ var childs = elem.parent.children; |
+ childs.splice(childs.lastIndexOf(elem), 1, replacement); |
+ replacement.parent = elem.parent; |
+ } |
+}; |
+ |
+DomUtils.getInnerHTML = function(elem){ |
+ if(!elem.children) return ""; |
+ |
+ var childs = elem.children, |
+ childNum = childs.length, |
+ ret = ""; |
+ |
+ for(var i = 0; i < childNum; i++){ |
+ ret += DomUtils.getOuterHTML(childs[i]); |
+ } |
+ |
+ return ret; |
+}; |
+ |
+//boolean attributes without a value (taken from MatthewMueller/cheerio) |
+var booleanAttribs = { |
+ __proto__: null, |
+ async: true, |
+ autofocus: true, |
+ autoplay: true, |
+ checked: true, |
+ controls: true, |
+ defer: true, |
+ disabled: true, |
+ hidden: true, |
+ loop: true, |
+ multiple: true, |
+ open: true, |
+ readonly: true, |
+ required: true, |
+ scoped: true, |
+ selected: true, |
+ "/": true //TODO when is this required? |
+}; |
+ |
+var emptyTags = { |
+ __proto__: null, |
+ area: true, |
+ base: true, |
+ basefont: true, |
+ br: true, |
+ col: true, |
+ frame: true, |
+ hr: true, |
+ img: true, |
+ input: true, |
+ isindex: true, |
+ link: true, |
+ meta: true, |
+ param: true, |
+ embed: true |
+}; |
+ |
+DomUtils.getOuterHTML = function(elem){ |
+ var type = elem.type; |
+ |
+ if(type === ElementType.Text) return elem.data; |
+ if(type === ElementType.Comment) return "<!--" + elem.data + "-->"; |
+ if(type === ElementType.Directive) return "<" + elem.data + ">"; |
+ if(type === ElementType.CDATA) return "<!CDATA " + DomUtils.getInnerHTML(elem) + "]]>"; |
+ |
+ var ret = "<" + elem.name; |
+ if("attribs" in elem){ |
+ for(var attr in elem.attribs){ |
+ if(elem.attribs.hasOwnProperty(attr)){ |
+ ret += " " + attr; |
+ var value = elem.attribs[attr]; |
+ if(!value){ |
+ if( !(attr in booleanAttribs) ){ |
+ ret += '=""'; |
+ } |
+ } else { |
+ ret += '="' + value + '"'; |
+ } |
+ } |
+ } |
+ } |
+ |
+ if (elem.name in emptyTags && elem.children.length === 0) { |
+ return ret + " />"; |
+ } else { |
+ return ret + ">" + DomUtils.getInnerHTML(elem) + "</" + elem.name + ">"; |
+ } |
+}; |
+ |
+DomUtils.getText = function getText(elem){ |
+ if(Array.isArray(elem)) return elem.map(getText).join(""); |
+ if(isTag(elem) || elem.type === ElementType.CDATA) return getText(elem.children); |
+ if(elem.type === ElementType.Text) return elem.data; |
+ return ""; |
+}; |