mirror of
https://github.com/less/less.js.git
synced 2026-02-09 06:25:24 -05:00
56 lines
2.1 KiB
JavaScript
56 lines
2.1 KiB
JavaScript
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;
|