- From: Bert Bos <bert@w3.org>
- Date: Wed, 20 May 2009 15:48:46 +0200
- To: W3C style mailing list <www-style@w3.org>
This is an attempt at solving issue 71[1]. Or rather, at finding out if
there still is anything to solve...
* Analysis
A "declaration block" in CSS is a part of a rule set and consists of a
set of declarations plus the curly braces ({}) that surround the set.
According to the grammar, it is impossible that an ATKEYWORD occurs in
a declaration before the colon (:).
The @page rule, although not appearing as such in the grammar, is
defined in section 13.2[2] as also containing a declaration block.
Until CSS 2.1, there were no rules for how to deal with ungrammatical
input, but now we have a number of error recovery rules to try to
salvage the more or less recognizable parts of illegal input.
One of those rules applies in this case, viz., the rule
called "malformed declarations" in section 4.2[3]. It says, simplified,
to skip to the next semicolon (;) or the end of the block (}) and
restart parsing from there.
E.g., the second line in this example
@page {
size @import "foo";
margin: 1cm
}
has an ATKEYWORD ("@import") where a colon should have been and thus
everything from the start of that declaration ("size") up to and
including the next semicolon is ignored. Parsing starts again
at "margin". (Like all error recovery, this is a wild guess; we cannot
know what the actual error is that the author made.)
Issue 71 talks about two cases: the ATKEYWORD appears at the start of a
declaration (i.e., where a property was expected), or it appears after
the property.
The example above shows the latter case. It is clear that the "malformed
declarations" rule applies to that case. The rule says "unexpected
tokens while parsing a declaration" and the when the parser
reaches "@import" it has clearly started parsing a declaration.
The former case would be something like this:
div { @here {is something strange} color: red }
The question is if the same rule applies. Is the parser parsing a
declaration when it sees the "@here"? If yes, the rule says that
everything up to and including "red" is ignored.
I would say yes. At least I think that is the intention of the rule. The
rule contains an example ("For example, a malformed declaration may be
missing a property [...]"), which indicates that the parser is already
parsing a declaration, even if it hasn't yet seen a property.
* Conclusion
So my conclusion is that issue 71 is already covered by the "malformed
declarations" rule in section 4.2. No changes are necessary in
principle.
But the existence of the issue seems to indicate that the rule is not
clear, so maybe an example can be added. The following could be added
as the eighth and ninth examples:
p { color: green; @foo color: red} /* unexpected token @foo */
p { color: red; @foo; color: green} /* unexpected token @foo */
* Implementation status
A quick check indicates that Konqueror, Opera and Firefox correctly
apply the "malformed declarations" rule. I haven't tested any other
software. But given that the current formulation has been unchanged
since 2003, I expect few problems.
[1] http://wiki.csswg.org/spec/css2.1#issue-71
[2] http://www.w3.org/TR/2009/CR-CSS2-20090423/page.html#page-box
[3]
http://www.w3.org/TR/2009/CR-CSS2-20090423/syndata.html#parsing-errors
Bert
--
Bert Bos ( W 3 C ) http://www.w3.org/
http://www.w3.org/people/bos W3C/ERCIM
bert@w3.org 2004 Rt des Lucioles / BP 93
+33 (0)4 92 38 76 92 06902 Sophia Antipolis Cedex, France
Received on Wednesday, 20 May 2009 13:49:24 UTC