domutils
Advanced tools
Comparing version 1.2.2 to 1.3.0
280
index.js
@@ -1,278 +0,10 @@ | ||
var ElementType = require("domelementtype"), | ||
DomUtils = module.exports; | ||
var DomUtils = module.exports; | ||
[require("./stringify.js")].forEach(function(ext){ | ||
[ | ||
"stringify", "traversal", "manipulation", "querying", "legacy", "helpers" | ||
].forEach(function(name){ | ||
var ext = require("./lib/" + name); | ||
Object.keys(ext).forEach(function(key){ | ||
DomUtils[key] = ext[key]; | ||
DomUtils[key] = ext[key].bind(DomUtils); | ||
}); | ||
}); | ||
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 data === "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; }; | ||
} | ||
} | ||
function combineFuncs(a, b){ | ||
return function(elem){ | ||
return a(elem) || b(elem); | ||
}; | ||
} | ||
DomUtils.getElements = function(options, element, recurse, limit){ | ||
var funcs = Object.keys(options).map(function(key){ | ||
var value = options[key]; | ||
return key in Checks ? Checks[key](value) : getAttribCheck(key, value); | ||
}); | ||
return funcs.length === 0 ? [] : filter( | ||
funcs.reduce(combineFuncs), | ||
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){ | ||
var prev = replacement.prev = elem.prev; | ||
if(prev){ | ||
prev.next = replacement; | ||
} | ||
var next = replacement.next = elem.next; | ||
if(next){ | ||
next.prev = replacement; | ||
} | ||
var parent = replacement.parent = elem.parent; | ||
if(parent){ | ||
var childs = parent.children; | ||
childs[childs.lastIndexOf(elem)] = replacement; | ||
} | ||
}; | ||
DomUtils.appendChild = function(elem, child){ | ||
child.parent = elem; | ||
if(elem.children.push(child) !== 1){ | ||
var sibling = elem.children[elem.children.length - 2]; | ||
sibling.next = child; | ||
child.prev = sibling; | ||
child.next = null; | ||
} | ||
}; | ||
DomUtils.append = function(elem, next){ | ||
var parent = elem.parent, | ||
currNext = elem.next; | ||
next.next = currNext; | ||
next.prev = elem; | ||
elem.next = next; | ||
if(currNext){ | ||
currNext.prev = next; | ||
if(parent){ | ||
var childs = parent.children; | ||
childs.splice(childs.lastIndexOf(currNext), 0, next); | ||
} | ||
} else if(parent){ | ||
parent.children.push(next); | ||
} | ||
}; | ||
DomUtils.prepend = function(elem, prev){ | ||
var parent = elem.parent; | ||
if(parent){ | ||
var childs = parent.children; | ||
childs.splice(childs.lastIndexOf(elem), 0, prev); | ||
} | ||
if(elem.prev){ | ||
elem.prev.next = prev; | ||
} | ||
prev.prev = elem.prev; | ||
prev.next = elem; | ||
elem.prev = prev; | ||
}; |
{ | ||
"name": "domutils", | ||
"version": "1.2.2", | ||
"version": "1.3.0", | ||
"description": "utilities for working with htmlparser2's dom", | ||
@@ -10,3 +10,3 @@ "main": "index.js", | ||
"scripts": { | ||
"test": "node tests/00-runtests.js" | ||
"test": "mocha test/tests/**.js && jshint index.js test/**/*.js lib/*.js" | ||
}, | ||
@@ -25,6 +25,22 @@ "repository": { | ||
"devDependencies": { | ||
"htmlparser2": "2.3", | ||
"domhandler": "2" | ||
"htmlparser2": "~3.3.0", | ||
"domhandler": "2", | ||
"jshint": "~2.3.0", | ||
"mocha": "~1.15.1" | ||
}, | ||
"author": "Felix Boehm <me@feedic.com>" | ||
"author": "Felix Boehm <me@feedic.com>", | ||
"jshintConfig": { | ||
"proto": true, | ||
"unused": true, | ||
"eqnull": true, | ||
"undef": true, | ||
"quotmark": "double", | ||
"eqeqeq": true, | ||
"trailing": true, | ||
"node": true, | ||
"globals": { | ||
"describe": true, | ||
"it": true | ||
} | ||
} | ||
} |
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
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
15785
14
1
4
489
1