From e3c13121dfdca48ba8fe26335cc12dd3f7948676 Mon Sep 17 00:00:00 2001 From: Max Mikhailov Date: Mon, 25 Jan 2016 23:51:25 +0300 Subject: [PATCH] allow unknown at-rules w/o {} block --- lib/less/parser/parser.js | 45 ++++--------------- test/css/css-3.css | 6 +++ test/less/css-3.less | 12 ++++- .../errors/parse-error-media-no-block-1.txt | 2 +- .../errors/parse-error-media-no-block-2.txt | 2 +- .../errors/parse-error-media-no-block-3.txt | 2 +- 6 files changed, 27 insertions(+), 42 deletions(-) diff --git a/lib/less/parser/parser.js b/lib/less/parser/parser.js index ec5d0db0..e6656dd5 100644 --- a/lib/less/parser/parser.js +++ b/lib/less/parser/parser.js @@ -1291,12 +1291,10 @@ var Parser = function Parser(context, imports, fileInfo) { } else if (e) { nodes.push(new(tree.Paren)(e)); } else { - parserInput.restore("badly formed media feature definition"); - return null; + error("badly formed media feature definition"); } } else { - parserInput.restore("Missing closing ')'"); - return null; + error("Missing closing ')'", "Parse"); } } } while (e); @@ -1341,8 +1339,7 @@ var Parser = function Parser(context, imports, fileInfo) { rules = this.block(); if (!rules) { - parserInput.restore("media definitions require block statements after any features"); - return; + error("media definitions require block statements after any features"); } parserInput.forget(); @@ -1420,33 +1417,6 @@ var Parser = function Parser(context, imports, fileInfo) { } switch(nonVendorSpecificName) { - /* - case "@font-face": - case "@viewport": - case "@top-left": - case "@top-left-corner": - case "@top-center": - case "@top-right": - case "@top-right-corner": - case "@bottom-left": - case "@bottom-left-corner": - case "@bottom-center": - case "@bottom-right": - case "@bottom-right-corner": - case "@left-top": - case "@left-middle": - case "@left-bottom": - case "@right-top": - case "@right-middle": - case "@right-bottom": - hasBlock = true; - isRooted = true; - break; - */ - case "@counter-style": - hasIdentifier = true; - hasBlock = true; - break; case "@charset": hasIdentifier = true; hasBlock = false; @@ -1456,17 +1426,17 @@ var Parser = function Parser(context, imports, fileInfo) { hasBlock = false; break; case "@keyframes": + case "@counter-style": hasIdentifier = true; break; - case "@host": - case "@page": - hasUnknown = true; - break; case "@document": case "@supports": hasUnknown = true; isRooted = false; break; + default: + hasUnknown = true; + break; } parserInput.commentStore.length = 0; @@ -1483,6 +1453,7 @@ var Parser = function Parser(context, imports, fileInfo) { } } else if (hasUnknown) { value = (parserInput.$re(/^[^{;]+/) || '').trim(); + hasBlock = (parserInput.currentChar() == '{'); if (value) { value = new(tree.Anonymous)(value); } diff --git a/test/css/css-3.css b/test/css/css-3.css index 2ea43083..5aafe04e 100644 --- a/test/css/css-3.css +++ b/test/css/css-3.css @@ -149,3 +149,9 @@ body ^^ .shadow { } @-ms-viewport { } +@unknown foo 42 (bar) { + x { + y: z; + } +} +@unknown foo 43; diff --git a/test/less/css-3.less b/test/less/css-3.less index 6545c8c1..9f206791 100644 --- a/test/less/css-3.less +++ b/test/less/css-3.less @@ -144,11 +144,19 @@ body ^^ .shadow { #issue2066 { background: url('/images/icon-team.svg') 0 0 / contain; } + @counter-style triangle { system: cyclic; symbols: ‣; suffix: " "; } + @-ms-viewport{ -//width: auto !important; -} \ No newline at end of file + // width: auto !important; +} + +@unknown foo 42 (bar) { + x {y: z} +} + +@unknown foo 43; diff --git a/test/less/errors/parse-error-media-no-block-1.txt b/test/less/errors/parse-error-media-no-block-1.txt index b1af0ce2..3af15b70 100644 --- a/test/less/errors/parse-error-media-no-block-1.txt +++ b/test/less/errors/parse-error-media-no-block-1.txt @@ -1,3 +1,3 @@ -ParseError: media definitions require block statements after any features in {path}parse-error-media-no-block-1.less on line 1, column 24: +SyntaxError: media definitions require block statements after any features in {path}parse-error-media-no-block-1.less on line 1, column 24: 1 @media (extra: bracket)) { 2 body { diff --git a/test/less/errors/parse-error-media-no-block-2.txt b/test/less/errors/parse-error-media-no-block-2.txt index badea773..6d774ea7 100644 --- a/test/less/errors/parse-error-media-no-block-2.txt +++ b/test/less/errors/parse-error-media-no-block-2.txt @@ -1,2 +1,2 @@ -ParseError: media definitions require block statements after any features in {path}parse-error-media-no-block-2.less on line 1, column 7: +SyntaxError: media definitions require block statements after any features in {path}parse-error-media-no-block-2.less on line 1, column 7: 1 @media diff --git a/test/less/errors/parse-error-media-no-block-3.txt b/test/less/errors/parse-error-media-no-block-3.txt index cc465f2b..7bb0f4c1 100644 --- a/test/less/errors/parse-error-media-no-block-3.txt +++ b/test/less/errors/parse-error-media-no-block-3.txt @@ -1,3 +1,3 @@ -ParseError: media definitions require block statements after any features in {path}parse-error-media-no-block-3.less on line 4, column 4: +SyntaxError: media definitions require block statements after any features in {path}parse-error-media-no-block-3.less on line 4, column 4: 3 font-size: 5000px; 4 }