1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
from fontFeatures import Substitution
from fontFeatures.feaLib import FeaParser
import pytest
import re
def assertSufficientlyEqual(s1, s2):
def alltrim(a):
a = re.sub("lookupflag 0;", "", a)
a = re.sub("#.*", "", a)
a = re.sub("\\s+", " ", a)
a = re.sub("table GDEF.*GDEF;", "", a)
a = re.sub(" ; ", " ", a)
return a.strip()
assert alltrim(s1) == alltrim(s2)
@pytest.mark.parametrize(
"s",
[
# pytest.param("lookup dummy { } dummy;", id="single_dummy"),
# pytest.param("lookup dummy1 { } dummy1; lookup dummy2 { } dummy2;", id="double_dummy"),
pytest.param("lookup dummy { sub a by b; } dummy;", id="single_subst"),
pytest.param(
"lookup dummy { sub x a' y by b; } dummy;", id="single_marked_subst"
),
pytest.param(
"lookup dummy { sub [a b] by [d e]; } dummy;", id="single_group_subst"
),
pytest.param(
"lookup dummy { sub [a b]' y by [d e]; } dummy;",
id="single_marked_group_subst",
),
pytest.param(
"lookup dummy { sub one two [a b]' y by [d e]; } dummy;",
id="single_prepost_1",
),
pytest.param(
"lookup dummy { sub [one two] [a b]' y by [d e]; } dummy;",
id="single_prepost_2",
),
pytest.param("lookup dummy { sub f_f_i by f f i; } dummy;", id="decomposition"),
pytest.param(
"lookup dummy { sub f_f_i' x by f f i; } dummy;", id="decomposition_marked"
),
pytest.param(
"lookup dummy { sub [a b] f_f_i' x by f f i; } dummy;",
id="decomposition_context",
),
pytest.param(
"lookup dummy { sub ampersand from [ampersand.1 ampersand.2 ampersand.3]; } dummy;",
id="alternate",
),
pytest.param(
"lookup dummy { sub x ampersand' from [ampersand.1 ampersand.2 ampersand.3]; } dummy;",
id="contextual_alternate",
),
pytest.param(
"lookup dummy { sub [one one.oldstyle] [slash fraction] [two two.oldstyle] by onehalf; } dummy;",
id="fraction",
),
pytest.param(
"lookup dummy { sub [o u] f' f' by f_f; } dummy;", id="marked_ligature"
),
pytest.param(
"lookup dummy { sub [e e.begin]' t' c by ampersand; } dummy;",
id="contextual",
),
pytest.param(
"lookup dummy { sub a by b; } dummy; lookup chain { sub a' lookup dummy; } chain; ",
id="chain",
),
pytest.param(
"lookup dummy { sub a by b; } dummy; lookup chain { sub x [one two] a' lookup dummy b' lookup dummy; } chain; ",
id="chain2",
),
pytest.param("lookup dummy { rsub a b' c by d; } dummy; ", id="rsub"),
pytest.param("lookup dummy { ignore sub a d' d; } dummy; ", id="ignore"),
pytest.param(
"lookup a { sub a by b; sub c by d; } a; feature calt { lookup a; } calt;",
id="feature",
),
pytest.param("lookup dummy { pos one <-80 0 -160 0>; } dummy;", id="pos_one"),
pytest.param(
"lookup dummy { pos [one two] <-80 0 -160 0>; } dummy;", id="pos_one_group"
),
pytest.param(
"lookup dummy { pos a [one two]' <-80 0 -160 0>; } dummy;",
id="pos_one_contexual",
),
pytest.param(
"lookup dummy { pos s f' 10 t; } dummy;", id="pos_one_contextual_alt_format"
),
pytest.param(
"lookup dummy { pos T -60 a <-40 0 -40 0>; } dummy;", id="pos_two"
),
pytest.param(
"lookup dummy { pos [X Y] -60 a <-40 0 -40 0>; } dummy;", id="pos_two_group"
),
pytest.param("lookup dummy { pos T a -100; } dummy;", id="pos_two_one_null"),
pytest.param(
"lookup dummy { pos cursive meem.medial <anchor 500 20> <anchor 0 -20>; } dummy;",
id="pos_cursive1",
),
pytest.param(
"lookup dummy { pos cursive meem.init <anchor NULL> <anchor 0 -20>; } dummy;",
id="pos_cursive2",
),
# pytest.param(
# """markClass [acute grave] <anchor 150 -10> @TOP_MARKS;
# lookup dummy {
# pos base [a e o u] <anchor 250 450> mark @TOP_MARKS;
# } dummy;
# """, id="mark_attachment"
# ),
pytest.param(
"lookup dummy { pos X [A B]' -40 B' -40 A' -40 Y; } dummy;",
id="pos_contextual",
),
# pytest.param("lookup dummy { sub a b by c; } dummy; feature calt { lookup dummy; } calt;", id="lookup_reference"),
pytest.param(
"lookup dummy { lookupflag IgnoreMarks; sub a b by c; } dummy;",
id="lookup_flag",
),
# pytest.param("feature calt { lookupflag IgnoreMarks; sub a b by c; } calt;", id="flag_in_feature"),
# pytest.param("feature calt { sub x by y; lookupflag IgnoreMarks; sub a b by c; } calt;", id="switch_flags"),
],
)
def test_round_trip(s):
parser = FeaParser(s)
parser.parse()
assertSufficientlyEqual(parser.ff.asFea(), s)
# Mark to mark
# Mark to lig
# Ignore pos
# Languages
|