UNPKG

mist

Version:
190 lines (177 loc) 4.62 kB
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