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.

Glyph Lists

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).

Glyph Groups

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.

Lookup Definitions

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.