Spaces:
Running
Running
// 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; | |
} | |
}; | |