From: Jakub Pawlowicz Date: Wed, 4 Jan 2017 15:23:05 +0000 (+0100) Subject: See #689 - fixes regression in parsing property blocks. X-Git-Url: https://git.ndcode.org/public/gitweb.cgi?a=commitdiff_plain;h=b6365bf2d9b73ce4f9cc011414057a08ccc52789;p=clean-css.git See #689 - fixes regression in parsing property blocks. Why: * New tokenizer introduced an issue where a semicolon ending a property block was handled incorrectly. --- diff --git a/lib/tokenizer/tokenize.js b/lib/tokenizer/tokenize.js index 3f509f6b..29b15b0a 100644 --- a/lib/tokenizer/tokenize.js +++ b/lib/tokenizer/tokenize.js @@ -69,6 +69,7 @@ function intoTokens(source, externalContext, internalContext, isNested) { var wasCommentEnd = false; var isEscaped; var seekingValue = false; + var seekingPropertyBlockClosing = false; var position = internalContext.position; for (; position.index < source.length; position.index++) { @@ -249,6 +250,10 @@ function intoTokens(source, externalContext, internalContext, isNested) { seekingValue = false; buffer = []; + } else if (character == Marker.SEMICOLON && level == Level.RULE && seekingPropertyBlockClosing) { + // close brace after a property block at rule level, e.g. a{--custom:{color:red;};<-- + seekingPropertyBlockClosing = false; + buffer = []; } else if (character == Marker.SEMICOLON && level == Level.RULE && buffer.length === 0) { // stray semicolon at rule level, e.g. a{;<-- // noop @@ -303,8 +308,17 @@ function intoTokens(source, externalContext, internalContext, isNested) { level = levels.pop(); seekingValue = false; buffer = []; + } else if (character == Marker.CLOSE_BRACE && level == Level.RULE && levels[levels.length - 1] == Level.RULE) { + // close brace after a property block at rule level, e.g. a{--custom:{color:red;}<-- + ruleToken = ruleTokens.pop(); + newTokens = ruleToken[2]; + + level = levels.pop(); + seekingValue = false; + seekingPropertyBlockClosing = true; + buffer = []; } else if (character == Marker.CLOSE_BRACE && level == Level.RULE) { - // close brace after at-rule at rule level, e.g. a{color:red;}<-- + // close brace after a rule, e.g. a{color:red;}<-- ruleToken = null; newTokens = allTokens; diff --git a/test/tokenizer/tokenize-test.js b/test/tokenizer/tokenize-test.js index 152926a4..54df4dff 100644 --- a/test/tokenizer/tokenize-test.js +++ b/test/tokenizer/tokenize-test.js @@ -2798,6 +2798,108 @@ vows.describe(tokenize) ] ] ] + ], + 'mixed block value with trailing block semicolon 123': [ + 'a{display:block;--my-toolbar:{color:red;width:100%;};color:blue}', + [ + [ + 'rule', + [ + [ + 'rule-scope', + 'a', + [ + [1, 0, undefined] + ] + ] + ], + [ + [ + 'property', + [ + 'property-name', + 'display', + [ + [1, 2, undefined] + ] + ], + [ + 'property-value', + 'block', + [ + [1, 10, undefined] + ] + ] + ], + [ + 'property', + [ + 'property-name', + '--my-toolbar', + [ + [1, 16, undefined] + ] + ], + [ + 'property-block', + [ + [ + 'property', + [ + 'property-name', + 'color', + [ + [1, 30, undefined] + ] + ], + [ + 'property-value', + 'red', + [ + [1, 36, undefined] + ] + ] + ], + [ + 'property', + [ + 'property-name', + 'width', + [ + [1, 40, undefined] + ] + ], + [ + 'property-value', + '100%', + [ + [1, 46, undefined] + ] + ] + ] + ] + ] + ], + [ + 'property', + [ + 'property-name', + 'color', + [ + [1, 53, undefined] + ] + ], + [ + 'property-value', + 'blue', + [ + [1, 59, undefined] + ] + ] + ] + ] + ] + ] ] }) )