janus
Version:
the two-faced application library-framework
154 lines (140 loc) • 4.16 kB
JavaScript
// Generated by CoffeeScript 1.12.2
(function() {
var build, concat, defaultMutators, find, rechain, selectorToWalks, template, templateSentinel, walk, wrap,
slice = [].slice;
defaultMutators = require('./mutators');
wrap = function(dom) {
return dom.wrapAll('<div/>').parent();
};
selectorToWalks = function(dom, selector) {
var rawDom;
rawDom = dom.get(0);
return dom.find(selector).map(function(_, target) {
var i, idx, parent, ref, walk;
walk = [];
while (target !== rawDom) {
parent = target.parentNode;
for (idx = i = 0, ref = parent.childNodes.length; 0 <= ref ? i <= ref : i >= ref; idx = 0 <= ref ? ++i : --i) {
if (!(parent.childNodes[idx] === target)) {
continue;
}
walk.unshift(idx);
break;
}
target = parent;
}
return [walk];
});
};
walk = function(dom, walks) {
var rawDom;
rawDom = dom.get();
return walks.map(function(_, walk) {
var childIdx, i, idx, len, ptr;
for (idx = i = 0, len = walk.length; i < len; idx = ++i) {
childIdx = walk[idx];
ptr = (idx === 0 ? rawDom[childIdx] : ptr.childNodes[childIdx]);
}
return ptr;
});
};
rechain = function(chains, mutators, selector) {
var fn, head, i, k, result, tail, v;
result = function(fragment) {
var walks;
walks = selectorToWalks(wrap(fragment), selector);
return function(dom, point, immediate) {
var chain, i, len, results, target;
target = walk(dom, walks);
results = [];
for (i = 0, len = chains.length; i < len; i++) {
chain = chains[i];
results.push(chain(target, point, immediate));
}
return results;
};
};
head = 2 <= chains.length ? slice.call(chains, 0, i = chains.length - 1) : (i = 0, []), tail = chains[i++];
if (tail != null) {
fn = function(v) {
return result[k] = function() {
var args;
args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
return rechain(head.concat([v.apply(null, args)]), mutators, selector);
};
};
for (k in tail) {
v = tail[k];
fn(v);
}
}
for (k in mutators) {
v = mutators[k];
if (result[k] == null) {
(function(v) {
return result[k] = function() {
var args;
args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
return rechain(chains.concat([v.apply(null, args)]), mutators, selector);
};
})(v);
}
}
return result;
};
build = function(mutators) {
return function(selector) {
return rechain([], mutators, selector);
};
};
find = build(defaultMutators);
find.build = build;
concat = Array.prototype.concat;
templateSentinel = Symbol('template');
template = function() {
var i, k, len, result, v, x, xs;
xs = 1 <= arguments.length ? slice.call(arguments, 0) : [];
result = function(fragment) {
var prebound, x;
prebound = (function() {
var i, len, results;
results = [];
for (i = 0, len = xs.length; i < len; i++) {
x = xs[i];
results.push(x(fragment));
}
return results;
})();
return function(dom, point, immediate) {
var f;
return concat.apply([], (function() {
var i, len, results;
results = [];
for (i = 0, len = prebound.length; i < len; i++) {
f = prebound[i];
results.push(f(dom, point, immediate));
}
return results;
})());
};
};
result[templateSentinel] = true;
if (typeof xs[0] === 'string') {
result[xs.shift()] = result;
}
for (i = 0, len = xs.length; i < len; i++) {
x = xs[i];
if ((x != null ? x[templateSentinel] : void 0) === true) {
for (k in x) {
v = x[k];
result[k] = v;
}
}
}
return result;
};
module.exports = {
find: find,
template: template
};
}).call(this);