ceri-compiler
Version:
compiles template strings for ceriJS
76 lines (75 loc) • 2.16 kB
JavaScript
module.exports = (camelize, spliceStr, marker, templateArgs) => {
var matchTemplateArgs;
matchTemplateArgs = (val) => {
var arg, found, i, len, reg, result, tmp;
reg = /[^\\\$]?((\$+)(\d+))/g;
found = false;
while (result = reg.exec(val)) {
tmp = templateArgs[templateArgs.length - result[2].length];
tmp.args = Math.max(tmp.args || 0, (arg = parseFloat(result[3])));
arg = templateArgs.toArg(tmp.depth, arg);
len = result[1].length;
i = result.index + (result[0].length - len);
/*if i > 0
arg = '"+' + arg
if val[0] != '"'
val = '"' + val
i++
if i + len > val.length
arg += '+"'
if val[val.length-1] != '"'
val += '"'*/
val = spliceStr(val, i, len, arg);
found = true;
}
if (found) {
val = marker + val + marker;
}
return val;
};
return (attr, opt = {}) => {
var j, k, len1, mod, mods, obj, oname, splitted, type, v;
if (Object.keys(attr).length > 0) {
for (k in attr) {
v = attr[k];
if (/[^\w\s]/.test(k[0])) {
type = k[0];
oname = k.slice(1);
} else {
type = "";
oname = k;
}
splitted = oname.split(".");
[oname] = splitted.splice(0, 1);
if (opt[oname] == null) {
opt[oname] = {};
}
if (splitted.length > 0) {
mods = {};
for (j = 0, len1 = splitted.length; j < len1; j++) {
mod = splitted[j];
mods[camelize(mod)] = true;
}
if (Object.keys(mods).length === 1 && mods.expr) {
obj = `${marker}function(){return ${v};}${marker}`;
} else if (mods.expr) {
delete mods.expr;
obj = {
val: `${marker}function(){return ${v};}${marker}`,
mods: mods
};
} else {
obj = {
val: matchTemplateArgs(v),
mods: mods
};
}
opt[oname][type] = obj;
} else {
opt[oname][type] = matchTemplateArgs(v);
}
}
}
return opt;
};
};