Index: tools/vulcanize/node_modules/vulcanize/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/index.js |
diff --git a/tools/vulcanize/node_modules/vulcanize/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/index.js b/tools/vulcanize/node_modules/vulcanize/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/index.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8cb976b35217799db0925c05b90971d4f16127ca |
--- /dev/null |
+++ b/tools/vulcanize/node_modules/vulcanize/node_modules/cheerio/node_modules/htmlparser2/node_modules/domhandler/index.js |
@@ -0,0 +1,161 @@ |
+var ElementType = require("domelementtype"); |
+ |
+function DomHandler(callback, options, elementCB){ |
+ if(typeof callback === "object"){ |
+ elementCB = options; |
+ options = callback; |
+ callback = null; |
+ } else if(typeof options === "function"){ |
+ elementCB = options; |
+ options = defaultOpts; |
+ } |
+ this._callback = callback; |
+ this._options = options || defaultOpts; |
+ this._elementCB = elementCB; |
+ this.dom = []; |
+ this._done = false; |
+ this._tagStack = []; |
+} |
+ |
+//default options |
+var defaultOpts = { |
+ ignoreWhitespace: false //Keep whitespace-only text nodes |
+}; |
+ |
+//Resets the handler back to starting state |
+DomHandler.prototype.onreset = function(){ |
+ DomHandler.call(this, this._callback, this._options, this._elementCB); |
+}; |
+ |
+//Signals the handler that parsing is done |
+DomHandler.prototype.onend = function(){ |
+ if(this._done) return; |
+ this._done = true; |
+ this._handleCallback(null); |
+}; |
+ |
+DomHandler.prototype._handleCallback = |
+DomHandler.prototype.onerror = function(error){ |
+ if(typeof this._callback === "function"){ |
+ this._callback(error, this.dom); |
+ } else { |
+ if(error) throw error; |
+ } |
+}; |
+ |
+DomHandler.prototype.onclosetag = function(name){ |
+ //if(this._tagStack.pop().name !== name) this._handleCallback(Error("Tagname didn't match!")); |
+ var elem = this._tagStack.pop(); |
+ if(this._elementCB) this._elementCB(elem); |
+}; |
+ |
+DomHandler.prototype._addDomElement = function(element){ |
+ var lastTag = this._tagStack[this._tagStack.length - 1]; |
+ |
+ if(lastTag){ |
+ lastTag.children.push(element); |
+ } else { //There aren't parent elements |
+ this.dom.push(element); |
+ } |
+}; |
+ |
+DomHandler.prototype.onopentag = function(name, attribs){ |
+ var lastTag = this._tagStack[this._tagStack.length - 1]; |
+ |
+ var element = { |
+ type: name === "script" ? ElementType.Script : name === "style" ? ElementType.Style : ElementType.Tag, |
+ name: name, |
+ attribs: attribs, |
+ children: [], |
+ prev: null, |
+ next: null, |
+ parent: lastTag || null |
+ }; |
+ |
+ if(lastTag){ |
+ var idx = lastTag.children.length; |
+ while(idx > 0){ |
+ if(ElementType.isTag(lastTag.children[--idx])){ |
+ element.prev = lastTag.children[idx]; |
+ lastTag.children[idx].next = element; |
+ break; |
+ } |
+ } |
+ lastTag.children.push(element); |
+ } else { |
+ this.dom.push(element); |
+ } |
+ |
+ this._tagStack.push(element); |
+}; |
+ |
+DomHandler.prototype.ontext = function(data){ |
+ if(this._options.ignoreWhitespace && data.trim() === "") return; |
+ |
+ if(this._tagStack.length){ |
+ var lastTag; |
+ |
+ if( |
+ (lastTag = this._tagStack[this._tagStack.length - 1]) && |
+ (lastTag = lastTag.children[lastTag.children.length - 1]) && |
+ lastTag.type === ElementType.Text |
+ ){ |
+ lastTag.data += data; |
+ return; |
+ } |
+ } else { |
+ if(this.dom.length && this.dom[this.dom.length-1].type === ElementType.Text){ |
+ this.dom[this.dom.length-1].data += data; |
+ return; |
+ } |
+ } |
+ |
+ this._addDomElement({ |
+ data: data, |
+ type: ElementType.Text |
+ }); |
+}; |
+ |
+DomHandler.prototype.oncomment = function(data){ |
+ var lastTag = this._tagStack[this._tagStack.length - 1]; |
+ |
+ if(lastTag && lastTag.type === ElementType.Comment){ |
+ lastTag.data += data; |
+ return; |
+ } |
+ |
+ var element = { |
+ data: data, |
+ type: ElementType.Comment |
+ }; |
+ |
+ this._addDomElement(element); |
+ this._tagStack.push(element); |
+}; |
+ |
+DomHandler.prototype.oncdatastart = function(){ |
+ var element = { |
+ children: [{ |
+ data: "", |
+ type: ElementType.Text |
+ }], |
+ type: ElementType.CDATA |
+ }; |
+ |
+ this._addDomElement(element); |
+ this._tagStack.push(element); |
+}; |
+ |
+DomHandler.prototype.oncommentend = DomHandler.prototype.oncdataend = function(){ |
+ this._tagStack.pop(); |
+}; |
+ |
+DomHandler.prototype.onprocessinginstruction = function(name, data){ |
+ this._addDomElement({ |
+ name: name, |
+ data: data, |
+ type: ElementType.Directive |
+ }); |
+}; |
+ |
+module.exports = DomHandler; |