From de98e0b232509d5f40c135d540a70e415272ff85 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 3 May 2017 15:35:00 +0200 Subject: node_modules --- .../scripts/coffee/lib/domConverter.coffee | 32 +++++ .../scripts/coffee/lib/domToMarkup.coffee | 0 .../scripts/coffee/lib/objectToSaneObject.coffee | 80 +++++++++++ .../scripts/coffee/lib/saneObjectToDom.coffee | 148 +++++++++++++++++++++ 4 files changed, 260 insertions(+) create mode 100644 node_modules/dom-converter/scripts/coffee/lib/domConverter.coffee create mode 100644 node_modules/dom-converter/scripts/coffee/lib/domToMarkup.coffee create mode 100644 node_modules/dom-converter/scripts/coffee/lib/objectToSaneObject.coffee create mode 100644 node_modules/dom-converter/scripts/coffee/lib/saneObjectToDom.coffee (limited to 'node_modules/dom-converter/scripts/coffee/lib') diff --git a/node_modules/dom-converter/scripts/coffee/lib/domConverter.coffee b/node_modules/dom-converter/scripts/coffee/lib/domConverter.coffee new file mode 100644 index 000000000..d7dce7303 --- /dev/null +++ b/node_modules/dom-converter/scripts/coffee/lib/domConverter.coffee @@ -0,0 +1,32 @@ +objectToSaneObject = require './objectToSaneObject' +saneObjectToDom = require './saneObjectToDom' +domToMarkup = require './domToMarkup' +{object} = require 'utila' + +module.exports = self = + + objectToDom: (o) -> + + o = self._object2SaneObject o + + saneObjectToDom.convert o + + object2markup: (o) -> + + dom = self.toDom o + + domToMarkup.convert dom + + domToMarkup: (dom) -> + + domToMarkup.convert dom + + _object2SaneObject: (o) -> + + unless Array.isArray o + + unless object.isBareObject o + + throw Error "toDom() only accepts arrays and bare objects as input" + + objectToSaneObject.sanitize o \ No newline at end of file diff --git a/node_modules/dom-converter/scripts/coffee/lib/domToMarkup.coffee b/node_modules/dom-converter/scripts/coffee/lib/domToMarkup.coffee new file mode 100644 index 000000000..e69de29bb diff --git a/node_modules/dom-converter/scripts/coffee/lib/objectToSaneObject.coffee b/node_modules/dom-converter/scripts/coffee/lib/objectToSaneObject.coffee new file mode 100644 index 000000000..74f114aa1 --- /dev/null +++ b/node_modules/dom-converter/scripts/coffee/lib/objectToSaneObject.coffee @@ -0,0 +1,80 @@ +{object} = require 'utila' + +module.exports = self = + + sanitize: (val) -> + + self._toChildren val + + _toChildren: (val) -> + + if object.isBareObject val + + return self._objectToChildren val + + else if Array.isArray val + + return self._arrayToChildren val + + else if val is null or typeof val is 'undefined' + + return [] + + else if typeof val in ['string', 'number'] + + return [String val] + + else + + throw Error "not a valid child node: `#{val}" + + _objectToChildren: (o) -> + + a = [] + + for own key, val of o + + cur = {} + + cur[key] = self.sanitize val + + a.push cur + + a + + _arrayToChildren: (a) -> + + ret = [] + + for v in a + + ret.push self._toNode v + + ret + + _toNode: (o) -> + + if typeof o in ['string', 'number'] + + return String o + + else if object.isBareObject o + + keys = Object.keys(o) + + if keys.length isnt 1 + + throw Error "a node must only have one key as tag name" + + key = keys[0] + + obj = {} + + obj[key] = self._toChildren o[key] + + return obj + + else + + throw Error "not a valid node: `#{o}`" + diff --git a/node_modules/dom-converter/scripts/coffee/lib/saneObjectToDom.coffee b/node_modules/dom-converter/scripts/coffee/lib/saneObjectToDom.coffee new file mode 100644 index 000000000..58519b9c2 --- /dev/null +++ b/node_modules/dom-converter/scripts/coffee/lib/saneObjectToDom.coffee @@ -0,0 +1,148 @@ +module.exports = self = + + convert: (obj) -> + + self._arrayToChildren obj + + _arrayToChildren: (a, parent = null) -> + + children = [] + + prev = null + + for v in a + + if typeof v is 'string' + + node = self._getTextNodeFor v + + else + + node = self._objectToNode v, parent + + node.prev = null + node.next = null + node.parent = parent + + if prev? + + node.prev = prev + prev.next = node + + prev = node + + children.push node + + children + + _objectToNode: (o) -> + + i = 0 + + for own k, v of o + + if i > 0 + + throw Error "_objectToNode() only accepts an object with one key/value" + + key = k + val = v + + i++ + + node = {} + + if typeof key isnt 'string' + + throw Error "_objectToNode()'s key must be a string of tag name and classes" + + if typeof val is 'string' + + children = [self._getTextNodeFor(val)] + + else if Array.isArray val + + children = self._arrayToChildren val, node + + else + + inspect o + throw Error "_objectToNode()'s key's value must only be a string or an array" + + node.type = 'tag' + {name, attribs} = self._parseTag key + node.name = name + node.attribs = attribs + node.children = children + + node + + _getTextNodeFor: (s) -> + + {type: 'text', data: s} + + _nameRx: /^[a-zA-Z\-\_]{1}[a-zA-Z0-9\-\_]*$/ + + _parseTag: (k) -> + + # validate + if not k.match(/^[a-zA-Z0-9\#\-\_\.\[\]\"\'\=\,\s]+$/) or k.match(/^[0-9]+/) + + throw Error "cannot parse tag `#{k}`" + + attribs = {} + + parts = + + name: '' + + attribs: attribs + + # tag name + if m = k.match /^([^\.#]+)/ + + name = m[1] + + unless name.match self._nameRx + + throw Error "tag name `#{name}` is not valid" + + parts.name = name + + k = k.substr name.length, k.length + + # tag id + if m = k.match /^#([a-zA-Z0-9\-]+)/ + + id = m[1] + + unless id.match self._nameRx + + throw Error "tag id `#{id}` is not valid" + + attribs.id = id + + k = k.substr id.length + 1, k.length + + classes = [] + + # the class attrib + while m = k.match /\.([a-zA-Z0-9\-\_]+)/ + + cls = m[1] + + unless cls.match self._nameRx + + throw Error "tag class `#{cls}` is not valid" + + classes.push cls + + k = k.replace '.' + cls, '' + + if classes.length + + attribs.class = classes.join " " + + # TODO: match attributes like [a=b] + + parts \ No newline at end of file -- cgit v1.2.3