var Node = require("./node"), JsEvalNode = require("./js-eval-node"), Variable = require("./variable"); var Quoted = function (str, content, escaped, index, currentFileInfo) { this.escaped = (escaped == null) ? true : escaped; this.value = content || ''; this.quote = str.charAt(0); this.index = index; this.currentFileInfo = currentFileInfo; }; Quoted.prototype = new JsEvalNode(); Quoted.prototype.type = "Quoted"; Quoted.prototype.genCSS = function (context, output) { if (!this.escaped) { output.add(this.quote, this.currentFileInfo, this.index); } output.add(this.value); if (!this.escaped) { output.add(this.quote); } }; Quoted.prototype.containsVariables = function() { return this.value.match(/(`([^`]+)`)|@\{([\w-]+)\}/); }; Quoted.prototype.eval = function (context) { var that = this, value = this.value; var javascriptReplacement = function (_, exp) { return String(that.evaluateJavaScript(exp, context)); }; var interpolationReplacement = function (_, name) { var v = new Variable('@' + name, that.index, that.currentFileInfo).eval(context, true); return (v instanceof Quoted) ? v.value : v.toCSS(); }; function iterativeReplace(value, regexp, replacementFnc) { var evaluatedValue = value; do { value = evaluatedValue; evaluatedValue = value.replace(regexp, replacementFnc); } while (value !== evaluatedValue); return evaluatedValue; } value = iterativeReplace(value, /`([^`]+)`/g, javascriptReplacement); value = iterativeReplace(value, /@\{([\w-]+)\}/g, interpolationReplacement); return new Quoted(this.quote + value + this.quote, value, this.escaped, this.index, this.currentFileInfo); }; Quoted.prototype.compare = function (other) { // when comparing quoted strings allow the quote to differ if (other.type === "Quoted" && !this.escaped && !other.escaped) { return Node.numericCompare(this.value, other.value); } else { return other.toCSS && this.toCSS() === other.toCSS() ? 0 : undefined; } }; module.exports = Quoted;