| from fontTools.otlLib.builder import ( |
| AlternateSubstBuilder, |
| ChainContextPosBuilder, |
| ChainContextSubstBuilder, |
| LigatureSubstBuilder, |
| MultipleSubstBuilder, |
| CursivePosBuilder, |
| MarkBasePosBuilder, |
| MarkLigPosBuilder, |
| MarkMarkPosBuilder, |
| ReverseChainSingleSubstBuilder, |
| SingleSubstBuilder, |
| ClassPairPosSubtableBuilder, |
| PairPosBuilder, |
| SinglePosBuilder, |
| ChainContextualRule |
| ) |
| from fontTools.otlLib.error import OpenTypeLibError |
| from fontTools.ttLib import TTFont |
| from fontTools.misc.loggingTools import CapturingLogHandler |
| import logging |
| import pytest |
| |
| |
| @pytest.fixture |
| def ttfont(): |
| glyphs = """ |
| .notdef space slash fraction semicolon period comma ampersand |
| quotedblleft quotedblright quoteleft quoteright |
| zero one two three four five six seven eight nine |
| zero.oldstyle one.oldstyle two.oldstyle three.oldstyle |
| four.oldstyle five.oldstyle six.oldstyle seven.oldstyle |
| eight.oldstyle nine.oldstyle onequarter onehalf threequarters |
| onesuperior twosuperior threesuperior ordfeminine ordmasculine |
| A B C D E F G H I J K L M N O P Q R S T U V W X Y Z |
| a b c d e f g h i j k l m n o p q r s t u v w x y z |
| A.sc B.sc C.sc D.sc E.sc F.sc G.sc H.sc I.sc J.sc K.sc L.sc M.sc |
| N.sc O.sc P.sc Q.sc R.sc S.sc T.sc U.sc V.sc W.sc X.sc Y.sc Z.sc |
| A.alt1 A.alt2 A.alt3 B.alt1 B.alt2 B.alt3 C.alt1 C.alt2 C.alt3 |
| a.alt1 a.alt2 a.alt3 a.end b.alt c.mid d.alt d.mid |
| e.begin e.mid e.end m.begin n.end s.end z.end |
| Eng Eng.alt1 Eng.alt2 Eng.alt3 |
| A.swash B.swash C.swash D.swash E.swash F.swash G.swash H.swash |
| I.swash J.swash K.swash L.swash M.swash N.swash O.swash P.swash |
| Q.swash R.swash S.swash T.swash U.swash V.swash W.swash X.swash |
| Y.swash Z.swash |
| f_l c_h c_k c_s c_t f_f f_f_i f_f_l f_i o_f_f_i s_t f_i.begin |
| a_n_d T_h T_h.swash germandbls ydieresis yacute breve |
| grave acute dieresis macron circumflex cedilla umlaut ogonek caron |
| damma hamza sukun kasratan lam_meem_jeem noon.final noon.initial |
| by feature lookup sub table uni0327 uni0328 e.fina |
| """.split() |
| glyphs.extend("cid{:05d}".format(cid) for cid in range(800, 1001 + 1)) |
| font = TTFont() |
| font.setGlyphOrder(glyphs) |
| return font |
| |
| |
| class MockBuilderLocation(object): |
| def __init__(self, location): |
| self.location = location |
| |
| def __str__(self): |
| return "%s:%s" % self.location |
| |
| |
| def test_unsupported_subtable_break_1(ttfont): |
| location = MockBuilderLocation((0, "alpha")) |
| |
| logger = logging.getLogger("fontTools.otlLib.builder") |
| |
| with CapturingLogHandler(logger, "INFO") as captor: |
| builder = SinglePosBuilder(ttfont, location) |
| builder.add_subtable_break(MockBuilderLocation((5, "beta"))) |
| builder.build() |
| |
| captor.assertRegex('5:beta: unsupported "subtable" statement for lookup type') |
| |
| def test_chain_pos_references_GSUB_lookup(ttfont): |
| location = MockBuilderLocation((0, "alpha")) |
| builder = ChainContextPosBuilder(ttfont, location) |
| builder2 = SingleSubstBuilder(ttfont, location) |
| builder.rules.append(ChainContextualRule([], [], [], [[builder2]])) |
| |
| with pytest.raises(OpenTypeLibError, match="0:alpha: Missing index of the specified lookup, might be a substitution lookup"): |
| builder.build() |