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;