Re: [Selectors] Clarify when universal selector may be omitted

fantasai On 09-10-21 02.41:

> Leif Halvard Silli wrote:


>> Is this meant to have the following meaning: ?
>>
>> ?!? If "*" *is neither* the only component (i.e. w/o prefix)
>>    *nor* immediately preceding a pseudo-element,
>>    THEN  the "*" may be dropped.
>>
>> If the answer is "yes, this is what is meant",

> 

> Yes, that is what is meant, and it is completely *unambiguous*
> due to the grammatical structure created by the use of "is" in
> both places, which is why I'm not dropping the "is".


I think in reality you disagree with what I intended above.

	FIRSTLY:

Change of position: I assume that both these are valid, right?

    *::marker {}/*Var1*/
     ::marker {}/*Var2*/

	SECONDLY:

Why do you specifically call out pseudo-elements? The current 
draft doesn't do that. [1] Or to ask differently, why isn't the 
following,

    *::marker{}

a case of a simple selector sequence where the "*" - quoting the 
text - "is not the only component of a sequence of simple selectors"?

1) Isn't pseudo-element covered by the word 'component'?
2) If yes, then what is 'pseudo-element' a component of, if not of 
a 'simple selector sequence'?
3) If it is a component of a 'simple selector sequences', then it 
is unecessary and confusing to call it out (this is what has 
confused me)

	THIRDLY:

This is what the spec says about what kind of 'component' a 
pseudo-element is:

The "simple selectors" definition paragraph says: [2]

   ]]A simple selector is either a type selector, universal
selector, attribute selector, class selector, ID selector, or
pseudo-class. One pseudo-element may be appended to the last
sequence of simple selectors in a selector.[[

Even if this paragraph defines the list of simple selectors, 
pseudo-element is not described as a simple selector. But it IS 
described as an appendix to a simple selector sequence. Thus it 
ought to be considered a component of a simple selector sequence, 
even if it (may) not (be) a simple selector itself.

3 paragraphs further down it is said, however:

   ]]An empty selector, containing no sequence of simple selectors 
and no pseudo-element, is an invalid selector.[[

Here the pseudo-element is not considered part of the simple 
selector sequence.

The pseudo element definition says: [3]

   ]]Only one pseudo-element may appear per selector, and if 
present it must appear after the sequence of simple selectors that 
represents the subjects of the selector.[[

Here too, pseudo-elements are not considered part of the simple 
selectors sequence.

However, the text about the negation pseudo class talks about both 
the negation pseudo-class and the pseudo-elements as simple 
selectors (why else would it, inside the same parenthesis, 
specifically exclude them both from "simple selectors"?): [4]

   ]]The negation pseudo-class, :not(X), is a functional notation 
taking a simple selector (excluding the negation pseudo-class 
itself and pseudo-elements) as an argument. It represents an 
element that is not represented by the argument.[[

The grammar section also considers pseudo-elements are part of a 
simple selector sequence - it says about pseudo-elements that they 
"occur only in the last simple_selector_sequence" - thus it is 
clearly a 'component' of a simple selector sequence: [5]

]]
pseudo
   /* '::' starts a pseudo-element, ':' a pseudo-class */
   /* Exceptions: :first-line, :first-letter, :before and :after. */
   /* Note that pseudo-elements are restricted to one per selector 
and */
   /* occur only in the last simple_selector_sequence. */
   : ':' ':'? [ IDENT | functional_pseudo ]
   ;
[[

And more directly, in the same grammar: [5]

]]
simple_selector_sequence
   : [ type_selector | universal ]
     [ HASH | class | attrib | pseudo | negation ]*
   | [ HASH | class | attrib | pseudo | negation ]+
   ;
[[

The CSS 2.1 grammar uses 'simple selector' instead of 'sequences, 
but otherwise has the same grammar w.r.t. 'pseudo':

simple_selector
   : element_name [ HASH | class | attrib | pseudo ]*
   | [ HASH | class | attrib | pseudo ]+
   ;

According to section 1.3 of CSS3 selectors, "the components of" a 
simple selector sequence are called "simple selectors": [6]

   ]]what was referred to in CSS2 as a simple selector is now 
called a sequence of simple selectors, and the term "simple 
selector" is now used for the components of this sequence[[

Thus, a pseudo-element, being a component of a sequence of simple 
selectors, should itself be a simple selector.

But then, the same section also discern between simple selectors 
and pseudo-elements ...: [6]

   ]]* new simple selectors including substring matching attribute 
selectors, and new pseudo-classes
     * new pseudo-elements, and introduction of the "::" 
convention for pseudo-elements [[

Finally, the Table of Contents lists simple selectors under 
section 6, while pseudo elements are listed in its own section. 
[7]. CSS 2.1 also discerns similarly (except in the grammar).

	CONCLUSIONS

* Simple selector sequences are made up of two kind of components:
  - simple selectors
  - pseudo elements
* 'Components of simple selectors' are not properly defined

[1] http://www.w3.org/TR/css3-selectors/#universal-selector
[2] http://www.w3.org/TR/css3-selectors/#simple-selectors-dfn
[3] http://www.w3.org/TR/css3-selectors/#pseudo-elements
[4] http://www.w3.org/TR/css3-selectors/#negation
[5] http://www.w3.org/TR/css3-selectors/#grammar
[6] http://www.w3.org/TR/css3-selectors/#changesFromCSS2
[7] http://www.w3.org/TR/css3-selectors/#contents
-- 
leif halvard silli

Received on Thursday, 22 October 2009 00:23:36 UTC