node-less
Version:
Less Compiler For Node
61 lines (50 loc) • 1.94 kB
JavaScript
(function (module) {
var Anonymous = require('./anonymous.js'),
Variable = require('./variable.js'),
Quoted = require('./quoted.js'),
jsify = require('./jsify.js');
var JavaScript = function (string, index, escaped) {
this.escaped = escaped;
this.expression = string;
this.index = index;
};
JavaScript.prototype = {
type: "JavaScript",
eval: function (env) {
var result,
that = this,
context = {};
var expression = this.expression.replace(/@\{([\w-]+)\}/g, function (_, name) {
return jsify(new Variable('@' + name, that.index).eval(env));
});
try {
expression = new(Function)('return (' + expression + ')');
} catch (e) {
throw { message: "JavaScript evaluation error: `" + expression + "`" ,
index: this.index };
}
for (var k in env.frames[0].variables()) {
context[k.slice(1)] = {
value: env.frames[0].variables()[k].value,
toJS: function () {
return this.value.eval(env).toCSS();
}
};
}
try {
result = expression.call(context);
} catch (e) {
throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message + "'" ,
index: this.index };
}
if (typeof(result) === 'string') {
return new Quoted('"' + result + '"', result, this.escaped, this.index);
} else if (Array.isArray(result)) {
return new Anonymous(result.join(', '));
} else {
return new Anonymous(result);
}
}
};
module.exports = JavaScript;
})(module);