Re: Selecting selectors

On Wed, 17 Mar 1999, Ignacio Javier wrote:
>>>  <h1>
>>>      <p> [first] </p>
>>>  </h1>
>>>  <p>
>>>     [second]
>>>     I'm cool, I'm a good guy, but someone is using my
>>>     personality!??? I fact I'm the paragraph loved by the one
>>>     above, his name is h1 > p ....
>>>  </p>
>> That would be h1 + p, I think.
> I would get the last Bad P too

Yes. I was just correcting your comment saying it was "h1 > p" (which
would match the first <p> in this document (at the top), not this
one, the second).


>>>  <h1> </h1>
>>>  <p>
>>>   [third]
>>>   I'm a very bad guy, but fortunatelly people confuses me with the
>>>   paragraph above, ha ha!!!
>>>  </p>
>> The first one can be selected by
>>    h1:first-child + p
> suppose you mean p:first-child + p

No. The first p of the standalone ps, labelled "[second]" above, is
definitely selected by the

   h1:first-child + p

...selector.

Your

   p:first-child + p

...selector matches nothing in this tree (it would match a P that came
directly after another P, but only if that P was the first element in
its parent).


> I need to clarify the following: (excuses if I use bad terminology):
> If you want a selector syntax to be capable of complex selections it
> might be able to select in base to structures. I mean, if you have a
> document in a stable way (loaded) then you can have all info about
> structure on it, and why not refer to selectors by tree?
> Example:
>   (h1 > p) + p
>   h1>p will refer to p that.....
>   h1:contains(p) will refer to h1 that....
> but more generic (...) denote tree structure and so:
>   (h1 > p) + p 
> denotes a p that has sibling relation with an h1 that has a p child
> in structure
>   p < h1
> will denote as selected an h1 that has a p as child, but:
>   (p < h1) would be equal to (h1 > p)

The above can mostly be done by using :contains() (although in its
current incarnation I would have trouble emulating "(h1 > p) + p"
accurately -- the closest you can get is "(h1 p) + p" -- see below).

Your suggestion has one major problem, which is that it introduces
nesting at the selector level. The CSS grammar currently has no
mechanism for explaining how this works, other than functions, which
is what the :contains() idea uses. I would be wary of playing fast and
loose with the core grammar of CSS, as doing so implies having to
rewrite parts of CSS implementations' parsers.


> h1 > ( p + p em )

h1:contains( p + p em )

Although again, there is no way to specify that the contents must be
immediate children.

Hmm. This is something that should be fixed. 

The only way I can see of doing it would be to have two pseudo-
selectors. I don't like that idea though.

As in:
 
   h1:ancestor-of( p + p em )
   h1:parent-of(p + p em)

There must be a better way, though.

-- 
Ian Hickson 
U+2642 U+2651
U+262E U+2603 U+263A

Received on Tuesday, 16 March 1999 21:15:51 UTC