diff options
author | Florian Dold <florian.dold@gmail.com> | 2017-05-03 15:35:00 +0200 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2017-05-03 15:35:00 +0200 |
commit | de98e0b232509d5f40c135d540a70e415272ff85 (patch) | |
tree | a79222a5b58484ab3b80d18efcaaa7ccc4769b33 /node_modules/dom-converter/scripts/js/lib/dummer.js | |
parent | e0c9d480a73fa629c1e4a47d3e721f1d2d345406 (diff) | |
download | wallet-core-de98e0b232509d5f40c135d540a70e415272ff85.tar.xz |
node_modules
Diffstat (limited to 'node_modules/dom-converter/scripts/js/lib/dummer.js')
-rw-r--r-- | node_modules/dom-converter/scripts/js/lib/dummer.js | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/node_modules/dom-converter/scripts/js/lib/dummer.js b/node_modules/dom-converter/scripts/js/lib/dummer.js new file mode 100644 index 000000000..11fc31280 --- /dev/null +++ b/node_modules/dom-converter/scripts/js/lib/dummer.js @@ -0,0 +1,123 @@ +var dummer, object, sanitizer, + __hasProp = {}.hasOwnProperty; + +object = require('utila').object; + +sanitizer = require('./sanitizer'); + +module.exports = dummer = { + toDom: function(o) { + if (!Array.isArray(o)) { + if (!object.isBareObject(o)) { + throw Error("toDom() only accepts arrays and bare objects as input"); + } + } + o = sanitizer.sanitize(o); + return dummer._children(o); + }, + _children: function(a, parent) { + var children, node, prev, v, _i, _len; + if (parent == null) { + parent = null; + } + children = []; + prev = null; + for (_i = 0, _len = a.length; _i < _len; _i++) { + v = a[_i]; + if (typeof v === 'string') { + node = dummer._textNode(v); + } else { + node = dummer._objectToDom(v, parent); + node.prev = null; + node.next = null; + node.parent = parent; + if (prev != null) { + node.prev = prev; + prev.next = node; + } + prev = node; + } + children.push(node); + } + return children; + }, + _objectToDom: function(o) { + var attribs, children, i, k, key, name, node, v, val, _ref; + i = 0; + for (k in o) { + if (!__hasProp.call(o, k)) continue; + v = o[k]; + if (i > 0) { + throw Error("_objectToDom() only accepts an object with one key/value"); + } + key = k; + val = v; + i++; + } + node = {}; + if (typeof key !== 'string') { + throw Error("_objectToDom()'s key must be a string of tag name and classes"); + } + if (typeof val === 'string') { + children = [dummer._textNode(val)]; + } else if (Array.isArray(val)) { + children = dummer._children(val, node); + } else { + inspect(o); + throw Error("_objectToDom()'s key's value must only be a string or an array"); + } + node.type = 'tag'; + _ref = dummer._parseTag(key), name = _ref.name, attribs = _ref.attribs; + node.name = name; + node.attribs = attribs; + node.children = children; + return node; + }, + _textNode: function(s) { + return { + type: 'text', + data: s + }; + }, + _nameRx: /^[a-zA-Z\-\_]{1}[a-zA-Z0-9\-\_]*$/, + _parseTag: function(k) { + var attribs, classes, cls, id, m, name, parts; + if (!k.match(/^[a-zA-Z0-9\#\-\_\.\[\]\"\'\=\,\s]+$/) || k.match(/^[0-9]+/)) { + throw Error("cannot parse tag `" + k + "`"); + } + attribs = {}; + parts = { + name: '', + attribs: attribs + }; + if (m = k.match(/^([^\.#]+)/)) { + name = m[1]; + if (!name.match(dummer._nameRx)) { + throw Error("tag name `" + name + "` is not valid"); + } + parts.name = name; + k = k.substr(name.length, k.length); + } + if (m = k.match(/^#([a-zA-Z0-9\-]+)/)) { + id = m[1]; + if (!id.match(dummer._nameRx)) { + throw Error("tag id `" + id + "` is not valid"); + } + attribs.id = id; + k = k.substr(id.length + 1, k.length); + } + classes = []; + while (m = k.match(/\.([a-zA-Z0-9\-\_]+)/)) { + cls = m[1]; + if (!cls.match(dummer._nameRx)) { + throw Error("tag class `" + cls + "` is not valid"); + } + classes.push(cls); + k = k.replace('.' + cls, ''); + } + if (classes.length) { + attribs["class"] = classes.join(" "); + } + return parts; + } +}; |