- From: Simon Sapin <simon.sapin@exyr.org>
- Date: Fri, 05 Apr 2013 16:48:46 +0200
- To: Brian Kardell <bkardell@gmail.com>
- CC: "www-style@w3.org" <www-style@w3.org>
Le 08/03/2013 02:39, Brian Kardell a écrit :
> A recent discussion about adding Set operations on another list prompted
> me to discuss something to Tab which I've mulled around (even
> prollyfilled) in the past and think it's worth proposing...
>
> CSS selectors operate on _sets_ of elements, but until recently
> (:matches/:not) we've had nothing in the way of logical selectors or any
> language constructs that hinted at set oriented language. This seems a
> shame to me as sets and logic gates are some of the most powerful
> concepts in CS. The relationship feels natural to me.
>
> This proposal would require us to get complex selectors inside, but
> essentially I am proposing some logical combinators like
> :anyof, :allof, :oneof, :noneof to act as predicates which allow some
> very rich selection. Examples/more details in my blog post:
>
> http://briankardell.wordpress.com/2013/03/07/logical-psuedo-selectors-a-proposal/
I think that Selectors can already express all logical operations.
Juxtaposition of simple selectors is AND:
input[type=text]:first-child
The comma is OR:
h1, h2, h3
:not() is eponymous, and :matches() is a no-op that just provides grouping.
AND, OR, NOT and grouping are enough to express any boolean expression.
(So is NAND by itself, but it’s not pretty ;))
As mentioned elsewhere in this thread, it helps to think of :not() and
:matches() as taking not comma-separated arguments, but a single
argument that is a selector list where the comma has its usual OR meaning.
Now, let’s get this out of the way: the :anyof() and :noneof()
pseudo-classes proposed in the blog post are exactly the same as
:matches() and :not(), respectively. We have a sub-thread on the naming
so I won’t focus on that again.
That leaves :allof() and :oneof().
:allof() is AND, which is just juxtaposition. In case more than one of
:allof()’s arguments contain a combinator, :matches() comes to the rescue:
:allof(.foo, .bar) → .foo.bar
:allof(.foo, ol li) → ol li.foo
:allof(.foo .bar, ol li) → .foo .bar:matches(ol li)
Finally, :oneof() is XOR, which can be expressed as a combination of
AND, OR, and NOT.
:oneof(.foo, .bar) → .foo:not(.bar), .bar:not(.foo)
It gets messy with more XOR arguments, but it’s still doable.
So, only :oneof() is arguably useful, but is there really an use case
for XOR in selectors to begin with?
--
Simon Sapin
Received on Friday, 5 April 2013 14:49:09 UTC