basic mixins with namespaces working. swoosh.
This commit is contained in:
parent
fe0ed621b9
commit
4767b264e7
@ -1,11 +1,22 @@
|
||||
if (typeof(window) === 'undefined') { var tree = require(require('path').join(__dirname, '..', '..', 'less', 'tree')); }
|
||||
|
||||
tree.mixin = {};
|
||||
tree.mixin.Call = function MixinCall(mixins) {
|
||||
this.mixins = mixins;
|
||||
tree.mixin.Call = function MixinCall(elements, args) {
|
||||
this.selector = new(tree.Selector)(elements);
|
||||
this.arguments = args;
|
||||
};
|
||||
tree.mixin.Call.prototype = {
|
||||
toCSS: function (context, env) {
|
||||
eval: function (env) {
|
||||
var mixin, rules = [];
|
||||
|
||||
for (var i = 0; i < env.frames.length; i++) {
|
||||
if (mixin = env.frames[i].find(this.selector)) {
|
||||
for (var r = 0; r < mixin.rules.length; r++) {
|
||||
rules.push(mixin.rules[r]);
|
||||
}
|
||||
return rules;
|
||||
}
|
||||
}
|
||||
throw new(Error)("mixin " + this.selector.toCSS() + " is undefined");
|
||||
}
|
||||
};
|
||||
|
@ -10,6 +10,24 @@ tree.Ruleset.prototype = {
|
||||
if (r instanceof tree.Rule && r.variable === true) { return r }
|
||||
});
|
||||
},
|
||||
mixable: function (fun) {
|
||||
return this.rules.filter(function (r) {
|
||||
if (r instanceof tree.mixin.Definition || r instanceof tree.Ruleset) { return r }
|
||||
});
|
||||
},
|
||||
find: function (selector) {
|
||||
return this.mixable().find(function (rule) {
|
||||
for (var j = 0; j < rule.selectors.length; j++) {
|
||||
if (selector.elements[0].value === rule.selectors[j].elements[0].value) {
|
||||
if (selector.elements.length > 1) {
|
||||
return rule.find(new(tree.Selector)(selector.elements.slice(1)));
|
||||
} else {
|
||||
return rule;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
//
|
||||
// Entry point for code generation
|
||||
//
|
||||
@ -33,6 +51,12 @@ tree.Ruleset.prototype = {
|
||||
}
|
||||
env.frames.unshift(this);
|
||||
|
||||
for (var i = 0; i < this.rules.length; i++) {
|
||||
if (this.rules[i] instanceof tree.mixin.Call) {
|
||||
Array.prototype.splice
|
||||
.apply(this.rules, [i, 1].concat(this.rules[i].eval(env)));
|
||||
}
|
||||
}
|
||||
for (var i = 0; i < this.rules.length; i++) {
|
||||
if (this.rules[i] instanceof tree.Ruleset) {
|
||||
rulesets.push(this.rules[i].toCSS(paths, env));
|
||||
|
@ -392,7 +392,7 @@ less.parser = {
|
||||
|
||||
if (match = peek(/([a-z.#: _-]+)[\s\n]*\{/g)) {
|
||||
i += match[0].length - 1;
|
||||
selectors = [new(tree.Selector)([match[1]])];
|
||||
selectors = [new(tree.Selector)([new(tree.Element)(null, match[1])])];
|
||||
} else {
|
||||
while (s = $(this.selector)) {
|
||||
selectors.push(s);
|
||||
|
Loading…
Reference in New Issue
Block a user