Fixed nested media bug.

This commit is contained in:
Simone Deponti
2012-09-19 11:10:32 +02:00
committed by Luke Page
parent 1b0b84551f
commit ebc41e5c4b
5 changed files with 58 additions and 39 deletions

View File

@@ -234,6 +234,13 @@ less.Parser = function Parser(env) {
return require('path').resolve(e.filename);
}
function getDebugInfo(index, inputStream, e) {
return {
lineNumber: getLocation(index, inputStream).line + 1,
fileName: getFileName(e)
};
}
function LessError(e, env) {
var input = getInput(e, env),
loc = getLocation(e.index, input),
@@ -1063,14 +1070,11 @@ less.Parser = function Parser(env) {
// div, .class, body > p {...}
//
ruleset: function () {
var selectors = [], s, rules, match, sourceLineNumber,
sourceFileName;
var selectors = [], s, rules, match, debugInfo;
save();
if (env.dumpLineNumbers) {
sourceLineNumber = getLocation(i, input).line + 1;
sourceFileName = getFileName(env);
}
if (env.dumpLineNumbers)
debugInfo = getDebugInfo(i, input, env);
while (s = $(this.selector)) {
selectors.push(s);
@@ -1081,10 +1085,8 @@ less.Parser = function Parser(env) {
if (selectors.length > 0 && (rules = $(this.block))) {
var ruleset = new(tree.Ruleset)(selectors, rules, env.strictImports);
if (env.dumpLineNumbers) {
ruleset.sourceLineNumber = sourceLineNumber;
ruleset.sourceFileName = sourceFileName;
}
if (env.dumpLineNumbers)
ruleset.debugInfo = debugInfo;
return ruleset;
} else {
// Backtrack
@@ -1188,13 +1190,19 @@ less.Parser = function Parser(env) {
},
media: function () {
var features, rules;
var features, rules, media, debugInfo;
if (env.dumpLineNumbers)
debugInfo = getDebugInfo(i, input, env);
if ($(/^@media/)) {
features = $(this.mediaFeatures);
if (rules = $(this.block)) {
return new(tree.Media)(rules, features);
media = new(tree.Media)(rules, features);
if(env.dumpLineNumbers)
media.debugInfo = debugInfo;
return media;
}
}
},

View File

@@ -1,5 +1,31 @@
(function (tree) {
tree.debugInfo = function(env, ctx) {
var result="";
if (env.dumpLineNumbers && !env.compress) {
switch(env.dumpLineNumbers) {
case 'comments':
result = tree.debugInfo.asComment(ctx);
break;
case 'mediaquery':
result = tree.debugInfo.asMediaQuery(ctx);
break;
case 'all':
result = tree.debugInfo.asComment(ctx)+tree.debugInfo.asMediaQuery(ctx);
break;
}
}
return result;
};
tree.debugInfo.asComment = function(ctx) {
return '/* line ' + ctx.debugInfo.lineNumber + ', ' + ctx.debugInfo.fileName + ' */\n';
};
tree.debugInfo.asMediaQuery = function(ctx) {
return '@media -sass-debug-info{filename{font-family:"' + ctx.debugInfo.fileName + '";}line{font-family:"' + ctx.debugInfo.lineNumber + '";}}\n';
};
tree.find = function (obj, fun) {
for (var i = 0, r; i < obj.length; i++) {
if (r = fun.call(obj, obj[i])) { return r }

View File

@@ -27,6 +27,10 @@ tree.Media.prototype = {
env.mediaBlocks.push(this);
var media = new(tree.Media)([], []);
if(this.debugInfo) {
this.ruleset.debugInfo = this.debugInfo;
media.debugInfo = this.debugInfo;
}
media.features = this.features.eval(env);
env.frames.unshift(this.ruleset);

View File

@@ -15,6 +15,10 @@ tree.Ruleset.prototype = {
ruleset.root = this.root;
ruleset.allowImports = this.allowImports;
if(this.debugInfo) {
ruleset.debugInfo = this.debugInfo;
}
// push the current ruleset to the frames stack
env.frames.unshift(ruleset);
@@ -69,10 +73,6 @@ tree.Ruleset.prototype = {
}
}
if(this.sourceLineNumber && this.sourceFileName) {
ruleset.sourceLineNumber = this.sourceLineNumber;
ruleset.sourceFileName = this.sourceFileName;
}
return ruleset;
},
match: function (args) {
@@ -136,9 +136,7 @@ tree.Ruleset.prototype = {
rulesets = [], // node.Ruleset instances
paths = [], // Current selectors
selector, // The fully rendered selector
lineNumbersInfo, // Line number debugging, either as comment or fake media query.
lineNumbersComment, // Line number debug info as comment
lineNumbersMediaQuery, // Line number debug info as media query
debugInfo, // Line number debugging
rule;
if (! this.root) {
@@ -177,24 +175,7 @@ tree.Ruleset.prototype = {
css.push(rules.join(env.compress ? '' : '\n'));
} else {
if (rules.length > 0) {
lineNumbersInfo = "";
lineNumbersComment = '';
lineNumbersMediaQuery = '';
if (env.dumpLineNumbers && !env.compress) {
lineNumbersComment = '/* line ' + this.sourceLineNumber + ', ' + this.sourceFileName + ' */\n';
lineNumbersMediaQuery = '@media -sass-debug-info{filename{font-family:"' + this.sourceFileName + '";}line{font-family:"' + this.sourceLineNumber + '";}}\n';
switch(env.dumpLineNumbers) {
case 'comments':
lineNumbersInfo = lineNumbersComment;
break;
case 'mediaquery':
lineNumbersInfo = lineNumbersMediaQuery;
break;
case 'all':
lineNumbersInfo = lineNumbersComment+lineNumbersMediaQuery;
break;
}
}
debugInfo = tree.debugInfo(env, this);
selector = paths.map(function (p) {
return p.map(function (s) {
return s.toCSS(env);
@@ -209,7 +190,7 @@ tree.Ruleset.prototype = {
}
rules = _rules;
css.push(lineNumbersInfo + selector +
css.push(debugInfo + selector +
(env.compress ? '{' : ' {\n ') +
rules.join(env.compress ? '' : '\n ') +
(env.compress ? '}' : '\n}\n'));

View File

@@ -17,7 +17,7 @@
}
}
@media all and screen {
/* line 3, {pathimport}test.less */
/* line 5, {pathimport}test.less */
.tst {
color: red;
}