Created
February 23, 2010 15:39
-
-
Save satyr/312312 to your computer and use it in GitHub Desktop.
zEn4X
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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