Skip to content

Instantly share code, notes, and snippets.

@satyr
Created February 23, 2010 15:39
Show Gist options
  • Save satyr/312312 to your computer and use it in GitHub Desktop.
Save satyr/312312 to your computer and use it in GitHub Desktop.
zEn4X
function zen4x(zc){
var word = /[-\w$]+/, char = /^[^]/, digits = /\d+/;
var kv = /([-\w$]+)(?:=([^\]]*))?\]?/, content = /{([^\}]*)}?/;
var zs = zc.trim().split(/\s{0,}([>+])\s{0,}/);
var root = <_/>, curs = [root], sep;
for(let i = -1, l = zs.length; ++i < l; sep = zs[++i]){
let [name] = word(zs[i]) || '';
if(!name) continue;
let lm = <{name}/>, n = 1;
for(let _, m; char.test(_ = RegExp.rightContext);) switch(_[0]){
case '#': lm.@id = word(_) || '';
break;
case '.': lm.@class += (lm.@class +'' && ' ') + (word(_) || '');
break;
case '[': if((m = kv(_))) lm['@'+ m[1]] = m[2] || '';
break;
case '{': if((m = content(_))) lm.appendChild(m[1]);
break;
case '*': n *= +digits(_) || 1;
}
let _curs = [], p = sep === '+';
let sl = n > 1 && ~zc.indexOf('$') && lm.toXMLString();
for each(let cur in curs){
if(p) cur = cur.parent() || cur;
for(let i = 1; i <= n; ++i){
let clm = sl ? XML(sl.replace(/\$/g, i)) : lm.copy();
cur.appendChild(clm);
_curs.push(clm);
}
}
curs = _curs;
}
return root.*;
}
// var pr = this.dump || this.print || this.alert;
// pr(zen4x('dl#id.cla.ss > dt{content} + dd > input[type=radio][name=$]*2'));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment