# OpenType Feature File specification, section 4.h, example 1.
# http://www.adobe.com/devnet/opentype/afdko/topic_feature_file_syntax.html

languagesystem DFLT dflt;
languagesystem latn dflt;
languagesystem latn DEU;
languagesystem latn TRK;
languagesystem cyrl dflt;

feature smcp {
    sub [a - z] by [A.sc - Z.sc];

    # Since all the rules in this feature are of the same type, they
    # will be grouped in a single lookup.  Since no script or language
    # keyword has been specified yet, the lookup will be registered
    # for this feature under all the language systems.
} smcp;

feature liga {
    sub f f by f_f;
    sub f i by f_i;
    sub f l by f_l;

    # Since all the rules in this feature are of the same type, they
    # will be grouped in a single lookup.  Since no script or language
    # keyword has been specified yet, the lookup will be registered
    # for this feature under all the language systems.

    script latn;
    language dflt;
    # lookupflag 0;      (implicit)
    sub c t by c_t;
    sub c s by c_s;

    # The rules above will be placed in a lookup that is registered
    # for all the specified languages for the script latn, but not any
    # other scripts.

    language DEU;
    # script latn;       (stays the same)
    # lookupflag 0;      (stays the same)
    sub c h by c_h;
    sub c k by c_k;

    # The rules above will be placed in a lookup that is registered
    # only under the script latn, language DEU.

    language TRK;

    # This will inherit both the top level default rules - the rules
    # defined before the first 'script' statement, and the
    # script-level default rules for 'latn': all the lookups of this
    # feature defined after the 'script latn' statement, and before
    # the language DEU statement.  If TRK were not named here, it
    # would not inherit the default rules for the script latn.
} liga;

# TODO(sascha): Uncomment once we support 'pos' statements.
# feature kern {
#     pos a y -150; 
#     # [more pos statements]
#     # All the rules in this feature will be grouped in a single lookup
#     # that is is registered under all the language systems.
# } kern;
