Socket
Socket
Sign inDemoInstall

domutils

Package Overview
Dependencies
1
Maintainers
1
Versions
40
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 1.2.2 to 1.3.0

lib/helpers.js

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
}
}
}
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc