| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 | // Generated by CoffeeScript 1.12.7var 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;  }};
 |