Re: CSS parser recovery

On 12/13/02 11:17 PM, "Ian Hickson" <ian@hixie.ch> wrote:

> 
> On Fri, 13 Dec 2002, Tantek Çelik wrote:
>> 
>> It is a misconception that you must match random braces everywhere when
>> parsing CSS.  See CSS1 section 7.1 for precise specifics on when "blocks"
>> (as defined in 7.1, {...} ) may appear.
> 
> CSS1 7.1 (emphasis mine):
> 
> # A block starts with a left curly brace ({) and ends with the
> # matching right curly brace (}). In between there may be any
> # characters, except that parentheses (()), brackets ([]) and braces
> # ({}) always occur in matching pairs and may be nested. Single (')
> # and double quotes (") also occur in matching pairs, and characters
> # between them are parsed as a string (see the tokenizer in appendix B
> # for a definition of string).
> #
> # ...
> #
> # A declaration-block starts with a left curly brace ({) and ends with
> # the MATCHING right curly brace (}).
> 
> The spec doesn't explicitly give an example with a block before a
> colon, but I see no justification in the spec for ignoring the rules
> given above on the left hand side of a declaration.

It is very simple, the spec simply provides no allowance for a block on the
property side of the colon.


CSS 7.1:

<blockquote>
A declaration consists of a property, a colon (:) and a value.
</blockquote>

Note - no allowance for a block in the property, or after the property
before the colon.

Continued...

<blockquote>
Around each of these there may be whitespace.
</blockquote>

Explicit allowance of whitespace, but NO allowance of a block.

Continued...

<blockquote>
A property is an identifier, as defined earlier.
</blockquote>

And identifiers as defined earlier CANNOT contain blocks.

Continued...

<blockquote>
Any character may occur in the value, but parentheses (()), brackets ([]),
braces ({}), single quotes (') and double quotes (") must come in matching
pairs.
</blockquote>

Aha! Explicit allowance for a block in the value, and only the value portion
of the declaration.


Conclusion: 

The spec allows for (nested) block(s) after an @rule, a selector, and in a
value and nowhere else.


Tantek

Received on Saturday, 14 December 2002 04:25:16 UTC