| // Generated by CoffeeScript 1.12.7 |
| var self, |
| hasProp = {}.hasOwnProperty; |
| |
| module.exports = self = { |
| convert: function(obj) { |
| return self._arrayToChildren(obj); |
| }, |
| _arrayToChildren: function(a, parent) { |
| var children, j, len, node, prev, v; |
| if (parent == null) { |
| parent = null; |
| } |
| children = []; |
| prev = null; |
| for (j = 0, len = a.length; j < len; j++) { |
| v = a[j]; |
| if (typeof v === 'string') { |
| node = self._getTextNodeFor(v); |
| } else { |
| node = self._objectToNode(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; |
| }, |
| _objectToNode: function(o) { |
| var attribs, children, i, k, key, name, node, ref, v, val; |
| i = 0; |
| for (k in o) { |
| if (!hasProp.call(o, k)) continue; |
| v = o[k]; |
| if (i > 0) { |
| throw Error("_objectToNode() only accepts an object with one key/value"); |
| } |
| key = k; |
| val = v; |
| i++; |
| } |
| node = {}; |
| if (typeof key !== 'string') { |
| throw Error("_objectToNode()'s key must be a string of tag name and classes"); |
| } |
| if (typeof val === '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'; |
| ref = self._parseTag(key), name = ref.name, attribs = ref.attribs; |
| node.name = name; |
| node.attribs = attribs; |
| node.children = children; |
| return node; |
| }, |
| _getTextNodeFor: 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(self._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(self._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(self._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; |
| } |
| }; |