[css3-fonts] simplifying font-variant-ligatures, proposal 2

Given the reaction to my original proposal for simplifying
font-variant-ligatures, I'd like to propose a smaller set of changes,
ones that hopefully cover the majority of use cases while making the
syntax less verbose.

As noted previously, the current syntax is:

  font-variant-ligatures: normal | inherit | [ <common-lig-values> || <discretionary-lig-values> || <historical-lig-values> ]

where

  <common-lig-values>        = [ common-ligatures | no-common-ligatures ]
  <discretionary-lig-values> = [ discretionary-ligatures | no-discretionary-ligatures ]
  <historical-lig-values>    = [ historical-ligatures | no-historical-ligatures ]

OpenType defines certain features as "on by default" and this includes
the common ligature feature 'liga'. So the property values here are not
completely boolean properties, they are really tri-state with possible
states being "use defaults", "explicitly on" or "explicitly off".  In
the default 'font-variant-ligatures: normal' case, 'fi' ligatures will
appear but discretionary ligatures such as 'st' and 'ct' ligatures won't
(fonts can choose which ligatures are classified under which feature but
these examples are a typical pattern).

Additionally, features can be enabled/disabled per-font via
@font-face rules:

  @font-face {
    font-family: DefaultText;
    src: url(xxx.woff) format("woff");
    font-variant: discretionary-ligatures;
  }

  body { font-family: DefaultText; }

  /* override font-specific setting, common ligatures on by default */
  span.special { font-variant-ligatures: no-discretionary-ligatures; }

I think we can eliminate a couple of these 'no-xxx' values by defining
'common-ligatures' to mean "base only" and have the other values
(discretionary, historical) be additive:

  font-variant-ligatures: normal | inherit | no-ligatures | [ common-ligatures || discretionary-ligatures || historical-ligatures ]

In terms of OpenType features this would translate to:

  normal                  == use defaults, both OpenType and font-specific
  no-ligatures            == liga=0, clig=0, dlig=0, hlig=0
  common-ligatures        == liga=1, clig=1, dlig=0, hlig=0 *
  discretionary-ligatures == dlig=1
  historical-ligatures    == hlig=1

  * = (dlig/hlig) explicitly turned off when (discretionary-ligatures/historical-ligatures) 
      not also listed

Note: I've added 'clig' == "contextual ligatures" to common-ligatures,
moving it from 'contextual' in 'font-variant-alternates'.

Using the new syntax with the example above:

  /* override font-specific setting, enable only common ligatures explicitly */
  span.special { font-variant-ligatures: common-ligatures; }

The only situation this wouldn't cover would be one where an
author explicitly wants to disable common ligatures but wants to enable
only historical ligatures (or only discretionary ligatures).

Regards,

John Daggett

Received on Thursday, 23 February 2012 05:23:04 UTC