UNPKG

2.99 kBJavaScriptView Raw
1'use strict';
2/**
3 * dom module
4 * @module dom
5 * @see module:index
6 */
7const lang = require('zero-lang');
8
9function noop() {
10}
11
12const domUtils = {
13 attributesAsObject: (doc) => {
14 const result = {};
15 const attributes = doc.attributes || [];
16 lang.each(attributes, (attr) => {
17 result[attr.name] = attr.value;
18 });
19 return result;
20 },
21
22 findChildNode: (doc, query) => {
23 query = query || {};
24 if (!doc) {
25 return null;
26 }
27 return domUtils.findChildNodes(doc, query)[0];
28 },
29
30 findChildNodes: (doc, query) => {
31 const FILTER_QUERY_PROPS = [
32 'localName',
33 'namespaceURI',
34 'nodeName',
35 'nodeType',
36 'tagName',
37 ];
38 let resultNodes = doc.childNodes;
39 if (!doc) {
40 return [];
41 }
42 lang.each(FILTER_QUERY_PROPS, (prop) => {
43 if (query[prop]) {
44 resultNodes = lang.filter(doc.childNodes, (node) => (node[prop] === query[prop]));
45 }
46 });
47 const attrs = query.attributes || {};
48 return lang.filter(resultNodes, (node) => (
49 node && lang.every(lang.keys(attrs), (key) => (node.getAttribute(key) === attrs[key]))
50 ));
51 },
52
53 findAllNodes: (doc, query) => {
54 let nodes = [];
55
56 function findAllChildNodes(parentDoc) {
57 nodes = nodes.concat(domUtils.findChildNodes(parentDoc, query));
58 lang.each(parentDoc.childNodes, (node) => {
59 findAllChildNodes(node);
60 });
61 }
62
63 findAllChildNodes(doc);
64 return nodes;
65 },
66
67 createChildNode: (doc, query) => {
68 // FIXME: support more NodeTypes
69 if (!doc) {
70 return null;
71 }
72 let ownerDoc = doc;
73 const tagName = query.tagName || 'child';
74 const attrs = query.attributes || {};
75 // create with ownerDocument
76 if (!doc.createElement) {
77 ownerDoc = doc.ownerDocument;
78 }
79 const resultNode = ownerDoc.createElement(tagName);
80 lang.forIn(attrs, (value, key) => {
81 resultNode.setAttribute(key, value);
82 });
83 // TODO FIXME
84 // if (doc.nodeType === 9 /* doc.DOCUMENT_NODE */ && doc.childNodes.length > 1) {
85 // }
86 doc.appendChild(resultNode);
87 return resultNode;
88 },
89
90 findOrCreateChildNode: (doc, query) => {
91 if (!doc) {
92 return null;
93 }
94 let resultNode = domUtils.findChildNode(doc, query);
95 if (!resultNode) {
96 resultNode = domUtils.createChildNode(doc, query);
97 }
98 return resultNode;
99 },
100
101 eachChildNode: (doc, query, callback) => {
102 callback = callback || noop;
103 lang.each(domUtils.findChildNodes(doc, query), (node) => {
104 callback(node);
105 });
106 },
107
108 eachNode: (doc, query, callback) => {
109 callback = callback || noop;
110 lang.each(domUtils.findAllNodes(doc, query), (node) => {
111 callback(node);
112 });
113 },
114
115 removeChildNode: (doc, query) => {
116 const resultNode = domUtils.findChildNode(doc, query);
117 if (resultNode) {
118 doc.removeChild(resultNode);
119 }
120 return resultNode;
121 },
122};
123
124// alias
125domUtils.findNodes = domUtils.findAllNodes;
126
127module.exports = domUtils;