if (typeof(require) !== 'undefined') { var tree = require('less/tree') } // // CSS @import node // // The general strategy here is that we don't want to wait // for the parsing to be completed, before we start importing // the file. That's because in the context of a browser, // most of the time will be spent waiting for the server to respond. // // On creation, we push the import path to our import queue, though // `import,push`, we also pass it a callback, which it'll call once // the file has been fetched, and parsed. // tree.Import = function Import(path, imports) { var that = this; this._path = path; // The '.less' extension is optional if (path instanceof tree.Quoted) { this.path = /\.(le?|c)ss$/.test(path.content) ? path.content : path.content + '.less'; } else { this.path = path.value.content || path.value; } this.css = /css$/.test(this.path); // Only pre-compile .less files if (! this.css) { imports.push(this.path, function (root) { that.root = root; }); } }; // // The actual import node doesn't return anything, when converted to CSS. // The reason is that it's used at the evaluation stage, so that the rules // it imports can be treated like any other rules. // // In `eval`, we make sure all Import nodes get evaluated, recursively, so // we end up with a flat structure, which can easily be imported in the parent // ruleset. // tree.Import.prototype = { toCSS: function () { if (this.css) { return "@import " + this._path.toCSS() + ';\n'; } else { return ""; } }, eval: function () { if (this.css) { return this; } else { for (var i = 0; i < this.root.rules.length; i++) { if (this.root.rules[i] instanceof tree.Import) { Array.prototype .splice .apply(this.root.rules, [i, 1].concat(this.root.rules[i].eval())); } } return this.root.rules; } } };