import NodeType from './nodes/type';
|
function isTag(node) {
|
return node && node.nodeType === NodeType.ELEMENT_NODE;
|
}
|
function getAttributeValue(elem, name) {
|
return isTag(elem) ? elem.getAttribute(name) : undefined;
|
}
|
function getName(elem) {
|
return ((elem && elem.rawTagName) || '').toLowerCase();
|
}
|
function getChildren(node) {
|
return node && node.childNodes;
|
}
|
function getParent(node) {
|
return node ? node.parentNode : null;
|
}
|
function getText(node) {
|
return node.text;
|
}
|
function removeSubsets(nodes) {
|
let idx = nodes.length;
|
let node;
|
let ancestor;
|
let replace;
|
// Check if each node (or one of its ancestors) is already contained in the
|
// array.
|
while (--idx > -1) {
|
node = ancestor = nodes[idx];
|
// Temporarily remove the node under consideration
|
nodes[idx] = null;
|
replace = true;
|
while (ancestor) {
|
if (nodes.indexOf(ancestor) > -1) {
|
replace = false;
|
nodes.splice(idx, 1);
|
break;
|
}
|
ancestor = getParent(ancestor);
|
}
|
// If the node has been found to be unique, re-insert it.
|
if (replace) {
|
nodes[idx] = node;
|
}
|
}
|
return nodes;
|
}
|
function existsOne(test, elems) {
|
return elems.some((elem) => {
|
return isTag(elem) ? test(elem) || existsOne(test, getChildren(elem)) : false;
|
});
|
}
|
function getSiblings(node) {
|
const parent = getParent(node);
|
return parent && getChildren(parent);
|
}
|
function hasAttrib(elem, name) {
|
return getAttributeValue(elem, name) !== undefined;
|
}
|
function findOne(test, elems) {
|
let elem = null;
|
for (let i = 0, l = elems.length; i < l && !elem; i++) {
|
const el = elems[i];
|
if (test(el)) {
|
elem = el;
|
}
|
else {
|
const childs = getChildren(el);
|
if (childs && childs.length > 0) {
|
elem = findOne(test, childs);
|
}
|
}
|
}
|
return elem;
|
}
|
function findAll(test, nodes) {
|
let result = [];
|
for (let i = 0, j = nodes.length; i < j; i++) {
|
if (!isTag(nodes[i]))
|
continue;
|
if (test(nodes[i]))
|
result.push(nodes[i]);
|
const childs = getChildren(nodes[i]);
|
if (childs)
|
result = result.concat(findAll(test, childs));
|
}
|
return result;
|
}
|
export default {
|
isTag,
|
getAttributeValue,
|
getName,
|
getChildren,
|
getParent,
|
getText,
|
removeSubsets,
|
existsOne,
|
getSiblings,
|
hasAttrib,
|
findOne,
|
findAll
|
};
|