115 lines
3 KiB
JavaScript
115 lines
3 KiB
JavaScript
|
// 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;
|
||
|
}
|
||
|
};
|