w3c / csswg-drafts

CSS Working Group Editor Drafts
https://drafts.csswg.org/
Other
4.46k stars 657 forks source link

[css-counter-styles] Language-dependent symbols #387

Open Crissov opened 8 years ago

Crissov commented 8 years ago

I’ve been fooling around with @counter-style lately (see repository, which is in an early stage of development). Maybe I’m abusing the technology there, but I think I’ve hit the limitations of the speak-as descriptor.

speak-as: auto | bullets | numbers | words | spell-out | <counter-style-name>

For instance, spell-out makes absolute sense for element-symbols

 @counter-style element-symbols {
  system: fixed;
  range: 1 118;
  speak-as: spell-out;
  symbols:
  'H'                                                                                  'He'
  'Li' 'Be'                                                   'B'  'C'  'N'  'O'  'F'  'Ne' 
  'Na' 'Mg'                                                   'Al' 'Si' 'P'  'S'  'Cl' 'Ar'
  'K'  'Ca' 'Sc' 'Ti' 'V'  'Cr' 'Mn' 'Fe' 'Co' 'Ni' 'Cu' 'Zn' 'Ga' 'Ge' 'As' 'Se' 'Br' 'Kr' 
  'Rb' 'Sr' 'Y'  'Zr' 'Nb' 'Mo' 'Tc' 'Ru' 'Rh' 'Pd' 'Ag' 'Cd' 'In' 'Sn' 'Sb' 'Te' 'I'  'Xe'
  'Cs' 'Ba' 'La' /*
               */'Ce' 'Pr' 'Nd' 'Pm' 'Sm' 'Eu' 'Gd' 'Tb' 'Dy' 'Ho' 'Er' 'Tm' 'Yb' 'Lu' /*
              */ 'Hf' 'Ta' 'W'  'Re' 'Se' 'Ir' 'Pt' 'Au' 'Hg' 'Tl' 'Pb' 'Bi' 'Po' 'At' 'Rn' 
  'Fr' 'Ra' 'Ac' /*
               */'Th' 'Pa' 'U'  'Np' 'Pu' 'Am' 'Cm' 'Bk' 'Cf' 'Es' 'Fm' 'Md' 'No' 'Lr' /*
              */ 'Rf' 'Db' 'Sg' 'Bh' 'Hs' 'Mt' 'Ds' 'Rg' 'Cn' 'uut' 'Fl' 'uup' 'Lv' 'uus' 'uuo';
}

… although one may be tempted to also provide an element-names counter style, which would be language-dependent. With planets, however, speak-as: words would be desired, but the Unicode Names for Venus and Mars default to ‘Female Symbol’ and ‘Male Symbol’, respectively, so we would need to define another, language-dependent style just for speech synthesis, i.e. we‘ll probably never use it:

@counter-style planets {
  system: fixed;
  speak-as: planet-names;
  symbols: '\263F' '\2640' '\2641' '\2642' '\2643' '\2644' '\2645' '\2646';
}
@counter-style planets {
  system: fixed;
  speak-as: words;
  symbols: 'Mercury' 'Venus' 'Earth' 'Mars' 'Jupiter' 'Saturn' 'Uranus' 'Neptune' ;
}

That’s of course now language dependent. It becomes even more apparent if we’re using astronomic symbols for the days of the week, where we’d want to be able to use something like :lang():

@counter-style week-days {
  system: cyclic;
  speak-as:  week-day-names;
  symbols: '\263D' '\2642' '\263F' '\2643' '\2640' '\2644' '\2609';
}
@counter-style week-days { /* default language: English, but undeclared */
  system: cyclic;
  speak-as:  words;
  symbols: 'Monday' 'Tuesday' 'Wednesday' 'Thursday' 'Friday' 'Saturday' 'Sunday';
}
@counter-style week-days:lang(de) /* ← not speced */ {
  symbols: 'Montag' 'Dienstag' 'Mittwoch' 'Donnerstag' 'Freitag' 'Samstag' 'Sonntag';
}

There are also ideas where we’d want no translation or change of pronunciation, e.g. international (military)spelling:

@counter-style spelling {
  system: alphabetic;
  speak-as: lang(EN words); /* ← not speced */
  symbols: 'Alfa' 'Beta' 'Charlie' 'Delta' 'Echo' 'Foxtrot'
           'Golf' 'Hotel' 'India' 'Juliett' 'Kilo' 'Lima' 'Mike' 
           'November' 'Oscar' 'Papa' 'Quebec' 'Romeo' 'Sierra' 
           'Tango' 'Uniform' 'Victor' 'Whiskey' 'X-Ray' 'Yankee' 'Zulu';
}

With graphic symbols, whether from Unicode (or emoji) or image files, you’d almost always want to be able to specify an alt text, which may or may not have a fixed language.

@counter-style proto-sinaitic-emoji {
  system: alphabetic;
  speak-as: proto-sinaitic-phonics;
  symbols: '\1F42E' '\1F3E0' '\1F64C' '\270B' '\1F30A' '\1F40D' '\1F441' '\1F5FF' '\2600' '\274C';
  suffix: '\FE0F';
}
@counter-style proto-sinaitic-phonics {
  system: alphabetic;
  speak-as: words;
  symbols: 'ʾalp' 'bet' 'hll' 'kaf' 'mayim' 'hahš' 'ʿen' 'roʾš' 'šimš' 'tãw';
}
@counter-style proto-sinaitic-emoji-english {
  system: extends proto-sinaitic-emoji;
  speak-as: proto-sinaitic-english;
}
@counter-style proto-sinaitic-english {
  system: extends: proto-sinaitic-phonics;
  symbols: 'ox' 'house' 'jubilation' 'palm of hand' 'water' 'snake' 'eye' 'head' 'sun' 'mark';
}

I’m not exactly sure what would be a better solution (e.g. symbols: alt(url(image), '\1234', 'literal') …), but if authors actually adopted @counter-style, which is currently only available in Mozilla Firefox and Antenna House Formatter as far as I know, they would probably want to do even crazier things than I’ve done and then run into this problem.

fantasai commented 8 years ago

Ok, I can see that having some kind of language dependency in @counter-style could be useful. Right now it can be done by creating a different counter style per language and assigning them accordingly, but that is admittedly awkward. I imagine this would go into Counter Styles L4, though.

Crissov commented 8 years ago

Sure thing, I didn’t expect it for level 3 at all.