[Pkg-javascript-commits] [less.js] 227/285: flatten import visitor so that variable imports can be processed at the end of a global queue
Jonas Smedegaard
dr at jones.dk
Mon Oct 26 23:23:57 UTC 2015
This is an automated email from the git hooks/post-receive script.
js pushed a commit to annotated tag v2.0.0
in repository less.js.
commit c757befb4f113cd5543967b6e52496debdadcf3e
Author: Luke Page <luke.a.page at gmail.com>
Date: Thu Oct 23 21:33:28 2014 +0100
flatten import visitor so that variable imports can be processed at the end of a global queue
---
lib/less/tree/import.js | 11 ++++++++
lib/less/tree/quoted.js | 3 +++
lib/less/visitors/import-visitor.js | 50 ++++++++++++++++++++++++++-----------
3 files changed, 50 insertions(+), 14 deletions(-)
diff --git a/lib/less/tree/import.js b/lib/less/tree/import.js
index d8ce4f3..69e1aad 100644
--- a/lib/less/tree/import.js
+++ b/lib/less/tree/import.js
@@ -73,6 +73,17 @@ Import.prototype.getPath = function () {
}
return null;
};
+Import.prototype.isVariableImport = function () {
+ var path = this.path;
+ if (path instanceof URL) {
+ path = path.value;
+ }
+ if (path instanceof Quoted) {
+ return path.containsVariables();
+ }
+
+ return true;
+};
Import.prototype.evalForImport = function (context) {
var path = this.path;
if (path instanceof URL) {
diff --git a/lib/less/tree/quoted.js b/lib/less/tree/quoted.js
index c7d8305..f153455 100644
--- a/lib/less/tree/quoted.js
+++ b/lib/less/tree/quoted.js
@@ -20,6 +20,9 @@ Quoted.prototype.genCSS = function (context, output) {
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) {
diff --git a/lib/less/visitors/import-visitor.js b/lib/less/visitors/import-visitor.js
index 6217504..ebf6767 100644
--- a/lib/less/visitors/import-visitor.js
+++ b/lib/less/visitors/import-visitor.js
@@ -3,10 +3,13 @@ var contexts = require("../contexts"),
ImportSequencer = require("./import-sequencer");
var ImportVisitor = function(importer, finish, evalEnv, onceFileDetectionMap, recursionDetector) {
+ // TODO arguments not all necessary now
+
this._visitor = new Visitor(this);
this._importer = importer;
this._finish = finish;
- this.context = evalEnv || new contexts.Eval();
+ // TODO probably doesnt need to be an array
+ this.contextStack = [evalEnv || new contexts.Eval()];
this.importCount = 0;
this.onceFileDetectionMap = onceFileDetectionMap || {};
this.recursionDetector = {};
@@ -43,8 +46,14 @@ ImportVisitor.prototype = {
if (!importNode.css || inlineCSS) {
+ // TODO - process this type of imports *last*
+ //if (importNode.isVariableImport()) {
+ // console.log("variable import detected");
+ //}
+ var currentContext = this.contextStack[this.contextStack.length - 1];
+
try {
- evaldImportNode = importNode.evalForImport(this.context);
+ evaldImportNode = importNode.evalForImport(currentContext);
} catch(e){
if (!e.filename) { e.index = importNode.index; e.filename = importNode.currentFileInfo.filename; }
// attempt to eval properly and treat as css
@@ -56,7 +65,7 @@ ImportVisitor.prototype = {
if (evaldImportNode && (!evaldImportNode.css || inlineCSS)) {
importNode = evaldImportNode;
this.importCount++;
- var context = new contexts.Eval(this.context, this.context.frames.slice(0));
+ var context = new contexts.Eval(currentContext, currentContext.frames.slice(0));
if (importNode.options.multiple) {
context.importMultiple = true;
@@ -113,9 +122,14 @@ ImportVisitor.prototype = {
if (!inlineCSS && (context.importMultiple || !duplicateImport)) {
importVisitor.recursionDetector[fullPath] = true;
- new ImportVisitor(importVisitor._importer, subFinish, context, importVisitor.onceFileDetectionMap, importVisitor.recursionDetector)
- .run(root);
- return;
+
+ this.contextStack.push(context);
+ try {
+ this._visitor.visit(root);
+ } catch (e) {
+ this.error = e;
+ }
+ this.contextStack.pop();
}
}
@@ -126,32 +140,40 @@ ImportVisitor.prototype = {
return ruleNode;
},
visitDirective: function (directiveNode, visitArgs) {
- this.context.frames.unshift(directiveNode);
+ var currentContext = this.contextStack[this.contextStack.length - 1];
+ currentContext.frames.unshift(directiveNode);
return directiveNode;
},
visitDirectiveOut: function (directiveNode) {
- this.context.frames.shift();
+ var currentContext = this.contextStack[this.contextStack.length - 1];
+ currentContext.frames.shift();
},
visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {
- this.context.frames.unshift(mixinDefinitionNode);
+ var currentContext = this.contextStack[this.contextStack.length - 1];
+ currentContext.frames.unshift(mixinDefinitionNode);
return mixinDefinitionNode;
},
visitMixinDefinitionOut: function (mixinDefinitionNode) {
- this.context.frames.shift();
+ var currentContext = this.contextStack[this.contextStack.length - 1];
+ currentContext.frames.shift();
},
visitRuleset: function (rulesetNode, visitArgs) {
- this.context.frames.unshift(rulesetNode);
+ var currentContext = this.contextStack[this.contextStack.length - 1];
+ currentContext.frames.unshift(rulesetNode);
return rulesetNode;
},
visitRulesetOut: function (rulesetNode) {
- this.context.frames.shift();
+ var currentContext = this.contextStack[this.contextStack.length - 1];
+ currentContext.frames.shift();
},
visitMedia: function (mediaNode, visitArgs) {
- this.context.frames.unshift(mediaNode.rules[0]);
+ var currentContext = this.contextStack[this.contextStack.length - 1];
+ currentContext.frames.unshift(mediaNode.rules[0]);
return mediaNode;
},
visitMediaOut: function (mediaNode) {
- this.context.frames.shift();
+ var currentContext = this.contextStack[this.contextStack.length - 1];
+ currentContext.frames.shift();
}
};
module.exports = ImportVisitor;
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/less.js.git
More information about the Pkg-javascript-commits
mailing list