From 2644014bdf06810ffc4ea8d1b8cb30fd75394e1b Mon Sep 17 00:00:00 2001 From: cloudhead Date: Thu, 4 Mar 2010 13:50:52 -0500 Subject: [PATCH] refactored Ruleset/find() method, and added a match() method to Selector, to do selector matching. --- lib/less/node/ruleset.js | 39 +++++++++++++++++++++------------------ lib/less/node/selector.js | 7 +++++++ 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/lib/less/node/ruleset.js b/lib/less/node/ruleset.js index d28d3fc..59f54a9 100644 --- a/lib/less/node/ruleset.js +++ b/lib/less/node/ruleset.js @@ -10,27 +10,30 @@ 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) { - if (typeof(fun) === 'function') { - return fun.call(this, r); - } else { return r } - } - }); - }, - find: function (selector) { - return this.mixable(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; + find: function (selector, self) { + self = self || this; + var rules = [], rule, match; + + for (var i = 0; i < this.rules.length; i++) { + rule = this.rules[i]; + + if ((rule instanceof tree.mixin.Definition || + rule instanceof tree.Ruleset) && rule !== self) { + + for (var j = 0; j < rule.selectors.length; j++) { + if (match = selector.match(rule.selectors[j])) { + if (selector.elements.length > 1) { + Array.prototype.push.apply(rules, rule.find( + new(tree.Selector)(selector.elements.slice(1)), self)); + } else { + rules.push(rule); + } + break; } } } - }); + } + return rules }, // // Entry point for code generation diff --git a/lib/less/node/selector.js b/lib/less/node/selector.js index 5f2ebc2..da77133 100644 --- a/lib/less/node/selector.js +++ b/lib/less/node/selector.js @@ -1,6 +1,13 @@ if (typeof(window) === 'undefined') { var tree = require(require('path').join(__dirname, '..', '..', 'less', 'tree')); } tree.Selector = function Selector(elements) { this.elements = elements }; +tree.Selector.prototype.match = function (other) { + if (this.elements[0].value === other.elements[0].value) { + return true; + } else { + return false; + } +}; tree.Selector.prototype.toCSS = function () { return this.elements.map(function (e) { if (typeof(e) === 'string') {