def test_buildLookup(self): s1 = builder.buildSingleSubstSubtable({"one": "two"}) s2 = builder.buildSingleSubstSubtable({"three": "four"}) lookup = builder.buildLookup([s1, s2], flags=7) self.assertEqual(getXML(lookup.toXML), '<Lookup>' ' <!-- LookupType=1 -->' ' <LookupFlag value="7"/>' ' <!-- SubTableCount=2 -->' ' <SingleSubst index="0">' ' <Substitution in="one" out="two"/>' ' </SingleSubst>' ' <SingleSubst index="1">' ' <Substitution in="three" out="four"/>' ' </SingleSubst>' '</Lookup>')
def parseSingleSubst(lines, font, _lookupMap=None): mapping = {} for line in lines: assert len(line) == 2, line line = makeGlyphs(line) mapping[line[0]] = line[1] return otl.buildSingleSubstSubtable(mapping)
def test_buildLookup_conflictingSubtableTypes(self): s1 = builder.buildSingleSubstSubtable({"one": "two"}) s2 = builder.buildAlternateSubstSubtable({"one": ["two", "three"]}) with pytest.raises(AssertionError, match="all subtables must have the same LookupType" ) as excinfo: builder.buildLookup([s1, s2])
def test_buildLookup(self): s1 = builder.buildSingleSubstSubtable({"one": "two"}) s2 = builder.buildSingleSubstSubtable({"three": "four"}) lookup = builder.buildLookup([s1, s2], flags=7) assert getXML(lookup.toXML) == [ "<Lookup>", ' <LookupType value="1"/>', ' <LookupFlag value="7"/>', " <!-- SubTableCount=2 -->", ' <SingleSubst index="0">', ' <Substitution in="one" out="two"/>', " </SingleSubst>", ' <SingleSubst index="1">', ' <Substitution in="three" out="four"/>', " </SingleSubst>", "</Lookup>", ]
def test_buildLookup_badFlags(self): s = builder.buildSingleSubstSubtable({"one": "two"}) self.assertRaisesRegex( AssertionError, "if markFilterSet is None, " "flags must not set LOOKUP_FLAG_USE_MARK_FILTERING_SET; " "flags=0x0010", builder.buildLookup, [s], builder.LOOKUP_FLAG_USE_MARK_FILTERING_SET, None) self.assertRaisesRegex( AssertionError, "if markFilterSet is not None, " "flags must set LOOKUP_FLAG_USE_MARK_FILTERING_SET; " "flags=0x0004", builder.buildLookup, [s], builder.LOOKUP_FLAG_IGNORE_LIGATURES, 777)
def buildSubstitutionLookups(gsub, allSubstitutions): """Build the lookups for the glyph substitutions, return a dict mapping the substitution to lookup indices.""" firstIndex = len(gsub.LookupList.Lookup) lookupMap = {} for i, substitutionMap in enumerate(allSubstitutions): lookupMap[substitutionMap] = i + firstIndex for subst in allSubstitutions: substMap = dict(subst) lookup = buildLookup([buildSingleSubstSubtable(substMap)]) gsub.LookupList.Lookup.append(lookup) assert gsub.LookupList.Lookup[lookupMap[subst]] is lookup return lookupMap
def test_buildLookup_markFilterSet(self): s = builder.buildSingleSubstSubtable({"one": "two"}) flags = (builder.LOOKUP_FLAG_RIGHT_TO_LEFT | builder.LOOKUP_FLAG_USE_MARK_FILTERING_SET) lookup = builder.buildLookup([s], flags, markFilterSet=999) self.assertEqual(getXML(lookup.toXML), '<Lookup>' ' <!-- LookupType=1 -->' ' <LookupFlag value="17"/>' ' <!-- SubTableCount=1 -->' ' <SingleSubst index="0">' ' <Substitution in="one" out="two"/>' ' </SingleSubst>' ' <MarkFilteringSet value="999"/>' '</Lookup>')
def test_buildLookup_badFlags(self): s = builder.buildSingleSubstSubtable({"one": "two"}) with pytest.raises( AssertionError, match=("if markFilterSet is None, flags must not set " "LOOKUP_FLAG_USE_MARK_FILTERING_SET; flags=0x0010"), ) as excinfo: builder.buildLookup([s], builder.LOOKUP_FLAG_USE_MARK_FILTERING_SET, None) with pytest.raises( AssertionError, match=("if markFilterSet is not None, flags must set " "LOOKUP_FLAG_USE_MARK_FILTERING_SET; flags=0x0004"), ) as excinfo: builder.buildLookup([s], builder.LOOKUP_FLAG_IGNORE_LIGATURES, 777)
def test_buildLookup_markFilterSet(self): s = builder.buildSingleSubstSubtable({"one": "two"}) flags = (builder.LOOKUP_FLAG_RIGHT_TO_LEFT | builder.LOOKUP_FLAG_USE_MARK_FILTERING_SET) lookup = builder.buildLookup([s], flags, markFilterSet=999) assert getXML(lookup.toXML) == [ "<Lookup>", ' <LookupType value="1"/>', ' <LookupFlag value="17"/><!-- rightToLeft useMarkFilteringSet -->', " <!-- SubTableCount=1 -->", ' <SingleSubst index="0">', ' <Substitution in="one" out="two"/>', " </SingleSubst>", ' <MarkFilteringSet value="999"/>', "</Lookup>", ]
def build(self): subtable = otl.buildSingleSubstSubtable(self.mapping) return self.buildLookup_([subtable])
def test_buildLookup_conflictingSubtableTypes(self): s1 = builder.buildSingleSubstSubtable({"one": "two"}) s2 = builder.buildAlternateSubstSubtable({"one": ["two", "three"]}) self.assertRaisesRegex( AssertionError, "all subtables must have the same LookupType", builder.buildLookup, [s1, s2])