- From: Maciej Stachowiak <mjs@apple.com>
- Date: Mon, 5 May 2008 14:49:20 -0700
- To: Lachlan Hunt <lachlan.hunt@lachy.id.au>
- Cc: John Resig <jresig@mozilla.com>, public-webapi@w3.org
On May 5, 2008, at 2:13 PM, Lachlan Hunt wrote: > > *Solution 5* > > Define the methods to behave as if an implicit :scope selector > and descendant combinator were prepended to each selector in > the group. > > This would work by taking the selector and appending the equivalent > of ":scope " to the beginning of it, and then parsing as > usual. :scope could be implemented in any way the UA wanted here > since it's not actually used by the author. > While this looks promising on the surface, the real problem lies in > the implementation of the selector parsing. This requires signifant > changes to the grammar of selectors, and thus alteration of the > selector engines in browsers. > > Consider the following selector: > > ">strong, >em" > > The expectation would be for this to become: > > ":scope >strong, :scope >em" > > The question is how to parse and convert it. One possibility is to make the scoped API (whether that is querySelector on elements or some new method) only accept a single selector, not a group of selectors. This would remove any parsing difficulties. Also, if commas are only ever used to separate the selectors in a group in Selector syntax, then prepending ":scope " and inserting " :scope " after every comma before parsing would work. I believe this is currently true of Selectors, though it may change in the future. I would guess the only likely place for commas to appear would be in parameters to function-like pseudo-classes, in which case the algorithm above but excluding commas nested inside parentheses would be more future-proof. Detail of the algorithm: 1. Initialize nesting level to 0 2. Initialize the output string to the empty string 3. While characters in the input string remain: 3.a. read the current character 3.b. if the current character is: ",": if the nesting level is 0, append ", :scope " to the output string "(": increase the nesting level by 1, and append "(" to the output string ")": decrease the nesting level by 1, and append ")" to the output string anything else: append the current character to the output string 3.c. advance to the next character 4. return the output string Regards, Maciej
Received on Monday, 5 May 2008 21:49:58 UTC