[css3-page] Re: [CSS2.1] Grammar for @media versus general block parsing

[I added css3-page to the subject line, because it's not really about 
CSS 2.1 anymore.]

On Thursday 03 July 2008 02:41, Grant, Melinda wrote:
> Bert Bos said:
> > On Wednesday 25 June 2008 09:38, Bjoern Hoehrmann wrote:
> > > * Justin Rogers wrote:

> As you may recall, we took the decision here (member-only link):
> http://lists.w3.org/Archives/Member/w3c-css-wg/2007OctDec/0267.html
> and announced it here:
> http://lists.w3.org/Archives/Public/www-style/2007Nov/0119.html.  Per
> my action item, I modified the css3-page grammar to call out
> explicitly that @page is allowed in @media.  (I don't remember
> discussing whether or not to require the semi-colon.)

Those are two different issues, I think. The @page inside @media was 
never a problem, syntax-wise. It's a difference in *semantics* between 
level 2 and level 3 and which has been planned since a long time. The 
CSS 2.1 spec is often not easy to read, but I'm sure that there is 
consensus that, in Justin's original example[1], Firefox's parsing is 
correct and Opera's is not.

The margin boxes inside @page are a different issue. Unlike @media, 
@page was never designed to contain more than declarations. Everything 
that's put inside @page in level 3 thus has to keep on looking like a 
declaration. Which means, concretely, that it has to be separated from 
level 2 features by a semicolon.

[1] 
http://www.w3.org/mid/00BD06E707F60B4F9D6A3E75C712209D53DBA74D41@NA-EXMSG-C104.redmond.corp.microsoft.com


> > There is an alternative proposal, which might be better in
> > light of the fact that those nested @-rules are going to be
> > allowed in level 3. That proposal is to add no
> > clarifications, but change the grammar in appendix G, with
> > the argument that it is in error, because it forbids
> > something that isn't forbidden by any text in the
> > specification. The media rule would then become:
> >
> >     media
> >
> >       : MEDIA_SYM S* medium [ COMMA S* medium ]*
> >
> >         LBRACE S* [ ruleset | media | page ]* '}' S*
> >       ;
> >
> > A potential practical problem is that it would make current
> > implementations that ignore @page inside @media
> > non-conformant and would delay CSS 2.1 until we have
> > sufficient implementations again.
> > (Unless we promise not to test nested @page for now...)
>
> There are at least three shipping implementations that support @page
> inside @media.

That means it's actually possible to relax the grammar in appendix G and 
still exit CR. Hmm, this solution is starting to look better...


> > Is it too late for a different syntax for margin boxes? E.g.,
> > rewriting example V in 3.5.1:
> >
> >     @page ::top-left { ... }
> >     @page ::bottom-center { ... }
> >
> >     @page :left ::left-middle { ... }
> >     @page :right ::right-middle { ... }
> >
> >     @page :left ::bottom-left-corner { ... }
> >     @page :right ::bottom-right-corner { ... }
> >     @page :first ::bottom-left-corner { ... }
> >     @page :first ::bottom-right-corner { ... }

Just for completeness, here is another, shorter syntax. This is what I 
(incorrectly) believed to be in Paged Media:

    @top-left { ... }
    @bottom-center { ... }

    @left-middle :left { ... }
    @right-middle :right { ... }

    @bottom-left-corner :left { ... }
    @bottom-right-corner :right { ... }
    @bottom-left-corner :first { ... }
    @bottom-right-corner :first { ... }


> The nested bracketed syntax for margin boxes has been in this spec
> ever since it was first published nine years ago. It's been through
> several review cycles, including two last calls and a CR.  Several
> implementations have been shipping this for years.  Making radical
> changes now would be very harsh, and I think would send a very
> harmful message.
>
> In my mind, the viable choice is between keeping the requirement for
> the separating semi-colon (and thereby risking having the
> implementations we need) and removing that requirement (which
> apparently leaves us with forward parsing compatibility issues).

I blame myself for not looking at how those margin boxes were actually 
written. My (lame) excuse is that, knowing how much Håkon was 
interested in Paged Media, I didn't need to. I only checked a few 
things in detail, such as that centered boxes were really centered and 
that margin boxes could have multi-line content. :-(

So, if we can't pull margin boxes outside of the @page block anymore, 
then we'll unfortunately have to accept semicolons.

The only way to avoid the semicolons, I think, is to require instead 
that all margin boxes must come *after* all declaration. Thus this is 
wrong:

    @page {
      @top-left {content: "Chapter 1"}   /* WRONG! */
      margin: 0
    }

and this is correct:

    @page {
      margin: 0;
      @top-left {content: "Chapter 1"}
    }



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 Thursday, 3 July 2008 10:05:24 UTC