Skip to content

Instantly share code, notes, and snippets.

@imazine
Created October 12, 2014 09:30
Show Gist options
  • Save imazine/530d11e3b924a910b8e0 to your computer and use it in GitHub Desktop.
Save imazine/530d11e3b924a910b8e0 to your computer and use it in GitHub Desktop.
JavaScript Simple Zen Decoder
function zenDecode (str) {
var
tokenStr = str.replace(/\s/g, ''),
fragment = document.createDocumentFragment(),
zenStack = tokenStr.split('>').reverse();
console.log(tokenStr);
return (zenTokenize(zenStack, fragment));
}
function zenTokenize (arr, parent) {
var
source = arr.pop(),
next,
pureSource = source.split('*'),
pureStr = pureSource[0],
interation = pureSource[1] || 1,
elem,
i = 0;
for(; i < interation; i++){
elem = zenParse(pureStr, parent);
if(arr.length) {
next = arr.slice(0);
zenTokenize(next, elem);
}
}
return parent;
}
function zenParse (tokens, parent) {
var
reg = /([a-z0-9]+)(#[a-z0-9]+){0,1}((\.[a-z0-9]+)*)(\[[a-z0-9]+\]){0,1}/i,
elem,
tokenArr = tokens.split('+');
tokenArr.forEach(function (token) {
var
obj = reg.exec(token);
elem = makeDom(obj);
parent.appendChild(elem);
});
return elem;
}
function makeDom (arr) {
var
elem = document.createElement(arr[1]);
if (arr[2]) elem.id = arr[2];
if (arr[3]) elem.setAttribute('class', arr[3].replace('.', ' '));
if (arr[5]) elem.textContent = arr[5];
return elem;
}
// Trest Code
var zenTest = "div#contents > ul#videoList > li.videoList*9 > h2.videoTitle + p.description[this is list]";
console.log('zen test start');
document.body.appendChild(zenDecode(zenTest));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment