Re: Selector Parsing for Selectors API

On Mon, Jan 14, 2013 at 6:05 AM, Lachlan Hunt <lachlan.hunt@lachy.id.au> wrote:
> On 2012-10-30 11:42, Lachlan Hunt wrote:
>> Additionally, I would like to move the definition for relative selectors
>> and the related parsing to Selectors 4.  This is a concept I defined in
>> Selectors API Level 2, which basically allows selectors to begin with a
>> combinator and have an implied :scope.
>>
>> http://dev.w3.org/2006/webapi/selectors-api2/#grammar
>
> I see that Selectors 4 has since introduced the concept of
> "scope-relative selectors", which seems to be what I was asking for.
> Though, there are some issues with the way it is currently written.
>
> http://dev.w3.org/csswg/selectors4/#scoping
>
> Firstly, the example in this section states that element.find() uses
> scope-contained selectors like scoped stylesheets in HTML.  But it
> doesn't. It uses scope relative selectors. These are different because
> .find() needs to be able to match elements that are not descendants of
> the context object.

Sorry, I believe that was an oversight, since that example was written
before we added scope-relative.  Fixed now.

> Secondly, the current scope-relative selector definition states:
>
>> With this method of scoping, ":scope " (the :scope pseudo-class
>> followed by a space) is implied at the beginning of each complex
>> selector, allowing them to begin syntactically with a combinator. The
>> scoping element matches this implied :scope selector, but does not
>> limit which elements match.
>
> The find(), findAll() and matches() methods were designed with special
> rules that defined when :scope should and should not be prepended to
> each selector, which are not properly covered by the above definition.
> These are the rules used in Selectors API:
>
> ---
>
> 1. If the relative selector begins with a combinator, then prepend the
>    simple selector ":scope" to the relative selector.
>
> 2. Otherwise, if the reference nodes is an empty collection, do nothing.
>
> 3. Otherwise, if any compound selector within relative selector
>    includes a functional pseudo-class that accepts a selector as its
>    parameter, and which contains the ":scope" pseudo-class anywhere
>    within it, then do nothing.
>
> 4. Otherwise, if the relative selector includes :scope within any
>    compound or simple selector, then do nothing.
>
> 5. Otherwise, if the scope flag is set, prepend the simple selector
>    ":scope" and a descendant combinator (' ') to the relative selector.

That phrasing was intentional, but I don't recall why.  I remember
that fantasai and I argued about it, though.  fantasai, any insights?

~TJ

Received on Tuesday, 15 January 2013 06:01:46 UTC