mirror of
https://github.com/less/less.js.git
synced 2026-01-22 13:48:03 -05:00
62 lines
1.9 KiB
JavaScript
62 lines
1.9 KiB
JavaScript
var Node = require("./node"),
|
|
Variable = require("./variable");
|
|
|
|
var JsEvalNode = function() {
|
|
};
|
|
JsEvalNode.prototype = new Node();
|
|
|
|
JsEvalNode.prototype.evaluateJavaScript = function (expression, context) {
|
|
var result,
|
|
that = this,
|
|
evalContext = {};
|
|
|
|
if (context.javascriptEnabled !== undefined && !context.javascriptEnabled) {
|
|
throw { message: "You are using JavaScript, which has been disabled.",
|
|
filename: this.currentFileInfo.filename,
|
|
index: this.index };
|
|
}
|
|
|
|
expression = expression.replace(/@\{([\w-]+)\}/g, function (_, name) {
|
|
return that.jsify(new Variable('@' + name, that.index, that.currentFileInfo).eval(context));
|
|
});
|
|
|
|
try {
|
|
expression = new Function('return (' + expression + ')');
|
|
} catch (e) {
|
|
throw { message: "JavaScript evaluation error: " + e.message + " from `" + expression + "`" ,
|
|
filename: this.currentFileInfo.filename,
|
|
index: this.index };
|
|
}
|
|
|
|
var variables = context.frames[0].variables();
|
|
for (var k in variables) {
|
|
if (variables.hasOwnProperty(k)) {
|
|
/*jshint loopfunc:true */
|
|
evalContext[k.slice(1)] = {
|
|
value: variables[k].value,
|
|
toJS: function () {
|
|
return this.value.eval(context).toCSS();
|
|
}
|
|
};
|
|
}
|
|
}
|
|
|
|
try {
|
|
result = expression.call(evalContext);
|
|
} catch (e) {
|
|
throw { message: "JavaScript evaluation error: '" + e.name + ': ' + e.message.replace(/["]/g, "'") + "'" ,
|
|
filename: this.currentFileInfo.filename,
|
|
index: this.index };
|
|
}
|
|
return result;
|
|
};
|
|
JsEvalNode.prototype.jsify = function (obj) {
|
|
if (Array.isArray(obj.value) && (obj.value.length > 1)) {
|
|
return '[' + obj.value.map(function (v) { return v.toCSS(); }).join(', ') + ']';
|
|
} else {
|
|
return obj.toCSS();
|
|
}
|
|
};
|
|
|
|
module.exports = JsEvalNode;
|