diff --git a/lib/less/index.js b/lib/less/index.js index 357339d4e..f748a44e5 100644 --- a/lib/less/index.js +++ b/lib/less/index.js @@ -82,7 +82,8 @@ var less = { 'selector', 'quoted', 'expression', 'rule', 'call', 'url', 'alpha', 'import', 'mixin', 'comment', 'anonymous', 'value', - 'javascript', 'assignment', 'condition', 'paren' + 'javascript', 'assignment', 'condition', 'paren', + 'media' ].forEach(function (n) { require('./tree/' + n); }); diff --git a/lib/less/parser.js b/lib/less/parser.js index d0c552337..0a3aad4df 100644 --- a/lib/less/parser.js +++ b/lib/less/parser.js @@ -1089,7 +1089,7 @@ less.Parser = function Parser(env) { features = $(this.mediaFeatures); if (rules = $(this.block)) { - return new(tree.Directive)('@media', rules, features); + return new(tree.Media)(rules, features); } } }, diff --git a/lib/less/tree/media.js b/lib/less/tree/media.js new file mode 100644 index 000000000..4350c576f --- /dev/null +++ b/lib/less/tree/media.js @@ -0,0 +1,41 @@ +(function (tree) { + +tree.Media = function (value, features) { + var selectors; + + this.features = features && new(tree.Value)(features); + + if (Array.isArray(value)) { + selectors = [new(tree.Selector)([new(tree.Element)('&', null, 0)])]; + this.ruleset = new(tree.Ruleset)(selectors, value); + this.ruleset.allowImports = true; + } else { + this.value = value; + } +}; +tree.Media.prototype = { + toCSS: function (ctx, env) { + var features = this.features ? ' ' + this.features.toCSS(env) : ''; + + if (this.ruleset) { + this.ruleset.root = (ctx.length === 0); + return '@media' + features + (env.compress ? '{' : ' {\n ') + + this.ruleset.toCSS(ctx, env).trim().replace(/\n/g, '\n ') + + (env.compress ? '}': '\n}\n'); + } else { + return '@media ' + this.value.toCSS() + ';\n'; + } + }, + eval: function (env) { + this.features = this.features && this.features.eval(env); + env.frames.unshift(this); + this.ruleset = this.ruleset && this.ruleset.eval(env); + env.frames.shift(); + return this; + }, + variable: function (name) { return tree.Ruleset.prototype.variable.call(this.ruleset, name) }, + find: function () { return tree.Ruleset.prototype.find.apply(this.ruleset, arguments) }, + rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this.ruleset) } +}; + +})(require('../tree')); diff --git a/lib/less/tree/ruleset.js b/lib/less/tree/ruleset.js index ddfe2c563..cfa00d0a5 100644 --- a/lib/less/tree/ruleset.js +++ b/lib/less/tree/ruleset.js @@ -130,7 +130,7 @@ tree.Ruleset.prototype = { for (var i = 0; i < this.rules.length; i++) { rule = this.rules[i]; - if (rule.rules || (rule instanceof tree.Directive)) { + if (rule.rules || (rule instanceof tree.Directive) || (rule instanceof tree.Media)) { rulesets.push(rule.toCSS(paths, env)); } else if (rule instanceof tree.Comment) { if (!rule.silent) {