mist
Version:
Mist build system
190 lines (177 loc) • 4.62 kB
JavaScript
var MistPostParser, backslash, conditionals, conditionalsReg, doConditional, doVariableAssignment, expand, filters, k, processLines, v,
slice = [].slice;
MistPostParser = require('./mist-post-parser');
backslash = require('backslash');
expand = function(str, vars) {
var perform;
perform = function() {
return str = str.replace(/\$\(\s*([a-z0-9_]+)\s*\)/gi, function(m, name, offset) {
return vars[name] || '';
});
};
while (true) {
if (str === perform()) {
break;
}
}
return str;
};
doVariableAssignment = function(line, enabled, vars) {
var m;
m = line.match(/^[\s\t]*([a-z0-9_]+)[\s\t]*(\+?=)[\s\t]*(.+?)[\s\t]*$/i);
if (m) {
if (!enabled.isEnabled()) {
return null;
}
switch (m[2]) {
case '=':
vars[m[1]] = m[3];
break;
case '+=':
vars[m[1]] = (vars[m[1]] || '') + " " + m[3];
}
}
return line;
};
conditionals = {
ifeq: function() {
var args, i, j, len, v, val;
args = arguments[0], v = 2 <= arguments.length ? slice.call(arguments, 1) : [];
for (i = j = 0, len = v.length; j < len; i = ++j) {
val = v[i];
if (i > 1) {
if (val !== v[0]) {
return false;
}
}
}
return true;
},
ifneq: function() {
var args, v;
args = arguments[0], v = 2 <= arguments.length ? slice.call(arguments, 1) : [];
return !(conditionals.ifeq.apply(null, v));
},
ifdef: function() {
var args, i, j, len, v, val;
args = arguments[0], v = 2 <= arguments.length ? slice.call(arguments, 1) : [];
for (i = j = 0, len = v.length; j < len; i = ++j) {
val = v[i];
if (!(val in args)) {
return false;
}
}
return true;
},
ifndef: function() {
var args, v;
args = arguments[0], v = 2 <= arguments.length ? slice.call(arguments, 1) : [];
return !(conditionals.ifdef.apply(null, v));
}
};
conditionalsReg = /^[\s\t]*(@@@@)[\s\t]*\(([^\)\\]+(?:\\.[^\)\\]*)*)\)[\s\t]*(?:\#.*)?$/;
conditionalsReg = new RegExp(conditionalsReg.source.replace('@@@@', ((function() {
var results;
results = [];
for (k in conditionals) {
v = conditionals[k];
results.push(k);
}
return results;
})()).join('|')));
doConditional = function(line, enabled, vars) {
var args, cmp, m;
m = line.match(conditionalsReg);
if (m) {
if (enabled.isEnabled()) {
cmp = conditionals[m[1]];
args = m[2].split(/(?:\\\\)*\\,/g).map(Function.prototype.call.bind(String.prototype.trim)).map(function(arg) {
var e;
try {
return backslash(arg);
} catch (_error) {
e = _error;
delete e.column;
throw e;
}
});
enabled.push(cmp.apply(null, [vars].concat(args)));
}
return null;
}
if (/^\s*endif\s*(?:\#.*)?$/.test(line)) {
enabled.pop();
return null;
}
if (/^\s*else\s*(?:\#.*)?$/.test(line)) {
enabled[enabled.length - 1] = !enabled[enabled.length - 1];
return null;
}
return line;
};
filters = [doVariableAssignment, doConditional];
processLines = function(lines, map, options) {
var enabled, vars;
enabled = [true];
enabled.isEnabled = function() {
return (this.indexOf(false)) === -1;
};
vars = options.vars || (options.vars = {});
lines = lines.map(function(line, i) {
var e, filter, j, len;
try {
line = expand(line, vars);
} catch (_error) {
e = _error;
e.line = i;
throw e;
}
for (j = 0, len = filters.length; j < len; j++) {
filter = filters[j];
line = filter(line, enabled, vars, options);
if (!line) {
return null;
}
}
return line;
});
lines = lines.filter(function(line, i) {
if (line === null) {
map[i] = null;
}
return line != null;
});
return lines;
};
module.exports = function(src, options) {
var e, j, lines, map, ref, results;
if (options == null) {
options = {};
}
lines = src.split(/\r?\n/g);
map = (function() {
results = [];
for (var j = 1, ref = lines.length; 1 <= ref ? j <= ref : j >= ref; 1 <= ref ? j++ : j--){ results.push(j); }
return results;
}).apply(this);
lines = processLines(lines, map, options);
src = lines.join('\n');
map = map.filter(function(m) {
return m != null;
});
try {
return MistPostParser.parse(src, options);
} catch (_error) {
e = _error;
if (e.constructor === String) {
e = {
message: e
};
}
e.map = map;
e.source = src;
e.sourced = true;
throw e;
}
};
//# sourceMappingURL=mist-parser.js.map