- From: Andrew Fedoniouk <news@terrainformatica.com>
- Date: Fri, 26 Sep 2008 10:20:14 -0700
- To: Brad Kemper <brkemper.comcast@gmail.com>
- CC: Mike Wilson <mikewse@hotmail.com>, www-style@w3.org
Brad Kemper wrote:
>
>
> On Sep 26, 2008, at 5:46 AM, Mike Wilson wrote:
>
>> Brad Kemper wrote:
>>> But if the author wanted it to act as a constant,
>>> where "first rule overrides later rules", he
>>> could add a keyword to that rule that would
>>> accomplish that by adding 1,000,000 to the
>>> specificity calculation:
>>
>> @define constant {
>> mySimpleVariable: 5px;
>> myComplexVariable {
>> width: 5em;
>> height: 5em;
>> }
>> }
>>
>> But how would you treat a subsequent
>> @define constant mySimpleVariable
>> assignment in the same document?
>>
>> This is where Andrew wants the first clause to have
>> precedence and this means we either have to invent a
>> position-dependent specificity calculation or change
>> the cascade algorithm.
>
> In my view, if you added the keyword "constant" to the variable
> definition, then it would act more like a constant, with the first one
> taking precedence, and subsequent imported ones useful as default
> values in case the first one is missing. As Andrew described. I don't
> see any reason to fight against this; you can have your cake and eat
> it too.
>
>
>> We already have !important for explicitly pointing
>> out a certain rule to have precedence.
>
> Not the same thing. If you have two rules in which !important is
> applied to the same value with the same specificity, then the second
> one wins. Which is opposite of how constants work. The whole idea
> behind constants is that they are like variables that don't change
> once declared. That is a useful thing to have.
>
>
I should mention following:
Adding @const'ants in the way they proposed here
http://wiki.csswg.org/ideas/constants
does not change current basic principles of CSS architecture.
1) CSS rules is a list of static declarations. CSSOM does not count as
it belongs to JS/DOM more than to CSS.
2) Once parsed selectors (and so specificity of rules) and attributes
cannot be changed by CSS means. CSS declarations are constants by their
nature.
Adding @const'ants is extremely easy to add to existing CSS parsers.
While parsing particular style sheet:
1) Parsing of style sheet happens in presence of so called parsing
context that includes among
other things reference to table of constants in parent style sheet
(if any);
2) When you meet @const NAME: list-of-tokens; construction then add
NAME/list-of-tokens to the table of consts for the sheet. If it is
already there or is found
in parent tables then do nothing.
3) When you meet constant insertion point ( e.g. @NAME ) then push back
list-of-tokens found
under the NAME (locally or in parents) into the parser. So parser
will treat that
list-of-tokens as if they were there.
Done.
That is really easy to do and it does not require any major changes in
CSS grammar and operating principles.
If for some crazy reasons you need exactly variables that could be
changed in runtime then you can use
CSSOM and modify rules there in the way you want.
--
Andrew Fedoniouk.
http://terrainformatica.com
Received on Friday, 26 September 2008 17:29:49 UTC