PEAR is archived and read-only

This mirror preserves historical PEAR package releases and metadata so existing references remain available.

Home » HTML » HTML_CSS » Bug #1084

parseSelectors incorrectly assumes selector structure

Details

Submitted2004-03-27 16:03 UTC
Frommatt at sensibleerection dot com
Assignedthesaur
StatusClosed
PackageHTML_CSS
PHP VersionIrrelevant
Roadmaps(Not assigned)

Comments

[2004-03-27 16:03 UTC] matt at sensibleerection dot com

Description:
------------
parseSelectors allows only one instance of each of element, class, id and pseudo in a selector, and presumes a specific order.

Reproduce code:
---------------
require_once( "HTML/CSS.php" );

$css = new HTML_CSS;

$a = $css->parseSelectors( "#heading .shortname" );
$b = $css->parseSelectors( "#heading .icon" );
$c = $css->parseSelectors( "#heading .icon img" );

Expected result:
----------------
#heading .shortname
#heading .icon
#heading .icon img

Actual result:
--------------
#heading
#heading
#heading

[2004-03-27 21:46 UTC] thesaur at php dot net

Yeah, I knew there was a problem, but I wasn't exactly sure how it should work in the end. The reason you see what you see is that there should be no reason why anyone needs to implement a class for an ID. Of course, dynamic pseudo classes are a different story (e.g., :hover).

Then there is the issue of cascading style sheets which is at the center of your bug report. Selectors may be separated by spaces and then refer to a chain of conditions that must apply before the style is applied.

I will rework the parseSelectors to parse each of the cascaded selectors, as well.

[2004-03-29 04:16 UTC] matt at sensibleerection dot com

In this case it's not the id that's having a class
applied, but a descendent of the id (The difference
between "#heading.shortname" and "#heading .shortname".
Note the space separator in the second.).

Referring to a class descendent of an id does often
make sense. As you may have several ".shortname" classed
elements in the page, but you only want to refer to the
ones that are descendents of "#heading".

[2004-03-29 14:08 UTC] thesaur at php dot net

Which is what I was referring to as cascading selectors. Currently, cascading like that is disabled. But that does not mean that the class expects a certain order. It only places limitations on an individual selector, not space delimited selectors. The current (dumb) workaround is to use a class, because everything after the "." in the initial selector gets passed on unaltered. Of course, this is very unacceptable, but that's the workaround I can offer until I implement a comprehensive solution.