L iddlmZddlmZmZmZddlmZddlm Z ddl m Z m Z m Z ddlmcmZddlZddlZddlZej(eZGddeZGd d eZy) )FeatureLibError)LexerIncludingLexerNonIncludingLexer)VariableScalar) getEncoding)bytechrtobytestostrNceZdZdZiZeZeddDchc]}d|z c}}ZeddDchc]}d|z c}}Z djdZ d Z d Z d Z d Z d ZdZdZdZdZdZdkdZdZdZdZdZdZdZdZdZdZdZdZdZ d Z!d!Z"d"Z#d#Z$d$Z%d%Z&d&Z'd'Z(d(Z)d)Z*d*Z+d+Z,d,Z-d-Z.d.Z/d/Z0d0Z1d1Z2d2Z3e4d3Z5e4d4Z6d5Z7d6Z8d7Z9d8Z:d9Z;d:Zd=Z?d>Z@d?ZAd@ZBdAZCdBZDdCZEdDZFdEZGdkdFZHdGZIdHZJdIZKdJZLdKZMdLZNdMZO dldNZPdOZQdPZRdQZSdRZTdSZUdTZVdUZWdVZXdWZYdXZZdYZ[dZZ\d[Z]dkd\Z^d]Z_d^Z`d_Zad`ZbdaZcdbZddcZeddZfdeZgdkdfZhe4dgZidhZjdiZkycc}}wcc}}w)mParsera Initializes a Parser object. Example: .. code:: python from fontTools.feaLib.parser import Parser parser = Parser(file, font.getReverseGlyphMap()) parsetree = parser.parse() Note: the ``glyphNames`` iterable serves a double role to help distinguish glyph names from ranges in the presence of hyphens and to ensure that glyph names referenced in a feature file are actually part of a font's glyph set. If the iterable is left empty, no glyph name in glyph set checking takes place, and all glyph tokens containing hyphens are treated as literal glyph names, not as ranges. (Adding a space around the hyphen can, in any case, help to disambiguate ranges from glyph names containing hyphens.) By default, the parser will follow ``include()`` statements in the feature file. To turn this off, pass ``followIncludes=False``. Pass a directory string as ``includeDir`` to explicitly declare a directory to search included feature files in. zss%02ddzcv%02dNc d|vr-ddlm}|dd|r td|jd}|r7tdt |dk(rdnd d d j d |Dt ||_|jj|_ t|_ t|_ t|_t|_|j|jh|_d \|_|_g|_d|_|rt*nt,}||||_i|_|j3dy)NglyphMapr)deprecateArgumentz#use 'glyphNames' (iterable) insteadz?'glyphNames' and (deprecated) 'glyphMap' are mutually exclusivezunsupported keyword argumentrsz: z, c32K|]}t|ywN)repr).0ks ]/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/fontTools/feaLib/parser.py z"Parser.__init__..<s=V!d1g=VsNN) includeDirTcomments)fontTools.misc.loggingToolsr TypeErrorpoplenjoinset glyphNames_ast FeatureFiledoc_ SymbolTableanchors_ glyphclasses_lookups_ valuerecords_symbol_tables_next_token_type_ next_token_ cur_comments_next_token_location_rrlexer_missingadvance_lexer_)self featurefile glyphNamesfollowIncludesrkwargsr lexerClasss r__init__zParser.__init__-s&   E j*O PX J/J V)2s2DII=Vv=V4VX  z?HH((* #  (]#  (]#}}d.@.@A2>/t/$(!'5^;L  D   T*c |jj}|j |jr|j d|j t jurB|j|jj|j|jn1|jdr!|j|jn|j t jur!|j|j!n|jdr!|j|j#n|jdr!|j|j%n^|jdr!|j|j'n,|jd r#|j|j)d n|jd r!|j|j+n|jd r!|j|j-n|jdr!|j|j/nb|jdr#|j|j-dn.|jdr |j|j1n|jdr"|j|j3d n|j t j4urG|j|j6vr/|j|j6|j|ng|j t j8ur|jdk(rt;dj=|j |j|j|j|jr|j>rQ|j>jADcgc]\}}d|d|d}}}t;ddjC|zd|jScc}}w)zParse the file, and return a :class:`fontTools.feaLib.ast.FeatureFile` object representing the root of the abstract syntax tree containing the parsed contents of the file.NTrlocationincludeanon anonymous anchorDeflanguagesystemlookupFvertical markClassfeature conditionset variation)rOtablevalueRecordDef;zbExpected feature, languagesystem, lookup, markClass, table, or glyph class definition, got {} "{}" z (first found at )zMThe following glyph names are referenced but are missing from the glyph set:  )"r* statementsr1r3r7cur_token_type_rCOMMENTappendr(Comment cur_token_cur_token_location_is_cur_keyword_parse_include_ GLYPHCLASSparse_glyphclass_definition_parse_anonymous_parse_anchordef_parse_languagesystem_ parse_lookup_parse_markClass_parse_feature_block_parse_conditionset_ parse_table_parse_valuerecord_definition_NAME extensionsSYMBOLrformatr6itemsr%)r8rVnamelocerrors rparsez Parser.parseNs{YY)) ##/43E3E     .##u}}4!!HH$$T__t?W?W$X%%i0!!$"5"5"78%%)9)99!!$"C"C"EF%%&;<!!$"7"7"9:%%k2!!$"7"7"9:%%&67!!$"<"<">?%%h/!!$"4"4e"4"DE%%k2!!$"7"7"9:%%i0!!$";";"=>%%n5!!$":":"<=%%k2!!$";";d";"KL%%g.!!$"3"3"56%%&67!!$"D"De"D"TU$$ 2OOt6!!"B$//$//"B4"HI%%5$//S:P%DDJF,,dooE,, M##/43E3E\ <<"&!3!3!5D#.237E""&))E"24  yysQc |jd|jd|j}|jdk(r#|jd|jdy|jt j k(r|j}|jj|}|td|z|j|jd|jj|j|j||jdd|S|j!d|j!d}}d}|jd k(r!|jd |j!}|jdk(r!|j#}|j#}nd \}}|jd|jj||d||||S) N<anchorNULL>zUnknown anchor "%s")ro contourpoint xDeviceTable yDeviceTablerBTvariablerxr)expect_symbol_expect_keyword_r\r2r1rrj expect_name_r,resolverr(Anchorxyrxexpect_number_ parse_device_) r8rBro anchordefrrrxryrzs r parse_anchor_zParser.parse_anchor_s C  X&++   v %   (    $  EJJ .$$&D --d3I %)D0$2J2J    $88??  &33!!!# ""D"143F3FPT3F3U1   ~ -   0..0L   s "--/L--/L)3 &L, C xx %%%  r?cg}|jdk(rf|j}||jdk7r1|jd|j}|j ||f|jdk(rf|S)Nrtmark)r2rr~expect_markClass_reference_rY)r8 anchorMarksrurLs rparse_anchor_marks_zParser.parse_anchor_marks_s #%'')F~$"2"2f"<   (88:I    2 3 #%r?c|jdsJ|j}|j|j}}d}|jdk(r!|j d|j}|j }|j d|jj|||||}|jj|||S)NrGrxrR)rxrB) r]r\rr2r~rr}r(AnchorDefinitionr,define)r8rBrrrxrors rrbzParser.parse_anchordef_s##K000++""$d&9&9&;1   ~ -   0..0L  " C HH-- !Q\H.  T9-r?c^|jdsJ|j}|jj|\}}}|j |j d|j}||k(sJd|j d|j j|||S)NrD}z-bad splitting in Lexer.scan_anonymous_block()rRrA)r] expect_tag_r5scan_anonymous_blockr7r}r(AnonymousBlock)r8tag_contentrBend_tags rrazParser.parse_anonymous_s##$9::: #{{??D7H  C ""$g~NNN~ C xx&&sGh&GGr?c`|jdsJ|j}|jd}|jh}|jdk7r/|j |j|jdk7r/|j d|jj|||S)NAttachTaccept_glyphnamerRrA) r]r\parse_glyphclass_rr2addr}r(AttachStatement)r8rBglyphs contourPointss r parse_attach_zParser.parse_attach_s##H---++'''>,,./ #%   d113 4#% C xx'' 'QQr?ch|jdvsJ|j|jd|S)N>enum enumerateT enumeratedrK)r[r7parse_position_)r8rKs rparse_enumerate_zParser.parse_enumerate_s7"7777 ##th#GGr?c(|jdsJ|j}|jdk7r|jd}nd}|j d|jdk7r|jd}nd}|j d|jdk7r|jd}nd}|j d|jdk7r|jd}nd}|j d|j j |||||S)N GlyphClassDef,FrrRrA)r]r\r2rr}r(GlyphClassDefStatement)r8rB baseGlyphsligatureGlyphs markGlyphscomponentGlyphss rparse_GlyphClassDef_zParser.parse_GlyphClassDef_s##O444++   s "///GJJ C   s "!33U3KN!N C   s "///GJJ C   s ""44e4LO"O C xx..  NOh/  r?c|j|j}}|jd|jd}|jd|jj |||}|j j|||S)N=FrrRrA)r\r[r}rr(GlyphClassDefinitionr-r)r8rBror glyphclasss rr`z#Parser.parse_glyphclass_definition_s{114??$ C '''? C XX224(2S  !!$ 3r?c |jd}g}tt|D][}dj|d|dj||d}}||jvs:||jvsI|j ||f]t|dk(r |d\}}||fSt|dk(rt d|z|dj|D cgc]\}} d|d| dc} }} t d|d | d |cc} }w) N-rrzU"%s" is not a glyph in the font, and it can not be split into a range of known glyphsz or "z - zAmbiguous glyph range "z"; please use z to clarify what you mean)splitranger$r%r'rYr) r8rorBparts solutionsistartlimitrlrangess rsplit_glyph_range_zParser.split_glyph_range_#s& 3 s5z" 1A88E!AJ/%)1D5E(((Ud6F6F-F  %0 1 y>Q $QV>V0WB  $%77;7G7G6JL--A#%J C  r?cgggggf\}}}}}d}|jdvr|jd}d} |jdk(r|jddx}} | r*|rtd|j|j |n%|r|j |n|j ||j r!|j |j|n|j dd} |jdk(r| g} |jd| std|j|j} |jj| } | td | z|j| j | |jdk(r| r|j | |jdvr|s|s|gk(sJg|dgt|z|g|fSt|dt|rtd |j|t|t|t|z} t| rbyfromrrRTr'z_Unsupported contextual target sequence: at most one run of marked (') glyph/class names allowedrIz%Lookups can only follow marked glyphsUnknown lookup "%s"z_Positioning cannot be applied in the bactrack glyph sequence, before the marked glyph sequence.zPositioning values are allowed only in the marked glyph sequence, or after the final glyph node when only one glyph node is marked.r)r2rr}rr\rYis_next_value_parse_valuerecord_r~rr.rr$any)r8rKprefixrlookupsvaluessuffixhasMarksrmarked lookuplist lookup_namerI marked_valuess rparse_glyph_pattern_zParser.parse_glyph_pattern_s  46r2r22F/&>>'''>BF3&##C($((6*J00  b! b! b!""$ d55h?@ d#J""h.%!#J$$X.)?00#//1 ..{;>)- ;T=U=U!!&)""h. z*[&>>^fb= =V 4fb(K K6-CK()%8,, #3v;Vs6{1JKM=!vc&kCK79:;)*00  'F2Jv;?c&"+&6)*00   V%&,,  FGVVXF Fr?c|j}|jd\}}}}}}t|rtd|d||s8td|d|} tj t | |dd|dd}}|||f} | S) NFrJz(No lookups can be specified for "ignore rzAmbiguous "ignore z)", there should be least one marked glyphrr)r\rrrrrr) r8subrBrrrrrrrq chainContexts rparse_ignore_glyph_pattern_z"Parser.parse_ignore_glyph_pattern_s++<@ #%    $    @ @ E F#% C r?c||jdsJ|j}|j|jdvr.|j d}|j j ||S|jdvr.|j d}|j j||Std|j)Nignore) substituterrrA)positionposrz#Expected "substitute" or "position") r]r\r7r[rr(IgnoreSubstStatementIgnorePosStatementr)r8rBrs r parse_ignore_zParser.parse_ignore_*s##H---++  ??3 355e exclude_dflt include_dfltr requiredTrRrA) r]r\expect_language_tag_r2rr~r}r(LanguageStatement)r8rBr include_defaultr s rparse_language_zParser.parse_language_@s##J///++,,.$1!   ? ?"//1^CO   z )   ,H C xx)) ox(*  r?c`|jdsJ|j}|jd}|jg}|jdk7r/|j |j|jdk7r/|j d|jj|||S)NLigatureCaretByIndexTrrRrA) r]r\rrr2rYr}r(LigatureCaretByIndexStatementr8rBrcaretss rparse_ligatureCaretByIndex_z"Parser.parse_ligatureCaretByIndex_Os##$:;;;++'''>%%'(#% MM$--/ 0#% C xx55ffx5XXr?ch|jdsJ|j}|jd}|jdg}|jdk7r1|j |jd|jdk7r1|j d|jj|||S)NLigatureCaretByPosTrr{rRrA) r]r\rrr2rYr}r(LigatureCaretByPosStatementrs rparse_ligatureCaretByPos_z Parser.parse_ligatureCaretByPos_Ys##$8999++'''>%%t%45#% MM$--t-< =#% C xx33FFX3VVr?c*|jdsJ|j|j}}|jdk(rd|jj |}|t d|z|j|jd|jj||Sd}|jdk(r|jdd}|jj|||}|j|||jj|||S)NrIrRrrAF useExtensionT)r]r\rr2r.rrr}r(LookupReferenceStatementr~ LookupBlock parse_block_r)r8rKrBrorI use_extensionblocks rrdzParser.parse_lookup_cs##H---1143D3D3F$   s "]]**40F~%)D0$2J2J    $8844Vh4O O   ~ -   0 M$$T=8$L %* T5) r?c |jdsJ|j}|jtjk(r>|j }|j d|jj||Sd}d\}}}dddd d }t}|jdk7r |j|vr#td |jz|j|j|j|jd k(r$|jd |jd }n}|jdk(r$|jd|jd }nJ|j|vrd}|||j!z}n#td|jz|j|jdk7r |j dt#|||gstd|j|jj||||S)N lookupflagrRrAF)rNNr) RightToLeftIgnoreBaseGlyphsIgnoreLigatures IgnoreMarksz%s can be specified only onceMarkAttachmentTyperUseMarkFilteringSetTz#"%s" is not a recognized lookupflagzlookupflag must have a value)markAttachmentmarkFilteringSetrB)r]r\r1rNUMBERrr}r(LookupFlagStatementr&r2rr4rr~rrr)r8rBvalue value_seenr-r.flagsseens rparse_lookupflag_zParser.parse_lookupflag_|s##L111++  ELL 0'')E    $88///I I 2?/~/ !    u#%4'%3d6F6FF-- HHT%% &#77$$%9:!%!7!7!7!O!!%::$$%:;#'#9#95#9#Q !!U*! d&7&7&9 ::%9D !rrcursivebaseligaturerrRz3If "lookup" is present, no values must be specifiedrAr$rr)rrBz2"enumerate" is only allowed with pair positionings forceChainrB)r[r2parse_position_cursive_parse_position_base_parse_position_ligature_parse_position_mark_r\rr}rrr(ChainContextPosStatementr$reversePairPosStatementSinglePosStatementlistzip) r8rrKrBrrrrrrs rrzParser.parse_position_s"5555   y (// HE E    ',,ZB B    +00XF F    ',,ZB B++<@"enumerate" is not allowed with cursive attachment positioningTrrRrA)r\r~rrrr}r(CursivePosStatement)r8rrKrBr entryAnchor exitAnchors rrDzParser.parse_position_cursive_s++ Y' !S ++T+B ((* '')  C xx++  Z(,  r?c|j}|jd|r td||jd}|j }|j d|j j|||S)Nr@zC"enumerate" is not allowed with mark-to-base attachment positioningTrrRrA)r\r~rrrr}r(MarkBasePosStatement)r8rrKrBr@markss rrEzParser.parse_position_base_s++ V$ !6  %%t%<((* C xx,,T58,LLr?c|j}|jd|r td||jd}|j g}|j dk(r@|jd|j |j |j dk(r@|jd|jj|||S)NrAzG"enumerate" is not allowed with mark-to-ligature attachment positioningTr ligComponentrRrA) r\r~rrrr2rYr}r(MarkLigPosStatement)r8rrKrB ligaturesrTs rrFzParser.parse_position_ligature_s++ Z( !:  **D*A ))+,.0   0 LL113 4.0 C xx++Iux+PPr?c|j}|jd|r td||jd}|j }|j d|j j|||S)NrzC"enumerate" is not allowed with mark-to-mark attachment positioningTrrRrA)r\r~rrrr}r(MarkMarkPosStatement)r8rrKrB baseMarksrTs rrGzParser.parse_position_mark_/s++ V$ !6  **D*A ((* C xx,,Y,QQr?c|jdsJ|j|j}}|jd|jj ||S)NscriptrRrA)r]r\expect_script_tag_r}r(ScriptStatement)r8rBr]s r parse_script_zParser.parse_script_=sV##H---33T5L5L5N& C xx'''BBr?c  |jdvsJ|j}|jdv}|jd\}}}}}}t|r t d|g} |j dk(rU|j d} |j dk7rk|jdd } | j| |j dk7r4n6|j d k(r%|j d } |jd g} nd} |jdt| d k(r!t|st d |j| d k(r|r t d|t|dk7st|d jdk7r t d|t| dk7r t d||jj||d || d |St|D cgc]} | |  c} } d}t| dk(r!t| d tjrg} d}|st|dk(rt| dk(r| d k(rt!|d j}t!| d j}t|dk(r|t|z}t|t|k7r#t dt|t|fz||jj#|| ||||S|r7t|dk(r)| d k(r$|jj%||d |d||S|st|dk(rt| dkDr| d k(rt|d j}| D]}t!|js t d|t|jdk7sEt|j|k7sbt d|dt|jd||jj%||d || ||S|s~t|dkDrpt| dk(rbt| d jdk(rC| d k(r>|jj'|||t!| d jd ||S|rt|dk7r t d|t| dk7r t d|| d k7r t d|t)t!|d j}t)t!| d j}t|dk(r|t|z}t|t|k7r#t dt|t|fz||jj+|||| |St|dkDrt| dkDr t d|t| d k7s|r t d||jj-|||||}|Scc} w)N>rrsub reversesubr>rbrcFrJz-Substitution statements cannot contain valuesrrRT)rrrrrz3Expected "by", "from" or explicit lookup referencesz4Reverse chaining substitutions do not support "from"rz%Expected a single glyph before "from"z)Expected a single glyphclass after "from"rAz\Expected a glyph class with %d elements after "by", but found a glyph class with %d elementsrBzEmpty class in replacementz!Expected a glyph class with 1 or z3 elements after "by", but found a glyph class with z elementsz\In reverse chaining single substitutions, only a single glyph or glyph class can be replacedzlIn reverse chaining single substitutions, the replacement (after "by") must be a single glyph or glyph classz8Reverse chaining substitutions cannot call named lookupszJDirect substitution of multiple glyphs by multiple glyphs is not supportedzInvalid substitution statement)r[r\rrrr2r~rrYr}r$r7r(AlternateSubstStatementrrrLSingleSubstStatementMultipleSubstStatementLigatureSubstStatementsorted ReverseChainSingleSubstStatementChainContextSubstStatement)r8rBrI old_prefixoldrr old_suffixrnewkeywordrr num_lookups is_deletionr replacementscountnrules rparse_substitute_zParser.parse_substitute_CsM"MMMM++//%;;  % %u % 5       v;!?    t #**40G""c)++Tt+T 2""c)   '**62G))5)ABCG C s8q=W!E((  f %JH3x1}CFOO$5 6! ;%&MxXX3x1}%?8833CFJA4 g?1?@  s8q=ZA >CK 3s8q=SX]{a?O#a&//+,FA 12L< A%+c&k9 6{c,//%?6{C $567  8800S*jXPX1  3s8q=[A-=8822A#! 3  3s8q=SX\kQ>NA)*E AJJL))*FQQqzz|$)c!**,.?5.H);E7C88;AJJL8I7J)U   8822A#! 3 C1 CA CFOO%&!+q 8822SV__&'*#! 3  3x1}%I 3x1}%%  a%NPXDQ!234F!$s1v'8"9:L< A%+c&k9 6{c,//%?6{C $567  88<<JS8=  s8a%%&<=!!$"B"B"DE%%&:;!!$"@"@"BCC'%U,,##%););r?c|j}|jdk7s |jr|jd|jt j urA|j|jj|j|jnW|jdr |j|jn&|jdk(rtd|j|jdk7r|jryy)NrTrrA FontRevisionrRzExpected FontRevision)rVr2r3r7rWrrXrYr(rZr[r\r]parse_FontRevision_rrs rrzParser.parse_table_head_Ss%% #%););     .##u}}4!!HH$$T__t?W?W$X%%n5!!$":":"<=C'%&=t?W?WXX#%););r?c$|j}d}|jdk7s |jrf|jd|jt j urA|j|jj|j|jn|jt jur|j|vr|jj}|j}|j|jj|||j|jdk7r=t!d|j"|jdk(rLt!d|j|jdk7rW|jreyy) N) CaretOffsetAscender DescenderLineGaprTrrArRIncomplete statementz4Expected CaretOffset, Ascender, Descender or LineGap)rVr2r3r7rWrrXrYr(rZr[r\rjlowerr HheaFieldrr4r8rPrVfieldskeyr1s rrzParser.parse_table_hhea_bsP%% D#%););     .##u}}4!!HH$$T__t?W?W$X%%368Qoo++-++-!!HH&&sED`_.NrExpected platform id 1 or 3rrr rRUnsupported encoding) r1rNUMBERSexpect_any_number_r\rexpect_string_r}runescape_string_r8rrrrBrencoding unescapeds rrzParser.parse_name_s   EMM 1002J//H'%&CXNN$$ 5 335 002J//H ?!QIF!QI%vF$$& C z9f=  !"8(C C))&(; 9fi77r?cd}d}|jtjvri|j}|j}|dvr t d||jtjvr/|j}|j}nd}|j}|dk(r |xsd}|xsd}n |xsd}|xsd}|j }t|||}| t d||j||}||||fS)Nrrrrrrr) r1rrrr\rrrrrs rparse_stat_name_zParser.parse_stat_name_s   EMM 1002J//H'%&CXNN$$ 5 335 002J//H ?!QIF!QI%vF$$&z9f=  !"8(C C))&(; 9fi77r?c|jdk(sJ|j|j|j}}|dkDrtd|j|j \}}}}|j j ||||||S)Nriz*Name id value cannot be greater than 32767rA)r[r\rrrr( NameRecord)r8rBnameIDrrrrs rrzParser.parse_nameid_s(*;DOO;*33T5L5L5N& E>!V>V 150@0@0B- Ivvxx"" J 66H#  r?cdk(r"tjdj|}nfd}tjd||}t|dd}t |dS)N utf_16_bez\\[0-9a-fA-F]{4}c(j|Sr)unescape_byte_)mrr8s rz)Parser.unescape_string_..s!4!4Q!Ar?z\\[0-9a-fA-F]{2} surrogatepass)rerunescape_unichr_r r )r8rrrunescapeutf16s` ` rrzParser.unescape_string_sY { "*D,A,A6JAAH*Hf=A;8UK((r?cT|jddd}tt|dSNrr)groupchrint)matchrus rrzParser.unescape_unichr_s& KKN12 3q":r?cr|jddd}tt|dj|Sr)rr rdecode)rrrus rrzParser.unescape_byte_s2 KKN12 s1bz"))(33r?ct|D]4}t||jjr$t||r|cSyyr)reversedrr(rZ)r8rVclass_previouss r find_previouszParser.find_previous sF , H(DHH$4$45Hf- r?c |j}|jdk7s |jr|jd|jt j urB|j|jj|j|jnK|jdr|j}n(|jdrT|jt}|j|jj!||d|jn|jdr|j#|tj }|t%d |j|j&rt%d |j|j(j|j+n-|jd r|j}n |jd rS|jt}|j|jj!||d|jn|jd r|j#|tj }|t%d |j|j&st%d|j|j(j|j+n|jdk(r|jdk7r|jryy)NrTrrAHorizAxis.BaseTagListHorizAxis.BaseScriptListFzHorizAxis.MinMaxz)MinMax must be preceded by BaseScriptListz9HorizAxis.MinMax must be preceded by HorizAxis statementsVertAxis.BaseTagListVertAxis.BaseScriptListzVertAxis.MinMaxz7VertAxis.MinMax must be preceded by VertAxis statementsrR)rVr2r3r7rWrrXrYr(rZr[r\r]parse_base_tag_list_parse_base_script_list_r$BaseAxisrrrKminmaxparse_base_minmax_)r8rPrV horiz_bases horiz_scriptsbase_script_list vert_bases vert_scriptss rrzParser.parse_table_BASE_s%% #%););     .##u}}4!!HH$$T__t?W?W$X%%&=>"779 %%&@A $ < V>VW W y>A % x'!+);x/0 >00  L% )ll,&)#C5(==t?W?W##C(  )xx.. 9eT%=%=  r?c g}|j}t|jdk7r$td|jd|j |j dk7r|jtjur"|j}|j|nb|jtjur"|j}|j|n$td|j d|j|j dk7rt|dk(r0|\}}}||ks||kDr td|d |d |d |j|jj!||S) Nr%r#z must be 4 charactersrRzUnexpected value "z". Expected integer or float.rzDefault value z is outside of specified range r.)rr$rrr[r\r2r1rr expect_float_rYr/rr4r(AxisValueLocationStatement)r8rrr1nominalmin_valmax_vals rr$zParser.parse_STAT_locationsn  syy{ q !DOO,,EE((  #%$$ 3**, e$&&%,,6++- e$%()9)9(:;11--#% v;! (. %GWg Gg$5%$WI.*iq ,--  xx223??r?c<|j}g}|jdk7s |jrr|jd|jt j urB|j|jj|j|jn|jt jur|jdr<|j}|j|jj|nx|jdrM|j!}|j|jj#||j%dn|jdrN|j'}|j|j(|j||j%dn|jd rv|j+}|j,D]4}|j(|vst/d |j(d |j|j||j%dn4t/d |j|j|jdk(rn|jdk7rc|jrqyy) NrTrrAr ElidedFallbackNameIDrRrr!zDesignAxis not defined for r+r)rVr2r3r7rWrrXrYr(rZr[r\rjr]rr rr2r}rrr)r'r) r8rPrV design_axesrr1 designAxisaxisValueRecordrBs rrzParser.parse_table_STAT_s+%%  #%););     .##u}}4!!HH$$T__t?W?W$X%%3''(<= >>@E%%dhh&A&A%&HI))*@A //1E%%dhh&C&CE&JK'',)),7!%!J&&z~~6%%j1'',))+6&*&A&A&CO$3$=$=#<<{:#2 =a P $ 8 8# %%o6'',)+DOO+<=t?W?WC'I#%););r?c|jdvsJ|jg}|jdk7r/|j|j|jdk7r/|j d|S)N)rrrR)r[r2rYr^r})r8basess rrzParser.parse_base_tag_list_?sx#    ??  #% LL002 3#% C  r?c*|jdvsJ|j|j|g}|jdk(rA|jd|j |j||jdk(rA|jd|S)N)rrrrR)r[parse_base_script_record_r2r}rY)r8rtscriptss rrzParser.parse_base_script_list_Ks#    ??  11%89#%    $ NN499%@ A#% C r?c|j}|j}t|Dcgc]}|j}}|||fScc}wr)r^rr)r8rt script_tagbase_tagrcoordss rr9z Parser.parse_base_script_record_WsP,,. **,16u>A$%%'>>8V++?sA cz|j}|j}|j}|j|jt j ur|jdk(std|j|j}|jdk(rtd|j||||fS)Nrz0Expected a comma between min and max coordinatesz0Feature tags are not yet supported in BASE table) r^r rr7rWrrlr[rr\r2)r8r<r  min_coord max_coords rrzParser.parse_base_minmax_]s,,. ,,.'')  $$ 4C9O!B(( '')   s "!B((  8Y 99r?cd}|jd|jd|jdk(r|jdn|j|jfg}|jdk(rP|jd|j |j|jf|jdk(rPt |}|jd|S)Nrtdevicervrrw)r}r~r2rrYtuple)r8results rrzParser.parse_device_ps C  X&   v %   (**,d.A.A.CDEF""c)##C( t224d6I6I6KLM""c)6]F C  r?c~|jtjuxs |jdk(xs|jdk(S)Nrt()r1rr/r2r8s rrzParser.is_next_value_s?  ! !U\\ 1 '3& '3& r?c |jtjur|jdk(s|jtjur`|j d|j }}|r |jj|||}|S|jj|||}|S|jd|j }|jtjur|j}|dk(r+|jd|jjS|jj|}|td |z|j |j}|j |j"} }|j$|j&} } nK|j d|j d|j d|j df\}} } } |jdk(r|j)|j)|j)|j)f\} } }}t+| r| nd | r| nd z|r|nd z|r|nd zDcgc]\}}| c}}}|d d ks|d dkDrtd|j d\} } }}|jd|jj|| | | | | |||| Scc}}w)NrGTr{)yAdvancerKrB)xAdvancerKrBrtrvrwzUnknown valueRecordDef "%s"rdrirz+Device value out of valid range (-128..127))NNNN)rKrB)r1rrlr2r/rr\r( ValueRecordr}rjrr/rrr1 xPlacement yPlacementrKrJrri)r8rKnumberrBvalrovrdr1rNrOrKrJ xPlaDevice yPlaDevice xAdvDevice yAdvDevicerdelta allDeltass rrzParser.parse_valuerecord_s  ! !U\\ 1d6F6F#6M  " "ell 2##T#2((Fhh**#h+Jhh**#h+J C ++  EJJ .$$&Dv~##C(xx++--$$,,T2C{%1D8$:R:RIIE&+&6&68H8H J"'..%..hH##T#2##T#2##T#2##T#2 : 6J Hh   s """$""$""$""$ > :J J 7A b%/zR(9%/zR(9&0zR(9#eI|d"imc&9%A,, >V :J J  C xx##        $  #s K c|jdsJ|j}|j|}|j}|j d|j j |||}|jj|||S)NrQrRrA) r]r\rrr}r(ValueRecordDefinitionr/r)r8rKrBr1rorRs rriz$Parser.parse_valuerecord_definition_s##$4555++''1  " C hh,,T58,L !!$, r?c|jdk(sJ|j}|j}|j}|j d|j j |||S)NrHrRrA)r[r\r^r r}r(LanguageSystemStatement)r8rBr]r s rrczParser.parse_languagesystem_sf"2222++((*,,. C xx//8/TTr?c|r|jdk(sJ|jdk(sJ|j}|j}|dv}d}d}d}||jvr|}n||jvr|}n|dk(rd}|r|j }d} |j dk(r|jdd} |r |jj|| |} n|jj|| |} |j| ||||| S) NrOrM>valtvhalvkrnvpalFrTr)r rB) r[r\rSS_FEATURE_TAGSCV_FEATURE_TAGSrr2r~r(VariationBlock FeatureBlockr) r8rOrBrrK stylisticset cv_feature size_featurerNr r!s rrfzParser.parse_feature_block_s) ??k1 11??i/ //++ ::   $&& &L D(( (J F]L ,,.L   ~ -   0 M HH++\,EHH))=8*E %<zR r?c|jdk(sJ|j|j}|j}|jd|jj ||S)NrMrRrA)r[r\rr}r(FeatureReferenceStatement)r8rB featureNames rparse_feature_reference_zParser.parse_feature_reference_ s^)+`_. featureNamesrArrTrrorRr)r[r( NestedBlockr\r}r0 enter_scoper2r3r7rWrrXrVrYrZr]rrr exit_scope) r8rr!symtabrBrrrrs rparse_featureNames_zParser.parse_featureNames_s.0A$//A0$$ 4+C+C%  C )) !F     !#%););     .##u}}4  ''HH$$T__t?W?W$X%%f-338<8H8H8J5 Ivv  ''HH11ZFFX2 C'%&79Q9QRR##%););$ C )) F      C  r?cx|jdk(sJ|j|jj||j|j}|j d|j D]}|j |j}|jdk7s |jrJ|jd|jtjurA|j|jj|j|jn|j!hdr,|j|j#||jn}|j!dr!|j|j%|nK|jd k(r t'd j)|j|j|j|jdk7r<|jrJ|j d|j D]}|j+|j d |S) N cvParametersrArrTr>SampleTextNameIDFeatUILabelNameIDParamUILabelNameIDFeatUITooltipTextNameID CharacterrRzExpected statement: got {} {})r[r(ror\r}r0rprVr2r3r7rWrrXrYrZr]parse_cvNameIDs_parse_cvCharacter_rrmrq)r8rr!rrrVs rparse_cvParameters_zParser.parse_cvParameters_7s.0A$//A0$$ 4+C+C%  C )) !F     !%% #%););     .##u}}4!!HH$$T__t?W?W$X%%!!$"7"7T__"MN%%k2!!$"9"9#">?C'%3::,,doo,, )#%););6 C )) F      C  r?c |j|k(sJ|j|jj|||j}|j d|j D]}|j |jdk7s |jr-|jd|jtjurK|jj|jj|j|jn|j!dr]|j}|j#\}}}} |jj|jj%||||| ||n'|jdk(rt'd|j|jdk7r|jr-|j d|j D]}|j)|j d|S) NrArrTrrorRr)r[r(ror\r}r0rpr2r3r7rWrrXrVrYrZr]rCVParametersNameStatementrrq) r8r block_namer!rrrBrrrrs rr{zParser.parse_cvNameIDs_ds*,=doo=,$$S*t?W?W$X C )) !F     !#%););     .##u}}4  ''HH$$T__t?W?W$X%%f-338<8H8H8J5 Ivv  ''HH66"!"!)7 C'%&79Q9QRR/#%););0 C )) F      C  r?c*|jdk(sJ|j|j|j}}|jdd|cxk\rdk\snt dj dd||j j|||S)NrzrRirz/Character value must be between {:#x} and {:#x}rA)r[r\rr}rrmr(CharacterStatement)r8rrB characters rr|zParser.parse_cvCharacter_s+->t>-"668O8O8Q) C I**!""(&H"5  xx**9cH*MMr?c|jdk(sJ|j|j|j}}|jd|dkr t d||j j ||S)NrrRrz&Font revision numbers must be positiverA)r[r\r,r}rr(FontRevisionStatement)r8rBversions rrzParser.parse_FontRevision_st.0A$//A0 44d6H6H6J' C a<!"JHU Uxx--g-IIr?c|j}i}|jd|jdk7rJ|j|jt j urtd|j|j}||vrtd||j|jt jur|j}n.|jt jur|jd}|jt jur|j}n.|jt jur|jd}|jdf||<|jdk7rJ|jd|j}||k7rtd|z|j|jj!||S) NrrExpected an axis namezRepeated condition for axis Fr{rRr)rr}r2r7rWrrjrr\r[r1rr,r/rr(ConditionsetStatement)r8ro conditionsaxis min_value max_value finalnames rrgzParser.parse_conditionset_s  "  C #%    !##5::5%&=t?W?WXX??Dz!%24&94;S;S$$ 3 ..0 &&%,,6 ///? $$ 3 ..0 &&%,,6 ///?    $ )95Jt -#%0 C %%'  !/D"8$:R:RS Sxx--dJ??r?c |jd|jD]}|j|j}|jdk7s |j r|j d|jtjurB|j|jj|j|jnR|jtjur!|j|j!n|j#dr!|j|j%n|j#ddhr#|j|j'| n|j#d r!|j|j)n{|j#d r!|j|j+nI|j#d r!|j|j-n|j#d r"|j|j/|n|j#dr!|j|j1n|j#dr!|j|j3n|j#ddhr$|j|j5d|nI|j#dr!|j|j7n|j#hdr!|j|j9n|j#dr!|j|j;n|j#dr"|j|j=|n~|r3|j#dr"|j|j?|nI|r3|j#dr"|j|jA|n|r1|j#dr |j|jCn|r1|j#dr |j|jEn|jtjFurG|j|jHvr/|j|jH|j|nK|jdk(rtKdjM|j|j|j|jdk7r|j r|jd|jD]}|jO|jQ}||jRjUk7r1tKd|jRjUz|j|jdy)NrrTrrArGrrrJrMrr rIr#rLrrFrr]>rrbrcrryrQrnrur}rrRz7Expected glyph class definition or statement: got {} {}r)+r}r0rprVr2r3r7rWrrXrYr(rZr[r\r_r`r]rbrrlrrrdr5rerr`rwr{rirsr}rrrjrkrrmrqrror) r8r!rKrfrhrgrrrVros rrzParser.parse_block_s C )) !F     !%% #%););     .##u}}4!!HH$$T__t?W?W$X%%)9)99!!$"C"C"EF%%k2!!$"7"7"9:%%v{&;<!!$"7"7"7"JK%%i0!!$"?"?"AB%%h/!!$"4"4"67%%j1!!$"6"6"89%%h/!!$"4"4X">?%%l3!!$"8"8":;%%k2!!$"7"7"9:%%uj&9:!!((EH(M%%h/!!$"4"4"67%%&QR!!$"8"8":;%%j1!!$"6"6"89%%&67!!$"D"DX"NO$"6"6~"F!!$":":<"HI 4 4^ D!!$":"::"FG$"6"6|"D!!$"="="?@$"6"6~"F!!$";";"=>$$ 2OOt6!!"B$//$//"B4"HIC'%MTT,,doo,, i#%););v C )) F       " 5::##% %!%**"2"2"44d6N6N  C r?c|jtjur2t|t dr|j |k(S|j |vSy)NrF)rWrrjrtyper[)r8rs rr]zParser.is_cur_keyword_sC   5:: -!T"X&!++!++r?c|j|jtjurt d|j |j S)NzExpected @NAME)r7rWrr_rr\r[rHs rr8zParser.expect_class_name_s@    u'7'7 7!"2D4L4LM Mr?c|j|jtjur |jSt d|j )NzExpected a CID)r7rWrrr[rr\rHs rrzParser.expect_cid_s>    599 ,?? ".0H0HIIr?c|j|jtjurt d|j |j S)NzExpected file name)r7rWrFILENAMErr\r[rHs rrzParser.expect_filename_%s>    u~~ 5!"68P8PQ Qr?c|j|jtjur|jj dS|jtj urd|jzStd|j)N\cid%05dzExpected a glyph name or CID) r7rWrrjr[lstriprrr\rHs rrzParser.expect_glyph_+sj    5:: -??))$/ /  ! !UYY .t. .V>VWWr?c|jr?|D]9}||jvr||jvs!|j|j|<;yy)zAdds a glyph name (just `start`) or glyph names of a range (`start` and `end`) which are not in the glyph set to the "missing list" for future error reporting. If no glyph set is present, does nothing. N)r'r6r\)r8rros rrz$Parser.check_glyph_name_in_glyph_set3sT    B4+++t||+)-)A)ADLL&  B r?c|j}|jj|}|td|z|jt ||j jstd|z|j|S)NzUnknown markClass @%sz@%s is not a markClass)r8r-rrr\rr(r)r8romcs rrz"Parser.expect_markClass_reference_As&&(    ' ' - :!'$.0H0H "dhh001!(4/1I1I  r?c|j|jtjurt d|j t |jdkDrt d|j |jdzddS)NzExpected a tagr%z'Tags cannot be longer than 4 charactersz )r7rWrrjrr\r$r[rHs rrzParser.expect_tag_Nsu    uzz 1!"2D4L4LM M t ! #!94;S;S &("1--r?c\|j}|dk(rtd|j|S)Ndfltz4"dflt" is not a valid script tag; use "DFLT" insteadrrr\r8rs rr^zParser.expect_script_tag_Xs7  &=!F((  r?c\|j}|dk(rtd|j|S)NDFLTz6"DFLT" is not a valid language tag; use "dflt" insteadrrs rr zParser.expect_language_tag_as7  &=!H((  r?c|j|jtjur|j|k(r|St d|z|j )Nz Expected '%s')r7rWrrlr[rr\)r8symbols rr}zParser.expect_symbol_jsH    5<< /DOOv4MMo68P8PQQr?c|j|jtjur|j|k(r |jSt d|z|j )Nrr7rWrrjr[rr\)r8rps rr~zParser.expect_keyword_psM    5:: -$//W2L?? "o79Q9QRRr?c|j|jtjur |jSt d|j )NzExpected a namerrHs rrzParser.expect_name_vs>    5:: -?? "/1I1IJJr?c|j|jtjur |jS|r;|jtj ur|jdk(r|j Std|j)NrGzExpected a number) r7rWrr/r[rlexpect_variable_scalar_rr\)r8r|s rrzParser.expect_number_|sm    5<< /?? " ,, <TWAW//1 1143K3KLLr?c|jt} |jtjk(r|j dk(r |S|j \}}|j||U)NrT)r7rrWrrlr[expect_master_ add_value)r8scalarrBr1s rrzParser.expect_variable_scalar_si !##u||338N #113OHe   Xu - r?ci} |jtjurtd|j|j }|j |jtjur|j dk(std|j|j}|||<|jtjur|jddk(rnc|j |jtjur|j dk(std|j|j 6|j t|j dd}|j ||fS) NrrzExpected an equals signr:rz#Expected an comma or an equals signr) rWrrjrr\r[r7rlexpect_integer_or_float_r1r2r)r8rBrr1s rrzParser.expect_master_sI##5::5%&=t?W?WXX??D    !((ELL8T__PS=S%-t/G/G113E"HTN$$ 2t7G7G7Jc7Q    !((ELL8T__PS=S%94;S;S    !'( DOOAB'( r?c|j|jtjvr |jSt d|j )Nz/Expected a decimal, hexadecimal or octal number)r7rWrrr[rr\rHs rrzParser.expect_any_number_sB    5== 0?? " =t?W?W  r?c|j|jtjur |jSt d|j )Nz Expected a floating-point number)r7rWrrr[rr\rHs rr,zParser.expect_float_sB    5;; .?? " .0H0H  r?c|jtjk(r|jS|jtjur|j St d|jN,Expected an integer or floating-point numberr1rrr,r/rrr\rHs rrzParser.expect_integer_or_float_\  EKK /%%' '  " "ell 2&&( (!>@X@X r?c|jtjk(r|jS|jtjur|j dz St d|j)NrrrrHs rr~zParser.expect_decipoint_sa  EKK /%%' '  " "ell 2&&(2- -!>@X@X r?cd}ddd}|jdk7rZ|j|vr|j}|||z}n#td|j|j|jdk7rZ|S)Nrrr$)OlderSiblingFontAttributeElidableAxisValueNamerRzUnexpected STAT flag )r2rrr[r\)r8r1r3ros rr%zParser.expect_stat_flagss)*%& #%5(((*d +%+DOO+<=t?W?W #% r?c|jtjk(r|jS|jtjur|j St d|jrrrHs rexpect_stat_values_zParser.expect_stat_values_rr?c|j|jtjur |jSt d|j )NzExpected a string)r7rWrSTRINGr[rr\rHs rrzParser.expect_string_s>    5<< /?? "143K3KLLr?c2|rJ|jr>tj|_|jj d\|_|_y|j|j|jc|_|_|_ t|j\|_|_|_ |jtjk7ry|jj|j|jfy#t$rd\|_|_YjwxYw)Nrr)r3rrXrWr#r[r\r1r2r4nextr5 StopIterationrY)r8r s rr7zParser.advance_lexer_s **#(==D 8<8J8J8N8Nq8Q 5DOT5 %%  )) LD $/43K  G % )$-$$ 5    % %t'7'79R9R&S T! G:F7%t'7 Gs(C;;DDcHdjtt|S)z'abc' --> 'cba'r)r%rrL)rs rreverse_string_zParser.reverse_string_ swwxQ())r?ct}||kDr td|t||dzD]}|jd|z|S)z>(location, 999, 1001) --> ["cid00999", "cid01000", "cid01001"]z*Bad range: start should be less than limitrr)rLrrrY)r8rBrrrErs rrzParser.make_cid_range_ sS 5=! ["a.sc", "b.sc", "c.sc", "d.sc"]z Bad range: "z" and "z" should have the same lengthrNz+Start of range must be smaller than its endz^[A-Z]$rz%s%c%sz^[a-z]$z ^[0-9]{1,3}$r000rr)rLr$rrospath commonprefixrcompilerrordrYrr)r8rBrrrErevrr start_range limit_range uppercasec lowercasedigitsrrPs rrzParser.make_glyph_range_ sW u:U #!JOQVW  ""%%uen5RWW))3u:s5z*BCD v;?F s6{l;KF s6{l;KF .KF .K + %!=x JJz* ??; 'IOOK,H3{+S-=-AB > h&!V)<<= >MJJz* ??; 'IOOK,H3{+S-=-AB > h&!V)<<= >MO, << $k)B3{B/["1E1IJ C#a&.3{+;*;*=> &&&AB CMeUCXNNr?)rdTN)F)NFN)l__name__ __module__ __qualname____doc__rkr(rrbrcr>rrrrrbrarrrr`rrrrrrr^rrrrdr5rerrDrErFrGr`rwr{rrrhrrrrrrrrr staticmethodrrrrrrrr)r$rrrr9rrrrrircrfrlrsr}r{r|rrgrr]r8rrrrrrr^r r}r~rrrrrr,rr~r%rrr7rrr)rrs00rr r s0J C-21f-=>x!|>O-21f-=>x!|>OKO+B=~4 l " H RH  8(TbH[Gz&  A  YW27 r,3 j MQ" RC xt=  $ <0 Y68S"8@8:   )44 ;z*X8  D6 p@B'R  , :&  L \ U$LR!F+Z"H NJ#@LRVL!\ J  X B .R S K M6   M U0** +OWG?>s F Fr c*eZdZdZdZdZdZdZy)r+cig|_yrscopes_rHs rr>zSymbolTable.__init__D s t r?c:|jjiyr)rrYrHs rrpzSymbolTable.enter_scopeG s Br?c8|jjyr)rr#rHs rrqzSymbolTable.exit_scopeJ s r?c(||jd|<y)Nrr)r8roitems rrzSymbolTable.defineM s!% Rr?cft|jD]}|j|}|s|cSyr)rrr:)r8roscopers rrzSymbolTable.resolveP s4dll+ E99T?D  r?N)rrrr>rprqrrrdr?rr+r+C s &r?r+)fontTools.feaLib.errorrfontTools.feaLib.lexerrrrfontTools.feaLib.variableScalarrfontTools.misc.encodingToolsrfontTools.misc.textToolsr r r fontTools.feaLib.astfeaLibr(loggingrr getLoggerrrobjectr r+rdr?rrs[2KK:4<<"" g!q$OVq$OhI&r?