- From: Ian Hickson <ian@hixie.ch>
- Date: Fri, 17 May 2002 09:48:10 +0100
- To: fantasai <fantasai@escape.com>
- CC: www-style@w3.org
fantasai wrote: > > Equivalency works both ways If A is a subset of B, then items in A can be equivalent to items in B while items in B are not (all) equivalent to items in A. But whatever. >> It doesn't complicate parsing that much. If your sequence of simple >> selectors consists of exactly '#' then you have the special symbol, >> otherwise '#' will mean the start of an ID. Considering how trivial >> that is, I don't think it's worth using a whole other symbol. > > That may take care of the computer, but you missed the person. A fluently > literate person doesn't read by scanning each character one by one, like > a computer, but picks up visual patterns in a not-strictly-linear > fashion. # stands out, but it's already associated with IDs. It's also associated with colours, but that's no problem. People are cleverer than computers. A '#' on its own doesn't look like a hash. Like you say, humans don't scan by character. They scan the whole line at once. > # -> surrounded by space? > - yes -> subject indicator > - no -> followed by a-z? > - yes -> ID selector > - no -> surrounded by ~, +, or >? > - yes -> subject indicator > - no -> invalid That's not how humans work. At least, it's not how I and the humans I know work. > Using different symbols is much less complicated and allows one to > pick up either one faster and more easily. Using different symbols adds to the complexity of the language by making it look scary. That's not a good thing. (Think of what the typical reaction is to Perl.) > If they both referred to descriptors, it wouldn't be a big deal, > but the subject indicator is pivotal in determining the structure > of the selector and thus in understanding the expression. In my version, it's not really a subject selector, not in the way that :subject, (...) and $ are. Within the :matches() argument nothing is being "selected", it's just a comparison against the document, anchored at one node. > You've done some scripting with Perl, haven't you? Perl uses $ to > indicate the start of a variable name. It also uses @ and %. However, they are always followed by something, not used on their own. Which, to me at least, makes them totally different. >> I just noticed that the '#' character also looks like a placeholder >> more than a '$' character -- compare: >> >> A:matches(B + # + C) >> >> A:matches(B + $ + C) > > > It does not look that way to me. This is a very subjective means of > judgement, however. The '#' is like a box. You fill the box in with the element on the outside of the :matches() element. >> Where else does it say how to handle a '#' somewhere other than at the end? > > It's implied. We learned a long time ago not to leave stuff implied in CSS specs. People always manage to imply the wrong thing. > All the other examples you give translate a more abstract, > mathematical expression into English. I fail to see how ~implying~ '#' at > the beginning of a selector makes it simpler or easier to understand. a:has(b) ...vs a:matches(# b) The first looks closer to English to me. Either way, if you don't like :has(), don't use it. It's just syntactic sugar. > I think that how something "looks" is irrelevant to its superiority as > a syntax. I think how it looks is one of the key criteria. Lisp has a great syntax, technically speaking, but it doesn't _look_ good, and is one of the reasons I couldn't use Lisp for long term projects, despite the fact that it is in many respects a good language. Similarly, I have opted to not use some features of Perl in my projects because they look awful. > If you analyze your sentence there and explain -why- it looks > better, then you'd have an argument. It's subjective, as you said. > My reasoning for why it looks -bad- is as follows: > In every programming language -- CSS is not a programming language. > -- I have ever encountered (which, of course, > is not so very many), the argument to a function is always a -complete- > expression -- one which evaluates to an actual value, be it a number, or a > string, or an aggregate of data, or a pointer to a memory location. Or a string, which is then concatenated with another string and evaluated? > Now, you can argue that the '#' is implied. Very well. If you are so keen > on implying this vital piece of the expression, why should it not be > implied at the beginning of any :matches() argument that begins with a > combinator instead? It's implied at the _end_ :matches(). And the common use case for :has() is with the ' ' combinator, so that :has(b) ...is equivalent to :matches(# b) ...which can't be distinguished from :matches(b) ...if you drop :has(). >> p:has(strong) > > Which encourages people to use that instead of p:has(>strong) even when > the child selector would be more appropriate. The child selector is rarely more appropriate in this case. -- Ian Hickson ``The inability of a user agent to implement part of this specification due to the limitations of a particular device (e.g., non interactive user agents will probably not implement dynamic pseudo-classes because they make no sense without interactivity) does not imply non-conformance.'' -- Selectors, Sec13
Received on Friday, 17 May 2002 04:48:15 UTC