htmlparser2
Advanced tools
Comparing version 2.2.4 to 2.2.5
@@ -6,159 +6,135 @@ var ElementType = require("./ElementType.js"), | ||
function filterArray(test, arr, recurse, limit){ | ||
var result = [], childs; | ||
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; | ||
} | ||
for(var i = 0, j = arr.length; i < j; i++){ | ||
if(test(arr[i])){ | ||
result.push(arr[i]); | ||
if(--limit <= 0) break; | ||
} | ||
childs = arr[i].children; | ||
if(recurse && childs){ | ||
childs = filterArray(test, childs, recurse, limit); | ||
arrayPush.apply(result, childs); | ||
limit -= childs.length; | ||
if(limit <= 0) break; | ||
} | ||
} | ||
childs = arr[i].children; | ||
if(recurse && childs){ | ||
childs = filterArray(test, childs, recurse, limit); | ||
arrayPush.apply(result, childs); | ||
limit -= childs.length; | ||
if(limit <= 0) break; | ||
} | ||
} | ||
return result; | ||
return result; | ||
} | ||
function filter(test, element, recurse, limit){ | ||
if(recurse !== false) recurse = true; | ||
if(isNaN(limit)) limit = Infinity; | ||
if(!Array.isArray(element)) element = [element]; | ||
if(recurse !== false) recurse = true; | ||
if(isNaN(limit)) limit = Infinity; | ||
if(!Array.isArray(element)) element = [element]; | ||
return filterArray(test, element, recurse, limit); | ||
return filterArray(test, element, recurse, limit); | ||
} | ||
DomUtils.testElement = function(options, element){ | ||
var type = element.type, | ||
keys = Object.keys(options), | ||
len = keys.length; | ||
var type = element.type; | ||
for(var key in options){ | ||
if(!options.hasOwnProperty(key)); | ||
else if(key === "tag_name"){ | ||
if(type !== ElementType.Tag && type !== ElementType.Script && type !== ElementType.Style) return false; | ||
if(!options.tag_name(element.name)) return false; | ||
} else if(key === "tag_type"){ | ||
if(!options.tag_type(type)) return false; | ||
} else if(key === "tag_contains"){ | ||
if(type !== ElementType.Text && type !== ElementType.Comment && type !== ElementType.Directive) return false; | ||
if(!options.tag_contains(element.data)) return false; | ||
} else if(!element.attribs || !options[key](element.attribs[key])) return false; | ||
} | ||
for(var i = 0; i < len; i++){ | ||
var key = keys[i]; | ||
return true; | ||
}; | ||
switch(key){ | ||
case "tag_name": | ||
if(type !== ElementType.Tag && type !== ElementType.Script && type !== ElementType.Style) return false; | ||
if(!options.tag_name(element.name)) return false; | ||
break; | ||
case "tag_type": | ||
if(!options.tag_type(type)) return false; | ||
break; | ||
case "tag_contains": | ||
if(type !== ElementType.Text && type !== ElementType.Comment && type !== ElementType.Directive) return false; | ||
if(!options.tag_contains(element.data)) return false; | ||
break; | ||
default: | ||
if(!element.attribs || !options[key](element.attribs[key])) return false; | ||
break; | ||
} | ||
} | ||
return true; | ||
function getEqualityFunc(check){ | ||
return (function(val){ return val === check; }); | ||
} | ||
DomUtils.getElements = function(options, element, recurse, limit){ | ||
var keys = Object.keys(options), | ||
len = keys.length; | ||
for(var key in options){ | ||
if(options.hasOwnProperty(key) && typeof options[key] !== "function"){ | ||
options[key] = getEqualityFunc(options[key]); | ||
} | ||
} | ||
for(var i = 0; i < len; i++){ | ||
var key = keys[i]; | ||
return filter(function(elem){ return DomUtils.testElement(options, elem); }, element, recurse, limit); | ||
}; | ||
if(typeof options[key] !== "function"){ | ||
var checker = options[key]; | ||
options[key] = function(val){ return val === checker }; | ||
} | ||
} | ||
return filter(this.testElement.bind(null, options), element, recurse, limit); | ||
} | ||
DomUtils.getElementById = function(id, element, recurse){ | ||
var result; | ||
var result; | ||
if(typeof id === "function"){ | ||
result = filter(function(elem){ return elem.attribs && id(elem.attribs) }, element, recurse, 1); | ||
}else{ | ||
result = filter(function(elem){ return elem.attribs && elem.attribs.id === id }, element, recurse, 1); | ||
} | ||
if(typeof id === "function"){ | ||
result = filter(function(elem){ return elem.attribs && id(elem.attribs); }, element, recurse, 1); | ||
} else { | ||
result = filter(function(elem){ return elem.attribs && elem.attribs.id === id; }, element, recurse, 1); | ||
} | ||
return result.length ? result[0] : null; | ||
} | ||
return result.length ? result[0] : null; | ||
}; | ||
DomUtils.getElementsByTagName = function(name, element, recurse, limit){ | ||
if(typeof name === "function") return filter(function(elem){ | ||
var type = elem.type; | ||
if(type !== ElementType.Tag && type !== ElementType.Script && type !== ElementType.Style) | ||
return false; | ||
return name(elem.name); | ||
}, element, recurse, limit); | ||
if(typeof name === "function"){ | ||
return filter(function(elem){ | ||
var type = elem.type; | ||
if(type !== ElementType.Tag && type !== ElementType.Script && type !== ElementType.Style) | ||
return false; | ||
return name(elem.name); | ||
}, element, recurse, limit); | ||
} | ||
return filter(function(elem){ | ||
var type = elem.type; | ||
if(type !== ElementType.Tag && type !== ElementType.Script && type !== ElementType.Style) | ||
return false; | ||
return elem.name === name; | ||
}, element, recurse, limit); | ||
} | ||
return filter(function(elem){ | ||
var type = elem.type; | ||
if(type !== ElementType.Tag && type !== ElementType.Script && type !== ElementType.Style) | ||
return false; | ||
return elem.name === name; | ||
}, element, recurse, limit); | ||
}; | ||
DomUtils.getElementsByTagType = function(type, element, recurse, limit){ | ||
if(typeof type === "function") | ||
return filter(function(elem){ return type(elem.type) }, element, recurse, limit); | ||
else | ||
return filter(function(elem){ return elem.type === type }, element, recurse, limit); | ||
} | ||
if(typeof type === "function"){ | ||
return filter(function(elem){ return type(elem.type); }, element, recurse, limit); | ||
} else { | ||
return filter(function(elem){ return elem.type === type; }, element, recurse, limit); | ||
} | ||
}; | ||
DomUtils.getInnerHTML = function(elem){ | ||
if(!elem.children) return ""; | ||
if(!elem.children) return ""; | ||
var childs = elem.children, | ||
childNum = childs.length, | ||
ret = ""; | ||
var childs = elem.children, | ||
childNum = childs.length, | ||
ret = ""; | ||
for(var i = 0; i < childNum; i++){ | ||
ret += this.getOuterHTML(childs[i]); | ||
} | ||
for(var i = 0; i < childNum; i++){ | ||
ret += this.getOuterHTML(childs[i]); | ||
} | ||
return ret; | ||
} | ||
return ret; | ||
}; | ||
DomUtils.getOuterHTML = function(elem){ | ||
var type = elem.type, | ||
name = elem.name; | ||
var type = elem.type, | ||
name = elem.name; | ||
if(type === ElementType.Text) return elem.data; | ||
if(type === ElementType.Comment) return "<!--" + elem.data + "-->"; | ||
if(type === ElementType.Text) return elem.data; | ||
if(type === ElementType.Comment) return "<!--" + elem.data + "-->"; | ||
var attrStr = ""; | ||
if(elem.attribs){ | ||
var attrs = Object.keys(elem.attribs), | ||
len = attrs.length; | ||
var ret = "<" + name; | ||
if(elem.hasOwnProperty("attribs")){ | ||
for(var attr in elem.attribs){ | ||
if(elem.attribs.hasOwnProperty(attr)){ | ||
ret += " " + attr + "=\"" + elem.attribs[attr] + "\""; | ||
} | ||
} | ||
} | ||
for(var i = 0; i < len; i++){ | ||
var attr = attrs[i], | ||
val = elem.attribs[attr]; | ||
ret += ">"; | ||
attrStr += " " + attr + "=\"" + val + "\""; | ||
if(type === ElementType.Directive) return ret; | ||
/* Is this required? Method forgets quotes | ||
if(/^[^\s"\'\`\=\<\>]+$/.test(val)) | ||
attrStr += val; | ||
else if(val.indeOf("\"") !== -1) | ||
attrStr += "'" + val + "'"; | ||
else | ||
attrStr += "\"" + val + "\""; | ||
*/ | ||
} | ||
} | ||
var ret = "<" + name + attrStr + ">"; | ||
if(type === ElementType.Directive) return ret; | ||
ret += this.getInnerHTML(elem) + "</" + name + ">" | ||
return ret; | ||
} | ||
return ret + this.getInnerHTML(elem) + "</" + name + ">"; | ||
}; |
@@ -109,7 +109,7 @@ var ElementType = require("./ElementType.js"); | ||
var SpecialTags = {}; | ||
//SpecialTags[ElementType.Tag] = 0; | ||
SpecialTags[ElementType.Style] = 1; //2^0 | ||
SpecialTags[ElementType.Script] = 2; //2^1 | ||
SpecialTags[ElementType.Comment] = 4; //2^2 | ||
SpecialTags[ElementType.CDATA] = 8; //2^3 | ||
//SpecialTags[ElementType.Tag] = 0x0; | ||
SpecialTags[ElementType.Style] = 0x1; //2^0 | ||
SpecialTags[ElementType.Script] = 0x2; //2^1 | ||
SpecialTags[ElementType.Comment] = 0x4; //2^2 | ||
SpecialTags[ElementType.CDATA] = 0x8; //2^3 | ||
@@ -167,5 +167,5 @@ var TagValues = { | ||
//if it's a closing tag, remove the flag | ||
if(this._contentFlags >= TagValues[elementData]){ | ||
if(this._contentFlags & TagValues[elementData]){ | ||
//remove the flag | ||
this._contentFlags -= TagValues[elementData]; | ||
this._contentFlags ^= TagValues[elementData]; | ||
} | ||
@@ -182,7 +182,7 @@ else { | ||
//This tag is a comment | ||
this._contentFlags += SpecialTags[ElementType.Comment]; | ||
this._contentFlags |= SpecialTags[ElementType.Comment]; | ||
this._writeComment(rawData.substr(3)); | ||
} | ||
else if(elementData.substr(1, 7) === "[CDATA["){ | ||
this._contentFlags += SpecialTags[ElementType.CDATA]; | ||
this._contentFlags |= SpecialTags[ElementType.CDATA]; | ||
if(this._cbs.oncdatastart) this._cbs.oncdatastart(); | ||
@@ -231,3 +231,3 @@ this._writeCDATA(elementData.substr(8)); | ||
} | ||
this._contentFlags -= SpecialTags[ElementType.CDATA]; | ||
this._contentFlags ^= SpecialTags[ElementType.CDATA]; | ||
if(this._cbs.oncdataend) this._cbs.oncdataend(); | ||
@@ -241,3 +241,3 @@ } | ||
//remove the written flag (also removes the comment flag) | ||
this._contentFlags -= SpecialTags[ElementType.Comment]; | ||
this._contentFlags ^= SpecialTags[ElementType.Comment]; | ||
this._wroteSpecial = false; | ||
@@ -326,3 +326,3 @@ if(this._cbs.oncomment) this._cbs.oncomment(rawData.slice(0, -2)); | ||
if(type !== ElementType.Tag){ | ||
this._contentFlags += SpecialTags[type]; | ||
this._contentFlags |= SpecialTags[type]; | ||
this._wroteSpecial = false; | ||
@@ -329,0 +329,0 @@ } |
@@ -8,11 +8,13 @@ var ProxyHandler = function(cbs){ | ||
Object.keys(require("./").EVENTS).forEach(function(name){ | ||
ProxyHandler.prototype.__defineGetter__(name, function(){ | ||
return this._cbs[name]; | ||
name = "on" + name; | ||
Object.defineProperty(ProxyHandler.prototype, name, { | ||
enumerable:true, configurable:true, | ||
get: function(){ return this._cbs[name]; }, | ||
set: function(value){ | ||
//allow functions to be overwritten | ||
Object.defineProperty(this, name, {value: value}); | ||
} | ||
}); | ||
ProxyHandler.prototype.__defineSetter__(name, function(value){ | ||
//allow functions to be overwritten | ||
Object.defineProperty(this, name, {value: value}); | ||
}); | ||
}); | ||
module.exports = ProxyHandler; |
{ | ||
"name": "htmlparser2", | ||
"description": "Performance-optimized forgiving HTML/XML/RSS parser", | ||
"version": "2.2.4", | ||
"version": "2.2.5", | ||
"author": "Felix Boehm <me@feedic.com>", | ||
@@ -6,0 +6,0 @@ "keywords": ["html", "parser", "streams", "xml", "dom", "rss", "feed", "atom"], |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
19
79707
3089