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/coffee/lib | |
parent | e0c9d480a73fa629c1e4a47d3e721f1d2d345406 (diff) |
node_modules
Diffstat (limited to 'node_modules/dom-converter/scripts/coffee/lib')
4 files changed, 260 insertions, 0 deletions
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 --- /dev/null +++ b/node_modules/dom-converter/scripts/coffee/lib/domToMarkup.coffee 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 |