make
Version:
Make like Task runner
70 lines (55 loc) • 1.61 kB
JavaScript
module.exports = parse;
function parse(content) {
var lines = content.split(/\r?\n/);
var variables = {};
var targets = {};
// reference to last parsed target
var last = {};
var tokens = {
// var declartion
'\\w+\\s?=\\s*"[^"]*"': function wSS(line) {
var reg = /(\w+)\s?=\s?"([^"]*)"/;
var parts = line.match(reg);
var name = parts[1];
var value = parts[2];
variables[name] = value;
},
// Target declaration
'^\\w[^:]+\\s?:': function wS(line) {
var reg = /^([^:]+)\s?:\s?(.*)/;
var parts = line.match(reg);
var target = parts[1];
var prerequities = parts[2].split(/\s+/).filter(function (prereq) {
return prereq;
});
last = targets[target] = {
prerequities: prerequities,
recipe: ''
};
},
// Rule declaration (anything tabed by one indentation)
'^(\\s\\s|\\t)': function sST(line) {
var reg = /(\s+|\t+)(.*)/;
var parts = line.match(reg);
var rule = parts[2];
// TODO: Var substitution for everything, not just rules
rule = rule.replace(/\$(\w+)/, function (match, name) {
if (variables[name]) return variables[name];
return match;
});
if (last.recipe) last.recipe += '\n' + rule;else last.recipe += rule;
}
};
lines.forEach(function (line) {
if (!line) return;
Object.keys(tokens).forEach(function (token) {
var reg = new RegExp(token);
if (reg.test(line)) tokens[token](line);
});
});
return {
variables: variables,
targets: targets
};
}
;