You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
3.0 KiB
114 lines
3.0 KiB
// 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; |
|
} |
|
};
|
|
|