Lookups may have some parameters to skip certain glyphs. For example, a lookup converting "fi" to a ligature should not be hindered by any intervening combining diacritics. Therefore, glyphs may be assigned a class.
It is often convenient to reference a number of glyphs at once.
For example, to convert all Latin lowercase letters to uppercase,
you do not usually want to type in the whole alphabet two times.
It is therefore possible to use a list instead of one glyph.
Thus, [a e i o u y]
refers to six glyphs.
[a-z]
refers to all glyphs from "a" up to "z", which means the
whole lower-case alphabet if you have ordered the glyphs in the font in this
way.
If you have defined a glyph group you can use it in lists as well:
@marksAbove
means all glyphs in the group you have defined
previously.
[@marksAbove a e i o u y]
refers to all of the group plus six
glyphs.
[@marksAbove @marksBelow @marksAttachedRight]
combines all
the glyphs in the three groups.
[@marksAbove - [acutecomb gravecomb]]
refers to all of the group
except the combing acute and grave accents.
[@marksAbove - [@greekDoubleMarks tonoscomb]]
refers to all of
the group except for the glyphs in the @greekDoubleMarks
group
and "tonoscomb".
With these simple constructs, a lot of nesting is allowed (and may often come in extremely useful).
Before glyph groups can be used, they first have to be declared:
group @<name> <glyph list>
[<glyph class>];
The glyph class may be either base
for a base glyph,
ligature
for a ligature, component
for a ligature
component or mark
for a combining mark.
It may also be left out.
A glyph may only be assigned a glyph class once.
The "fi" ligature lookup should not heed any intervening diacritical marks. To ignore these, a lookup definition can start thus:
lookup ffi {
ignore mark;
sub f f i -> fi;
sub f l -> fl;
}
This will ignore all marks. Some lookups, however, may ignore only marks of one mark attachment class. This allows mark attachment lookups to apply to a base glyph and a mark above without minding marks that attach below the base glyph:
lookup marksAbove {
ignore mark except @marksAbove;
[...]
}
Here, "@marksAbove" must have been defined as a mark group, i.e. with
group @marksAbove [<glyph names>] mark;
.
One lookup should have one type; it is not possible, for example, to mix single substitution and ligature substitution in one lookup. It is possible, however, to give multiple lookups the same name, so that they may be referred to at once in a feature definition using that name.