aboutsummaryrefslogtreecommitdiff
path: root/node_modules/domutils
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2017-05-03 15:35:00 +0200
committerFlorian Dold <florian.dold@gmail.com>2017-05-03 15:35:00 +0200
commitde98e0b232509d5f40c135d540a70e415272ff85 (patch)
treea79222a5b58484ab3b80d18efcaaa7ccc4769b33 /node_modules/domutils
parente0c9d480a73fa629c1e4a47d3e721f1d2d345406 (diff)
downloadwallet-core-de98e0b232509d5f40c135d540a70e415272ff85.tar.xz
node_modules
Diffstat (limited to 'node_modules/domutils')
-rw-r--r--node_modules/domutils/LICENSE11
-rw-r--r--node_modules/domutils/index.js318
-rw-r--r--node_modules/domutils/package.json28
-rw-r--r--node_modules/domutils/readme.md1
-rw-r--r--node_modules/domutils/tests/00-runtests.js64
-rw-r--r--node_modules/domutils/tests/02-dom_utils.js15
-rw-r--r--node_modules/domutils/tests/DomUtils/01-by_id.js56
-rw-r--r--node_modules/domutils/tests/DomUtils/02-by_tagname.js23
-rw-r--r--node_modules/domutils/tests/DomUtils/03-by_type.js23
-rw-r--r--node_modules/domutils/tests/DomUtils/04-outer_html.js10
-rw-r--r--node_modules/domutils/tests/DomUtils/05-inner_html.js10
11 files changed, 559 insertions, 0 deletions
diff --git a/node_modules/domutils/LICENSE b/node_modules/domutils/LICENSE
new file mode 100644
index 000000000..c464f863e
--- /dev/null
+++ b/node_modules/domutils/LICENSE
@@ -0,0 +1,11 @@
+Copyright (c) Felix Böhm
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+THIS IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/node_modules/domutils/index.js b/node_modules/domutils/index.js
new file mode 100644
index 000000000..d8b2d2baa
--- /dev/null
+++ b/node_modules/domutils/index.js
@@ -0,0 +1,318 @@
+var ElementType = require("domelementtype"),
+ DomUtils = module.exports;
+
+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 type === "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; };
+ }
+}
+
+DomUtils.getElements = function(options, element, recurse, limit){
+ var funcs = [];
+ for(var key in options){
+ if(options.hasOwnProperty(key)){
+ if(key in Checks) funcs.push(Checks[key](options[key]));
+ else funcs.push(getAttribCheck(key, options[key]));
+ }
+ }
+
+ if(funcs.length === 0) return [];
+ if(funcs.length === 1) return filter(funcs[0], element, recurse, limit);
+ return filter(
+ function(elem){
+ return funcs.some(function(func){ return func(elem); });
+ },
+ 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){
+ if(elem.prev){
+ elem.prev.next = replacement;
+ replacement.prev = elem.prev;
+ }
+ if(elem.next){
+ elem.next.prev = replacement;
+ replacement.next = elem.next;
+ }
+ if(elem.parent){
+ var childs = elem.parent.children;
+ childs.splice(childs.lastIndexOf(elem), 1, replacement);
+ replacement.parent = elem.parent;
+ }
+};
+
+DomUtils.getInnerHTML = function(elem){
+ if(!elem.children) return "";
+
+ var childs = elem.children,
+ childNum = childs.length,
+ ret = "";
+
+ for(var i = 0; i < childNum; i++){
+ ret += DomUtils.getOuterHTML(childs[i]);
+ }
+
+ return ret;
+};
+
+//boolean attributes without a value (taken from MatthewMueller/cheerio)
+var booleanAttribs = {
+ __proto__: null,
+ async: true,
+ autofocus: true,
+ autoplay: true,
+ checked: true,
+ controls: true,
+ defer: true,
+ disabled: true,
+ hidden: true,
+ loop: true,
+ multiple: true,
+ open: true,
+ readonly: true,
+ required: true,
+ scoped: true,
+ selected: true,
+ "/": true //TODO when is this required?
+};
+
+var emptyTags = {
+ __proto__: null,
+ area: true,
+ base: true,
+ basefont: true,
+ br: true,
+ col: true,
+ frame: true,
+ hr: true,
+ img: true,
+ input: true,
+ isindex: true,
+ link: true,
+ meta: true,
+ param: true,
+ embed: true
+};
+
+DomUtils.getOuterHTML = function(elem){
+ var type = elem.type;
+
+ if(type === ElementType.Text) return elem.data;
+ if(type === ElementType.Comment) return "<!--" + elem.data + "-->";
+ if(type === ElementType.Directive) return "<" + elem.data + ">";
+ if(type === ElementType.CDATA) return "<!CDATA " + DomUtils.getInnerHTML(elem) + "]]>";
+
+ var ret = "<" + elem.name;
+ if("attribs" in elem){
+ for(var attr in elem.attribs){
+ if(elem.attribs.hasOwnProperty(attr)){
+ ret += " " + attr;
+ var value = elem.attribs[attr];
+ if(!value){
+ if( !(attr in booleanAttribs) ){
+ ret += '=""';
+ }
+ } else {
+ ret += '="' + value + '"';
+ }
+ }
+ }
+ }
+
+ if (elem.name in emptyTags && elem.children.length === 0) {
+ return ret + " />";
+ } else {
+ return ret + ">" + DomUtils.getInnerHTML(elem) + "</" + elem.name + ">";
+ }
+};
+
+DomUtils.getText = function getText(elem){
+ if(Array.isArray(elem)) return elem.map(getText).join("");
+ if(isTag(elem) || elem.type === ElementType.CDATA) return getText(elem.children);
+ if(elem.type === ElementType.Text) return elem.data;
+ return "";
+};
diff --git a/node_modules/domutils/package.json b/node_modules/domutils/package.json
new file mode 100644
index 000000000..cfc3a90db
--- /dev/null
+++ b/node_modules/domutils/package.json
@@ -0,0 +1,28 @@
+{
+ "name": "domutils",
+ "version": "1.1.6",
+ "description": "utilities for working with htmlparser2's dom",
+ "main": "index.js",
+ "directories": {
+ "test": "tests"
+ },
+ "scripts": {
+ "test": "node tests/00-runtests.js"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/FB55/domutils.git"
+ },
+ "keywords": [
+ "dom",
+ "htmlparser2"
+ ],
+ "dependencies": {
+ "domelementtype": "1"
+ },
+ "devDependencies": {
+ "htmlparser2": "2.3",
+ "domhandler": "2"
+ },
+ "author": "Felix Boehm <me@feedic.com>"
+}
diff --git a/node_modules/domutils/readme.md b/node_modules/domutils/readme.md
new file mode 100644
index 000000000..9ccdda608
--- /dev/null
+++ b/node_modules/domutils/readme.md
@@ -0,0 +1 @@
+utilities for working with htmlparser2's dom
diff --git a/node_modules/domutils/tests/00-runtests.js b/node_modules/domutils/tests/00-runtests.js
new file mode 100644
index 000000000..cf7a3b7f8
--- /dev/null
+++ b/node_modules/domutils/tests/00-runtests.js
@@ -0,0 +1,64 @@
+var fs = require("fs"),
+ assert = require("assert");
+
+var runCount = 0,
+ testCount = 0;
+
+function compare(expected, result){
+ if(typeof expected !== typeof result){
+ throw Error("types didn't match");
+ }
+ if(typeof expected !== "object" || expected === null){
+ if(expected !== result){
+ throw Error("result doesn't equal expected");
+ }
+ return;
+ }
+
+ for(var prop in expected){
+ if(!(prop in result)) throw Error("result didn't contain property " + prop);
+ compare(expected[prop], result[prop]);
+ }
+}
+
+function runTests(test){
+ //read files, load them, run them
+ fs.readdirSync(__dirname + test.dir
+ ).map(function(file){
+ if(file[0] === ".") return false;
+ if(file.substr(-5) === ".json") return JSON.parse(
+ fs.readFileSync(__dirname + test.dir + file)
+ );
+ return require(__dirname + test.dir + file);
+ }).forEach(function(file){
+ if(!file) return;
+ var second = false;
+
+ runCount++;
+
+ console.log("Testing:", file.name);
+
+ test.test(file, function(err, dom){
+ assert.ifError(err);
+ compare(file.expected, dom);
+
+ if(second){
+ runCount--;
+ testCount++;
+ }
+ else second = true;
+ });
+ });
+ console.log("->", test.dir.slice(1, -1), "started");
+}
+
+//run all tests
+[
+ "./02-dom_utils.js"
+].map(require).forEach(runTests);
+
+//log the results
+(function check(){
+ if(runCount !== 0) return process.nextTick(check);
+ console.log("Total tests:", testCount);
+}()); \ No newline at end of file
diff --git a/node_modules/domutils/tests/02-dom_utils.js b/node_modules/domutils/tests/02-dom_utils.js
new file mode 100644
index 000000000..9a28b891b
--- /dev/null
+++ b/node_modules/domutils/tests/02-dom_utils.js
@@ -0,0 +1,15 @@
+//generate a dom
+var handler = new (require("domhandler"))();
+
+(new (require("htmlparser2").Parser)(handler)).parseComplete(
+ Array(21).join("<?xml><tag1 id='asdf'> <script>text</script> <!-- comment --> <tag2> text </tag1>")
+);
+
+var dom = handler.dom;
+
+exports.dir = "/DomUtils/";
+
+exports.test = function(test, cb){
+ cb(null, test.getElements(dom));
+ cb(null, test.getByFunction(dom));
+}; \ No newline at end of file
diff --git a/node_modules/domutils/tests/DomUtils/01-by_id.js b/node_modules/domutils/tests/DomUtils/01-by_id.js
new file mode 100644
index 000000000..a5f02df24
--- /dev/null
+++ b/node_modules/domutils/tests/DomUtils/01-by_id.js
@@ -0,0 +1,56 @@
+var DomUtils = require("../..");
+
+exports.name = "Get element by id";
+exports.getElements = function(dom){
+ return DomUtils.getElements({id:"asdf"}, dom, true, 1)[0];
+};
+exports.getByFunction = function(dom){
+ return DomUtils.getElementById("asdf", dom, true);
+};
+exports.expected = {
+ "type": "tag",
+ "name": "tag1",
+ "attribs": {
+ "id": "asdf"
+ },
+ "children": [
+ {
+ "data": " ",
+ "type": "text"
+ },
+ {
+ "type": "script",
+ "name": "script",
+ "attribs": {},
+ "children": [
+ {
+ "data": "text",
+ "type": "text"
+ }
+ ]
+ },
+ {
+ "data": " ",
+ "type": "text"
+ },
+ {
+ "data": " comment ",
+ "type": "comment"
+ },
+ {
+ "data": " ",
+ "type": "text"
+ },
+ {
+ "type": "tag",
+ "name": "tag2",
+ "attribs": {},
+ "children": [
+ {
+ "data": " text ",
+ "type": "text"
+ }
+ ]
+ }
+ ]
+}; \ No newline at end of file
diff --git a/node_modules/domutils/tests/DomUtils/02-by_tagname.js b/node_modules/domutils/tests/DomUtils/02-by_tagname.js
new file mode 100644
index 000000000..125357c41
--- /dev/null
+++ b/node_modules/domutils/tests/DomUtils/02-by_tagname.js
@@ -0,0 +1,23 @@
+var DomUtils = require("../..");
+
+exports.name = "Get elements by tagName";
+exports.getElements = function(dom){
+ return DomUtils.getElements({tag_name:"tag2"}, dom, true);
+};
+exports.getByFunction = function(dom){
+ return DomUtils.getElementsByTagName("tag2", dom, true);
+};
+exports.expected = [];
+for(var i = 0; i < 20; i++) exports.expected.push(
+ {
+ "type": "tag",
+ "name": "tag2",
+ "attribs": {},
+ "children": [
+ {
+ "data": " text ",
+ "type": "text"
+ }
+ ]
+ }
+); \ No newline at end of file
diff --git a/node_modules/domutils/tests/DomUtils/03-by_type.js b/node_modules/domutils/tests/DomUtils/03-by_type.js
new file mode 100644
index 000000000..43bd66791
--- /dev/null
+++ b/node_modules/domutils/tests/DomUtils/03-by_type.js
@@ -0,0 +1,23 @@
+var DomUtils = require("../..");
+
+exports.name = "Get elements by type";
+exports.getElements = function(dom){
+ return DomUtils.getElements({tag_type:"script"}, dom, true);
+};
+exports.getByFunction = function(dom){
+ return DomUtils.getElementsByTagType("script", dom, true);
+};
+exports.expected = [];
+for(var i = 0; i < 20; i++) exports.expected.push(
+ {
+ "type": "script",
+ "name": "script",
+ "attribs": {},
+ "children": [
+ {
+ "data": "text",
+ "type": "text"
+ }
+ ]
+ }
+); \ No newline at end of file
diff --git a/node_modules/domutils/tests/DomUtils/04-outer_html.js b/node_modules/domutils/tests/DomUtils/04-outer_html.js
new file mode 100644
index 000000000..57aae971f
--- /dev/null
+++ b/node_modules/domutils/tests/DomUtils/04-outer_html.js
@@ -0,0 +1,10 @@
+var DomUtils = require("../..");
+
+exports.name = "Get outer HTML";
+exports.getElements = function(dom){
+ return '<tag1 id="asdf"> <script>text</script> <!-- comment --> <tag2> text </tag2></tag1>';
+};
+exports.getByFunction = function(dom){
+ return DomUtils.getOuterHTML(DomUtils.getElementById("asdf", dom, true));
+};
+exports.expected = '<tag1 id="asdf"> <script>text</script> <!-- comment --> <tag2> text </tag2></tag1>';
diff --git a/node_modules/domutils/tests/DomUtils/05-inner_html.js b/node_modules/domutils/tests/DomUtils/05-inner_html.js
new file mode 100644
index 000000000..36a266163
--- /dev/null
+++ b/node_modules/domutils/tests/DomUtils/05-inner_html.js
@@ -0,0 +1,10 @@
+var DomUtils = require("../..");
+
+exports.name = "Get inner HTML";
+exports.getElements = function(dom){
+ return ' <script>text</script> <!-- comment --> <tag2> text </tag2>';
+};
+exports.getByFunction = function(dom){
+ return DomUtils.getInnerHTML(DomUtils.getElementById("asdf", dom, true));
+};
+exports.expected = ' <script>text</script> <!-- comment --> <tag2> text </tag2>';