See #689 - fixes regression in parsing property blocks.
authorJakub Pawlowicz <contact@jakubpawlowicz.com>
Wed, 4 Jan 2017 15:23:05 +0000 (16:23 +0100)
committerJakub Pawlowicz <contact@jakubpawlowicz.com>
Wed, 4 Jan 2017 15:23:05 +0000 (16:23 +0100)
Why:

* New tokenizer introduced an issue where a semicolon ending a
  property block was handled incorrectly.

lib/tokenizer/tokenize.js
test/tokenizer/tokenize-test.js

index 3f509f6..29b15b0 100644 (file)
@@ -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;
 
index 152926a..54df4df 100644 (file)
@@ -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]
+                  ]
+                ]
+              ]
+            ]
+          ]
+        ]
       ]
     })
   )