)EjddlmZddlmZmZmZddlmZddlm Z ddl m Z m Z m Z ddlmcmZddlZddlZddlZejeZGddeZGd d eZdS) )FeatureLibError)LexerIncludingLexerNonIncludingLexer)VariableScalar) getEncoding)bytechrtobytestostrNceZdZdZiZeZdeddDZdeddDZ dmd Z d Z d Z d Z dZ dZdZdZdZdZdZdndZdZdZdZdZdZdZdZdZdZd Zd!Zd"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-d0Z.d1Z/d2Z0d3Z1d4Z2d5Z3e4d6Z5e4d7Z6d8Z7d9Z8d:Z9d;Z:d<Z;d=ZZ=d?Z>d@Z?dAZ@dBZAdCZBdDZCdEZDdFZEdGZFdHZGdndIZHdJZIdKZJdLZKdMZLdNZMdOZNdPZO dodQZPdRZQdSZRdTZSdUZTdVZUdWZVdXZWdYZXdZZYd[ZZd\Z[d]Z\d^Z]dnd_Z^d`Z_daZ`dbZadcZbddZcdeZddfZedgZfdhZgdndiZhe4djZidkZjdlZkd S)pParsera 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. ch|]}d|zS)zss%02d.0is IC:\PYTHON\MyICR_Suite\python\Lib\site-packages\fontTools/feaLib/parser.py zParser.*>>>x!|>>>ch|]}d|zS)zcv%02drrs rrzParser.+rrdrTNc d|vr8ddlm}|dd|rtd|d}|rGtdt |dkrdnd d d d |Dt ||_|j |_ t|_ t|_ t|_t|_|j |jh|_d \|_|_g|_d|_|rt*nt,}||||_i|_|ddS)NglyphMapr)deprecateArgumentz#use 'glyphNames' (iterable) insteadz?'glyphNames' and (deprecated) 'glyphMap' are mutually exclusivezunsupported keyword argumentrsz: z, c34K|]}t|VdSN)repr)rks r z"Parser.__init__..<s(=V=V!d1gg=V=V=V=V=V=VrNN) 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 glyphNamesfollowIncludesr&kwargsr lexerClasss r__init__zParser.__init__-s    E E E E E E  j*O P P P X J//J  )V))22s22DII=V=Vv=V=V=V4V4V4VX  z??H((** #  (]]#  (]]#}d.@A2>/t/$(!'5L^^;L  jDDD   T*****rc|jj}|j|jr|d|jt jur;||j |j |j n| dr)||nO|jt jur)||n| dr)||n| dr)||n| dr)||nY| d r+||d n| d r)||n| d r)||n| dr)||n_| dr+||dn| dr(||n| dr*||d n|jt jur=|j |jvr/||j|j |nS|jt jur |j dkrt;d|j|j |j |j|j|jrId|j D}t;dd!|zd|jS)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.NTr'locationincludeanon anonymous anchorDeflanguagesystemlookupFvertical markClassfeature conditionset variation)rVtablevalueRecordDef;zbExpected feature, languagesystem, lookup, markClass, table, or glyph class definition, got {} "{}"c&g|]\}}d|d|dS) z (first found at )r)rnamelocs r z Parser.parse..s;D##.2TT3337rzMThe following glyph names are referenced but are missing from the glyph set:  )"r2 statementsr9r;r?cur_token_type_rCOMMENTappendr0Comment 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 extensionsSYMBOLrformatr>itemsr-)r@raerrors rparsez Parser.parseNsfY) #/43E/     . . .#u}44!!H$$T_t?W$XX%%i00& !!$"5"5"7"78888%)999!!$"C"C"E"EFFFF%%&;<<" !!$"7"7"9"9::::%%k22 !!$"7"7"9"9::::%%&677 !!$"<"<">">????%%h// !!$"4"4e"4"D"DEEEE%%k22 !!$"7"7"9"9::::%%i00 !!$";";"="=>>>>%%n55 !!$":":"<"<====%%k22 !!$";";d";"K"KLLLL%%g.. !!$"3"3"5"56666%%&677 !!$"D"De"D"T"TUUUU$ 22Ot66!!"B$/$/"B4"H"HIIII%55$/S:P:P%DDJF,doEE, M#/43E/\ < !%!3!3!5!5E""&))E"2"24  yrc |d|d|j}|jdkr,|d|ddS|jt jkr|}|j |}|td|z|j|d|j |j |j||jdd|S|d|d}}d}|jd kr)|d |}|jdkr)|}|}nd \}}|d|j ||d||||S) N<anchorNULL>zUnknown anchor "%s")r] contourpoint xDeviceTable yDeviceTablerITvariablerr%)expect_symbol_expect_keyword_rgr:r9rru expect_name_r4resolverr0Anchorxyrexpect_number_ parse_device_) r@rIr] anchordefrrrrrs r parse_anchor_zParser.parse_anchor_s C    X&&&+  v % %   ( ( (    $ $ $4  EJ . .$$&&D --d33I %)D0$2J    $ $ $8??  &3!!!# ""D"1143F3FPT3F3U3U1  ~ - -   0 0 0..00L  s " "--//L--//LL)3 &L, C   x %%%   rcg}|jdkrm|}| |jdkr-|d|}|||f|jdkm|S)Nr}mark)r:rrexpect_markClass_reference_rd)r@ anchorMarksr~rSs rparse_anchor_marks_zParser.parse_anchor_marks_s #%%''))F~$"2f"<"<   ( ( (88::I    2 3 3 3 #%%rc|dsJ|j}||}}d}|jdkr)|d|}|}|d|j|||||}|j |||S)NrNrrY)rrI) rhrgrr:rrrr0AnchorDefinitionr4define)r@rIrrrr]rs rrmzParser.parse_anchordef_s##K00000+""$$d&9&9&;&;1  ~ - -   0 0 0..00L  "" C   H-- !Q\H.   T9---rc|dsJ|}|j|\}}}||d|}||ks Jd|d|j|||S)NrK}z-bad splitting in Lexer.scan_anonymous_block()rYrH)rh expect_tag_r=scan_anonymous_blockr?rr0AnonymousBlock)r@tag_contentrIend_tags rrlzParser.parse_anonymous_s##$9:::::  #{??DD7H  C   ""$$g~~~N~~~ C   x&&sGh&GGGrcr|dsJ|j}|d}|h}|jdkr2|||jdk2|d|j|||S)NAttachTaccept_glyphnamerYrH) rhrgparse_glyphclass_rr:addrr0AttachStatement)r@rIglyphs contourPointss r parse_attach_zParser.parse_attach_s##H-----+'''>>,,../ #%%   d1133 4 4 4#%% C   x'' 'QQQrcn|jdvsJ||d|S)N>enum enumerateT enumeratedrR)rfr?parse_position_)r@rRs rparse_enumerate_zParser.parse_enumerate_sA"77777 ##th#GGGrcD|dsJ|j}|jdkr|d}nd}|d|jdkr|d}nd}|d|jdkr|d}nd}|d|jdkr|d}nd}|d|j|||||S)N GlyphClassDef,FrrYrH)rhrgr:rrr0GlyphClassDefStatement)r@rI baseGlyphsligatureGlyphs markGlyphscomponentGlyphss rparse_GlyphClassDef_zParser.parse_GlyphClassDef_sJ##O44444+  s " "///GGJJJ C    s " "!33U3KKNN!N C    s " "///GGJJJ C    s " ""44e4LLOO"O C   x..  NOh/   rc|j|j}}|d|d}|d|j|||}|j|||S)N=FrrYrH)rgrfrrr0GlyphClassDefinitionr5r)r@rIr]r glyphclasss rrkz#Parser.parse_glyphclass_definition_s14?$ C   '''?? C   X224(2SS  !!$ 333rc0|d}g}tt|D]e}d|d|d||d}}||jvr ||jvr|||fft|dkr|d\}}||fSt|dkrt d|z|dd|D}t d|d|d |) N-rrzU"%s" is not a glyph in the font, and it can not be split into a range of known glyphsz or c&g|]\}}d|d|dS)"z - r)rrls rr_z-Parser.split_glyph_range_..Fs+!M!M!M41aaAAA"6!M!M!MrzAmbiguous glyph range "z"; please use z to clarify what you mean)splitranger,r-r/rdr) r@r]rIparts solutionsrstartlimitrangess rsplit_glyph_range_zParser.split_glyph_range_#sA& 3 s5zz"" 1 1A88E!A#J//%)1D1D5E(((Ud6F-F-F  %000 y>>Q  $QV0WWB  $$$$%L7;7GLL-A#%%J C    rcngggggf\}}}}}d}|jdvr|d}d} |jdkr|ddx}} | r-|rtd|j||n-|r||n|||r)|||n|dd} |jdkr| g} |d| std|j| } |j | } | td | z|j| | |jdk| r|| |jdv|s#|s!|gksJg|dgt|z|g|fSt|dt|rtd |j|t|t|t|z} t| rLt|t|t|zdrtd |j| }nx|rR|d rJt|d kst|dd rtd |j|d d}n$t|rtd |j||||||fS)NF>byfromrrYTr'z_Unsupported contextual target sequence: at most one run of marked (') glyph/class names allowedrPz%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)r:rrrrgrdis_next_value_parse_valuerecord_rrr6rr,any)r@rRprefixrlookupsvaluessuffixhasMarksrmarked lookuplist lookup_namerP marked_valuess rparse_glyph_pattern_zParser.parse_glyph_pattern_s 46r2r22F/&>>>'''>>BF3&&##C((($((6 "*J0  b!!!! " b!!!! b!!!""$$ $ d55h??@@@@ d###J"h..%!#J$$X...)?0#//11 ..{;;>)- ;T=U!!&)))"h..  +z***[&>>>^$ Gf$ Gb====V 4fb(K K6-CKK-()) %8, #3v;;Vs6{{1J#JKM=!! vc&kkCKK799:;;)*0  ' F2J v;;??c&"+&6&6?)*0   V %&,  FGVVXF Frc@|j}|d\}}}}}}t|rtd|d||sOtd|d|} tt | |dd|dd}}|||f} | S) NFrQz(No lookups can be specified for "ignore rzAmbiguous "ignore z)", there should be least one marked glyphrr)rgrrrrrr) r@subrIrrrrrrrz chainContexts rparse_ignore_glyph_pattern_z"Parser.parse_ignore_glyph_pattern_s+<@ #%%    $ $ $    @ @ E E F F F#%% C   rcx|dsJ|j}||jdvr1|d}|j||S|jdvr1|d}|j||Std|j)Nignore) substituterrrH)positionposr z#Expected "substitute" or "position") rhrgr?rfrr0IgnoreSubstStatementIgnorePosStatementr)r@rIrs r parse_ignore_zParser.parse_ignore_*s##H-----+  ?3 3 355e< exclude_dflt include_dfltrrequiredTrYrH) rhrgexpect_language_tag_r:rrrr0LanguageStatement)r@rIrinclude_defaultrs rparse_language_zParser.parse_language_@s##J/////+,,..$1!  ? ? ?"//11^CO  z ) )   , , ,H C   x)) ox(*   rcr|dsJ|j}|d}|g}|jdkr2|||jdk2|d|j|||S)NLigatureCaretByIndexTrrYrH) rhrgrrr:rdrr0LigatureCaretByIndexStatementr@rIrcaretss rparse_ligatureCaretByIndex_z"Parser.parse_ligatureCaretByIndex_Os##$:;;;;;+'''>>%%''(#%% MM$--// 0 0 0#%% C   x55ffx5XXXrcz|dsJ|j}|d}|dg}|jdkr4||d|jdk4|d|j|||S)NLigatureCaretByPosTrrrYrH) rhrgrrr:rdrr0LigatureCaretByPosStatementrs rparse_ligatureCaretByPos_z Parser.parse_ligatureCaretByPos_Ys##$899999+'''>>%%t%445#%% MM$--t-<< = = =#%% C   x33FFX3VVVrc.|dsJ|j|}}|jdkre|j|}|t d|z|j|d|j ||Sd}|jdkr| dd}|j |||}| |||j |||S)NrPrYrrHF useExtensionT)rhrgrr:r6rrrr0LookupReferenceStatementr LookupBlock parse_block_r)r@rRrIr]rP use_extensionblocks rrozParser.parse_lookup_cs)##H-----143D3D3F3F$  s " "]**400F~%)D0$2J    $ $ $844Vh4OO O  ~ - -   0 0 0 M$$T=8$LL %*** T5))) rc|dsJ|j}|jtjkrE|}|d|j||Sd}d\}}}dddd d }t}|j dkr|j |vrtd |j z|j | |j |j d kr,|d |d }n}|j dkr,|d|d }nF|j |vr d}|||z}ntd|j z|j |j dk|dt#|||gstd|j |j||||S)N lookupflagrYrHF)rNNr) RightToLeftIgnoreBaseGlyphsIgnoreLigatures IgnoreMarksz%s can be specified only onceMarkAttachmentTyperUseMarkFilteringSetTz#"%s" is not a recognized lookupflagzlookupflag must have a value)markAttachmentmarkFilteringSetrI)rhrgr9rNUMBERrrr0LookupFlagStatementr.r:rr<rrrrr)r@rIvalue value_seenr6r7flagsseens rparse_lookupflag_zParser.parse_lookupflag_|sW##L11111+  EL 0 0''))E    $ $ $8///II I 2?/~/ !     uu#%%4''%3d6FF- HHT% & & &#777$$%9:::!%!7!7!7!O!O!%:::$$%:;;;#'#9#95#9#Q#Q  !U**! d&7&7&9&9 ::%9D>   !t|rtd||j |||||S|sk|sit|d krV| sT|d ||j |d |d |d |d || S|rtd ||j t#t%||||| |S)N>r rcursivebaseligaturerrYz3If "lookup" is present, no values must be specifiedrHr-rr)rrIz2"enumerate" is only allowed with pair positionings forceChainrI)rfr:parse_position_cursive_parse_position_base_parse_position_ligature_parse_position_mark_rgrrrrr0ChainContextPosStatementr,reversePairPosStatementSinglePosStatementlistzip) r@rrRrIrrrrrrs rrzParser.parse_position_s,"55555  y ( (// HEE E   ' ',,ZBB B   + +00XFF F   ' ',,ZBB B+<@"enumerate" is not allowed with cursive attachment positioningTrrYrH)rgrrrrrr0CursivePosStatement)r@rrRrIr entryAnchor exitAnchors rrMzParser.parse_position_cursive_s+ Y'''  !S ++T+BB ((** ''))  C   x++  Z(,   rc|j}|d|rtd||d}|}|d|j|||S)NrIzC"enumerate" is not allowed with mark-to-base attachment positioningTrrYrH)rgrrrrrr0MarkBasePosStatement)r@rrRrIrImarkss rrNzParser.parse_position_base_s+ V$$$  !6  %%t%<<((** C   x,,T58,LLLrc|j}|d|rtd||d}|g}|jdkrG|d|||jdkG|d|j |||S)NrJzG"enumerate" is not allowed with mark-to-ligature attachment positioningTr ligComponentrYrH) rgrrrrr:rdrr0MarkLigPosStatement)r@rrRrI ligaturesr]s rrOzParser.parse_position_ligature_s+ Z(((  !:  **D*AA ))++,.00   0 0 0 LL1133 4 4 4.00 C   x++Iux+PPPrc|j}|d|rtd||d}|}|d|j|||S)NrzC"enumerate" is not allowed with mark-to-mark attachment positioningTrrYrH)rgrrrrrr0MarkMarkPosStatement)r@rrRrI baseMarksr]s rrPzParser.parse_position_mark_/s+ V$$$  !6  **D*AA ((** C   x,,Y,QQQrc|dsJ|j|}}|d|j||S)NscriptrYrH)rhrgexpect_script_tag_rr0ScriptStatement)r@rIrfs r parse_script_zParser.parse_script_=sc##H-----3T5L5L5N5N& C   x'''BBBrc |jdvsJ|j}|jdv}|d\}}}}}}t|rt d|g} |jdkrX|d} |jdkr7|dd } | | |jdk7n:|jd kr-|d } |d g} nd} | dt| d kr$t|st d |j| d kr|rt d|t|dks+t|d  dkrt d|t| dkrt d||j ||d || d |Std|D} d} t| dkr6t| d tjr|rt d|g} d} |st|dkrt| dkr| d krt!|d  }t!| d  }t|dkr|t|z}t|t|kr/t dt|t|fz||j || ||||S| r?t|dkr,| d kr&|j ||d |d||S|s2t|dkrt| dkr | d krt|d  }| D]}t!| st d|t| dkr[t| |kr6t d|dt| d||j ||d || ||S|st|dkrt| dkr|t| d  dkrQ| d krK|j |||t!| d  d ||S|rWt|dkrt d|t| dkrt d|| d krt d|t)t!|d  }t)t!| d  }t|dkr|t|z}t|t|kr/t dt|t|fz||j |||| |St|dkr#t| dkrt d|t| d ks| rt d ||j |||||}|S)!N>rrsub reversesubr>rkrlFrQz-Substitution statements cannot contain valuesrrYT)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"rHcg|]}||Sr!r)rrs rr_z,Parser.parse_substitute_..vs???1rz>= %RCK  3s88q==SXX]]{a?O?O#a&//++,,FA 1 122L<  A%%+c&kk9 6{{c,////%?6{{C $5$567  800S*jXPX1   3s88q==[A-=-=822A#! 3   3s88q==SXX\\kQ>N>NA))**E  AJJLL))R)*FQQQqzz||$$))c!**,,.?.?5.H.H)UEUU8;AJJLL8I8IUUU  822A#! 3  C1 CA CFOO%%&&!++q  822SV__&&''*#! 3   3xx1}}%I 3xx1}}%%  a%NPXDQ!2!23344F!$s1v'8'8"9"9::L<  A%%+c&kk9 6{{c,////%?6{{C $5$567  8<<JS8=  s88a<`_.NrExpected platform id 1 or 3rrr rYUnsupported encoding) r9rNUMBERSexpect_any_number_rgrexpect_string_rrunescape_string_r@rrrrIrencoding unescapeds rrzParser.parse_name_s2   EM 1 10022J/H''%&CXNNN$ 55 3355 0022J/H ??!QIFF!QI%vF$$&& C   z9f==  !"8(CC C))&(;; 9fi77rcd}d}|jtjvrk|}|j}|dvrt d||jtjvr(|}|}n d}|j}|dkr |pd}|pd}n|pd}|pd}|}t|||}|t d||||}||||fS)Nrrrrrrr) r9rrrrgrrrrrs rparse_stat_name_zParser.parse_stat_name_s   EM 1 10022J/H''%&CXNNN$ 55 3355 0022J/H ??!QIFF!QI%vF$$&&z9f==  !"8(CC C))&(;; 9fi77rc|jdksJ|j|j|}}|dkrtd|j|\}}}}|j||||||S)Nriz*Name id value cannot be greater than 32767rH)rfrgrrrr0 NameRecord)r@rInameIDrrrrs rrzParser.parse_nameid_s(***DO***3T5L5L5N5N& E>>!V 150@0@0B0B- Ivvx"" J 66H#   rcdkrtjdj|}nfd}tjd||}t|dd}t |dS)N utf_16_bez\\[0-9a-fA-F]{4}c0|Sr!)unescape_byte_)mrr@s rz)Parser.unescape_string_..s!4!4Q!A!Arz\\[0-9a-fA-F]{2} surrogatepass)rerunescape_unichr_r r )r@rrrunescapeutf16s` ` rrzParser.unescape_string_sp { " "*D,A6JJAAAAAAAH*Hf==A;88UK(((rcv|ddd}tt|dSNrr)groupchrint)matchr~s rrzParser.unescape_unichr_s. KKNN122 3q"::rc|ddd}tt|d|Sr)rr rdecode)rrr~s rrzParser.unescape_byte_ s> KKNN122 s1bzz""))(333rct|D]3}t||jjrt||r|cSdSdSr!)reversedrr0re)r@raclass_previouss r find_previouszParser.find_previouss\ ,,  H(DH$455 Hf-- tttrc|j}|jdks|jr|d|jt jur;||j |j |j nk| dr| }n@| drZ|t|}||j||d|j n| dr||tj}|t%d |j |jrt%d |j |j|n;| d r| }n| d rY|t|}||j||d|j n| d r||tj}|t%d |j |jst%d|j |j|n |j dkr|jdk|jdSdS)NrTr'rHHorizAxis.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 statementsrY)rar:r;r?rbrrcrdr0rerfrgrhparse_base_tag_list_parse_base_script_list_r,BaseAxisrrrRminmaxparse_base_minmax_)r@rWra horiz_bases horiz_scriptsbase_script_list vert_bases vert_scriptss rrzParser.parse_table_BASE_s>% #%%);%     . . .#u}44!!H$$T_t?W$XX%%&=>>3 "7799 %%&@AA1  $ < VWW W y>>A  %  x''!++)>x//>>>0 ,L% ) )l,&&)=C===t?W##C((((x.. 9eT%=   rc g}|}t|dkrtd|jd|j|jdkr|jtj ur*| }| |n[|jtj ur*| }| |ntd|jd|j|jdkt|dkr1|\}}}||ks||krtd|d |d |d |j|j||S) Nr.r,z must be 4 charactersrYzUnexpected value "z". Expected integer or float.rzDefault value z is outside of specified range r.)rr,rrrfrgr:r9rr expect_float_rdr8rr<r0AxisValueLocationStatement)r@rrr:nominalmin_valmax_vals rr-zParser.parse_STAT_locations   syy{{  q !EDOEEE(  #%%$ 33**,, e$$$$&%,66++-- e$$$$%1)9111-#%% v;;!  (. %GWg  Gg$5$5%,W,,,,!(,,,-  x223???rc|j}g}|jdks|jrp|d|jt jur;||j |j |j n|jt j ur| drC|}||j|n| drX|}||j||dn| drY|}||j|||dn| d rp|}|jD])}|j|vrt/d |jd |j *|||dn*t/d |j |j |j dkrm|jdkf|jndSdS) NrTr'rHrElidedFallbackNameIDrYrr*zDesignAxis not defined for r4r)rar:r;r?rbrrcrdr0rerfrgrurhrrrr;rr(rr2r0r) r@rWra design_axesrr: designAxisaxisValueRecordrIs rrzParser.parse_table_STAT_s%  #%%);%     . . .#u}44!!H$$T_t?W$XX%33''(<== >>@@E%%dh&A&A%&H&HIIII))*@AA //11E%%dh&C&CE&J&JKKK'',,,,)),77!%!!>J&&z~666%%j111'',,,,))+66&*&A&A&C&CO$3$=#<{::#2 P P P P $ 8##;%%o666'',,,,)=DO==t?WC''I#%%);%%%%%rc|jdvsJ|jg}|jdkr2|||jdk2|d|S)N)rrrY)rfr:rdrgr)r@basess rrzParser.parse_base_tag_list_Ds#     ?   #%% LL0022 3 3 3#%% C    rc2|jdvsJ|j||g}|jdkrH|d||||jdkH|d|S)N)rrrrY)rfparse_base_script_record_r:rrd)r@r}scriptss rrzParser.parse_base_script_list_Ps#     ?   11%889#%%    $ $ $ NN499%@@ A A A#%% C   rc}}fdt|D}|||fS)Nc8g|]}Sr)r)rrr@s rr_z4Parser.parse_base_script_record_.._s%>>>A$%%''>>>r)rgr)r@r} script_tagbase_tagcoordss` rrBz Parser.parse_base_script_record_\sQ,,.. **,,>>>>u>>>8V++rc||}|}|}||jt jur |jdkstd|j |}|j dkrtd|j ||||fS)Nrz0Expected a comma between min and max coordinatesz0Feature tags are not yet supported in BASE table) rgrrr?rbrrwrfrrgr:)r@rFr min_coord max_coords rrzParser.parse_base_minmax_bs,,.. ,,..''))  $ 44C9O9O!B( ''))  s " "!B(  8Y 99rcd}|d|d|jdkr|dn||fg}|jdkr[|d|||f|jdk[t |}|d|S)Nr}devicerrr)rrr:rrdtuple)r@results rrzParser.parse_device_us C    X&&&  v % %   ( ( ( (**,,d.A.A.C.CDEF"c))##C((( t2244d6I6I6K6KLMMM"c))6]]F C    rcT|jtjup|jdkp |jdkS)Nr}()r9rr8r:r@s rrzParser.is_next_value_s4  !U\ 1 '3& '3& rc l|jtjur |jdks|jtjur\|d|j}}|r|j|||}n|j|||}|S| d|j}|jtj ur| }|dkr.| d|jS|j |}|td |z|j|j}|j|j} }|j|j} } n[|d|d|d|df\}} } } |jdkr||||f\} } }}t+d | r| nd | r| nd z|r|nd z|r|nd zD}|d d ks |ddkrtd|jnd\} } }}| d|j|| | | | | |||| S)NrQTr)yAdvancerRrI)xAdvancerRrIr}rrzUnknown valueRecordDef "%s"cg|]\}}|Srr)rrdeltas rr_z-Parser.parse_valuerecord_..s,#errrirz+Device value out of valid range (-128..127))NNNN)rRrI)r9rrwr:r8rrgr0 ValueRecordrrurr7rrr: xPlacement yPlacementrUrTrrr)r@rRnumberrIvalr]vrdr:rZr[rUrT xPlaDevice yPlaDevice xAdvDevice yAdvDevice allDeltass rrzParser.parse_valuerecord_sD  !U\ 1 1d6F#6M6M  "el 2 2##T#22(F h**#h+h**#h+J C   +  EJ . .$$&&Dv~~##C(((x++---$,,T22C{%1D8$:RIE&+&68H J"'.%.hHH##T#22##T#22##T#22##T#22 : 6J Hh  s " """$$""$$""$$""$$ > :J J 6@(H b%/7zzR(9%/7zzR(9&07zzR(9I|d""imc&9&9%A,': >V :J J  C   x##        $   rc.|dsJ|j}||}|}|d|j|||}|j|||S)NrXrYrH) rhrgrrrr0ValueRecordDefinitionr7r)r@rRrIr:r]r^s rrtz$Parser.parse_valuerecord_definition_s##$455555+''11  "" C   h,,T58,LL !!$,,, rc|jdksJ|j}|}|}|d|j|||S)NrOrYrH)rfrgrgrrr0LanguageSystemStatement)r@rIrfrs rrnzParser.parse_languagesystem_sq"22222+((**,,.. C   x//8/TTTrc|r|jdksJn |jdksJ|j}|}|dv}d}d}d}||jvr|}n||jvr|}n|dkrd}|r|}d} |jdkr|dd} |r|j ||| |} n|j || |} | | ||||| S) NrVrT>valtvhalvkrnvpalFrTr%)r)rI) rfrgrSS_FEATURE_TAGSCV_FEATURE_TAGSrr:rr0VariationBlock FeatureBlockr() r@rVrIrrR stylisticset cv_feature size_featurerUr)r*s rrqzParser.parse_feature_block_sZ  0?k11111?i////+  ::   $& & &LL D( ( (JJ F]]L  /,,..L  ~ - -   0 0 0 M  H++\,EEH))=8*E %<zRRR rc|jdksJ|j|j}|}|d|j||S)NrTrYrH)rfrgrrr0FeatureReferenceStatement)r@rI featureNames rparse_feature_reference_zParser.parse_feature_reference_sg)+++T_++++&&((  C   x11+1QQQrc |jdksJ|j|j||j|j}|d|jD]}||jdks|jr | d|j tj ur?|j |j|j|jn|drY|j}|\}}}}|j |j||||||n!|jdkrt'd |j|jdk|j |d|jD]}||d|S) zParses a ``featureNames`` statement found in stylistic set features. See section `8.c `_. featureNamesrHrrTr'r]rYr)rfr0 NestedBlockrgrr8 enter_scoper:r;r?rbrrcrardrerhrrr exit_scope) r@rr*symtabrIrrrrs rparse_featureNames_zParser.parse_featureNames_s.000$/000$$ 4+C%   C   ) ! !F    #%%);%     . . .#u}44 ''H$$T_t?W$XX%%f-- S38<8H8H8J8J5 Ivv ''H11ZFFX2 C''%&79QRRR##%%);%$ C   )  F        C    rc(|jdksJ|j|j||j|j}|d|jD]}||j}|jdks|j r;| d|j tj ur:||j|j|jn|hdr/||||jn~|dr)|||n@|jd krt'd |j |j|j|jdk3|j ;|d|jD]}||d |S) N cvParametersrHrrTr'>SampleTextNameIDFeatUILabelNameIDParamUILabelNameIDFeatUITooltipTextNameID CharacterrYzExpected statement: got {} {})rfr0rzrgrr8r{rar:r;r?rbrrcrdrerhparse_cvNameIDs_parse_cvCharacter_rrxr|)r@rr*r}ras rparse_cvParameters_zParser.parse_cvParameters_<sI.000$/000$$ 4+C%   C   ) ! !F    % #%%);%     . . .#u}44!!H$$T_t?W$XX%% !!$"7"7T_"M"MNNNN%%k22 !!$"9"9#">">????C''%3::,do, )#%%);%6 C   )  F        C    rc |j|ksJ|j|j|||j}|d|jD]}||jdks|jr | d|j tj ur?|j |j|j|jn|drZ|j}|\}}}} |j |j||||| ||n!|jdkrt'd|j|jdk|j |d|jD]}||d|S) NrHrrTr'r]rYr)rfr0rzrgrr8r{r:r;r?rbrrcrardrerhrCVParametersNameStatementrr|) r@r block_namer*r}rIrrrrs rrzParser.parse_cvNameIDs_is*,,,do,,,$$S*t?W$XX C   ) ! !F    #%%);%     . . .#u}44 ''H$$T_t?W$XX%%f-- S38<8H8H8J8J5 Ivv ''H66"!"!)7    C''%&79QRRR/#%%);%0 C   )  F        C    rc6|jdksJ|j|j|}}|dd|cxkrdks&nt ddd||j|||S)NrrYirz/Character value must be between {:#x} and {:#x}rH)rfrgrrrrxr0CharacterStatement)r@rrI characters rrzParser.parse_cvCharacter_s+---t---"68O8O8Q8Q) C   I********!""(&H"5"5  x**9cH*MMMrc|jdksJ|j|j|}}|d|dkrt d||j||S)NrrYrz&Font revision numbers must be positiverH)rfrgr5rrr0FontRevisionStatement)r@rIversions rrzParser.parse_FontRevision_s.000$/000 4d6H6H6J6J' C   a<<!"JHUU Ux--g-IIIrc|j}|}i}|d|jdkr)||jt jurtd|j|j }||vrtd||j|j t j ur| }n)|j t j ur|d}|j t j ur| }n)|j t j ur|d}|d||f||<|jdk)|d|}||krtd|z|j|j||| S) NrrExpected an axis namezRepeated condition for axis FrrYrrH)rgrrr:r?rbrrurrfr9rr5r8rr0ConditionsetStatement)r@rIr] conditionsaxis min_value max_value finalnames rrrzParser.parse_conditionset_s+  ""  C   #%%    ! ! !#5:55%&=t?WXXX?Dz!!%94994;S$ 33 ..00 &%,66 ///?? $ 33 ..00 &%,66 ///??    $ $ $ )95Jt -#%%0 C   %%''   !/D"8$:RSS Sx--dJ-RRRrc |d|jD]}||j}|jdks|jrw|d|jtj ur;| |j |j |jn|jtjur)| |n|dr)| |n|ddhr+| || nC|d r)| |n|d r)| |n|d r)| |n|d r*| ||nJ|dr)| |n |dr)| |n|ddhr,| |d|n|dr)| |nM|hdr)| |n |dr)| |n|dr*| ||n|r?|dr*| ||nO|r?|dr*| | |n|r=|dr(| |!n|r=|dr(| |"n|jtj#ur=|j |j$vr/| |j$|j |n@|j dkrCtKd&|j|j |j|jdko|jw|d|jD]}|'|(}||j)*kr/tKd|j)*z|j|ddS)NrrTr'rHrNrrrQrTrrrPr,rSr rFrrf>rrkrlrrrXryrrrrYz7Expected glyph class definition or statement: got {} {}r)+rr8r{rar:r;r?rbrrcrdr0rerfrgrjrkrhrmrrwr rror>rprrirrrtr~rrrrurvrrxr|rr]r) r@r*rRrqrsrrr}rar]s rr(zParser.parse_block_se C   ) ! !F    % #%%);%     . . .#u}44!!H$$T_t?W$XX%)999!!$"C"C"E"EFFFF%%k221 !!$"7"7"9"9::::%%v{&;<</ !!$"7"7"7"J"JKKKK%%i00- !!$"?"?"A"ABBBB%%h//+ !!$"4"4"6"67777%%j11) !!$"6"6"8"89999%%h//' !!$"4"4X">">????%%l33% !!$"8"8":":;;;;%%k22# !!$"7"7"9"9::::%%uj&9::! !!((EH(MM%%h// !!$"4"4"6"67777%%&Q&Q&QRR !!$"8"8":":;;;;%%j11 !!$"6"6"8"89999%%&677 !!$"D"DX"N"NOOOO $"6"6~"F"F !!$":":<"H"HIIII  4 4^ D D !!$":"::"F"FGGGG $"6"6|"D"D !!$"="="?"?@@@@ $"6"6~"F"F !!$";";"="=>>>>$ 22Ot66!!"B$/$/"B4"H"HIIIIC''%MTT,do, i#%%);%v C   )  F         "" 5:##%% % %!%*"2"2"4"44d6N  C     rc|jtjur1t|t dr |j|kS|j|vSdS)NrF)rbrrurtyperf)r@r#s rrhzParser.is_cur_keyword_sI  5: - -!T"XX&& ,!++!++urc||jtjurt d|j|jS)NzExpected @NAME)r?rbrrjrrgrfrRs rrAzParser.expect_class_name_sA   u'7 7 7!"2D4LMM Mrc||jtjur|jSt d|j)NzExpected a CID)r?rbrrrfrrgrRs rrzParser.expect_cid_%s@   59 , ,? ".0HIIIrc||jtjurt d|j|jS)NzExpected file name)r?rbrFILENAMErrgrfrRs rrzParser.expect_filename_+s@   u~ 5 5!"68PQQ Qrc||jtjur|jdS|jtjur d|jzStd|j)N\cid%05dzExpected a glyph name or CID) r?rbrrurflstriprrrgrRs rrzParser.expect_glyph_1sk   5: - -?))$// /  !UY . .t. .VWWWrcf|jr'|D]&}||jvr ||jvr|j|j|<%dSdS)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/r>rg)r@rr]s rrz$Parser.check_glyph_name_in_glyph_set9sg   B B B4+++t|++)-)ADL&  B B B Brc|}|j|}|td|z|jt ||jjstd|z|j|S)NzUnknown markClass @%sz@%s is not a markClass)rAr5rrrgrr0r)r@r]mcs rrz"Parser.expect_markClass_reference_Gs&&((   ' ' - - :!'$.0H "dh011 !(4/1I  rc||jtjurt d|jt |jdkrt d|j|jdzddS)NzExpected a tagr.z'Tags cannot be longer than 4 charactersz )r?rbrrurrgr,rfrRs rrzParser.expect_tag_Ts   uz 1 1!"2D4LMM M t  ! # #!94;S &("1"--rcd|}|dkrtd|j|S)Ndfltz4"dflt" is not a valid script tag; use "DFLT" insteadrrrgr@rs rrgzParser.expect_script_tag_^s>   &==!F(  rcd|}|dkrtd|j|S)NDFLTz6"DFLT" is not a valid language tag; use "dflt" insteadrrs rrzParser.expect_language_tag_gs>   &==!H(  rc||jtjur |j|kr|St d|z|j)Nz Expected '%s')r?rbrrwrfrrg)r@symbols rrzParser.expect_symbol_psM   5< / /DOv4M4MMo68PQQQrc||jtjur|j|kr|jSt d|z|j)Nrr?rbrrurfrrg)r@rys rrzParser.expect_keyword_vsP   5: - -$/W2L2L? "o79QRRRrc||jtjur|jSt d|j)NzExpected a namerrRs rrzParser.expect_name_|s@   5: - -? "/1IJJJrc||jtjur|jS|r2|jtjur|jdkr|Std|j)NrQzExpected a number) r?rbrr8rfrwexpect_variable_scalar_rrg)r@rs rrzParser.expect_number_sv   5< / /? "  2, <<TWAWAW//11 1143KLLLrc|t} |jtjkr |jdkrn.|\}}|||O|S)NTr\)r?rrbrrwrfexpect_master_ add_value)r@scalarrIr:s rrzParser.expect_variable_scalar_sz !! .#u|3338N8N"1133OHe   Xu - - -  .  rci} |jtjurtd|j|j}||jtjur |jdkstd|j|}|||<|j tjur|j ddkrn]||jtjur |jdkstd|j||t|jd d}|||fS) NTrrzExpected an equals signr:rz#Expected an comma or an equals signr) rbrrurrgrfr?rwexpect_integer_or_float_r9r:r)r@rIrr:s rrzParser.expect_master_sk "#5:55%&=t?WXXX?D    ! ! !(EL88T_PS=S=S%-t/G1133E"HTN$ 22t7G7Jc7Q7Q    ! ! !(EL88T_PS=S=S%94;S    ! ! !' "( DOABB'(( rc||jtjvr|jSt d|j)Nz/Expected a decimal, hexadecimal or octal number)r?rbrrrfrrgrRs rrzParser.expect_any_number_sF   5= 0 0? " =t?W   rc||jtjur|jSt d|j)Nz Expected a floating-point number)r?rbrrrfrrgrRs rr5zParser.expect_float_sF   5; . .? " .0H   rc|jtjkr|S|jtjur|St d|jN,Expected an integer or floating-point numberr9rrr5r8rrrgrRs rrzParser.expect_integer_or_float_`  EK / /%%'' '  "el 2 2&&(( (!>@X rc|jtjkr|S|jtjur|dz St d|j)NrrrrRs rrzParser.expect_decipoint_se  EK / /%%'' '  "el 2 2&&((2- -!>@X rcd}ddd}|jdkrQ|j|vr |}|||z}ntd|j|j|jdkQ|S)Nrrr-)OlderSiblingFontAttributeElidableAxisValueNamerYzUnexpected STAT flag )r:rrrfrg)r@r:r<r]s rr.zParser.expect_stat_flagss)*%&  #%%5((((**d +%=DO==t?W #%% rc|jtjkr|S|jtjur|St d|jrrrRs rexpect_stat_values_zParser.expect_stat_values_rrc||jtjur|jSt d|j)NzExpected a string)r?rbrSTRINGrfrrgrRs rrzParser.expect_string_s@   5< / /? "143KLLLrc|rA|jr:tj|_|jd\|_|_dS|j|j|j c|_|_|_ t|j \|_|_|_ n#t$rd\|_|_YnwxYw|jtjkrdS|j |j|j f)NrTr%)r;rrcrbr+rfrgr9r:r<nextr= StopIterationrd)r@r(s rr?zParser.advance_lexer_s  * #(=D 8<8J8N8Nq8Q8Q 5DOT5 F% ) LD $/43K U G %% )$--  G G G:F7%t'7'7'7 G$ 55   % %t'79R&S T T T Us+'BB/.B/c`dtt|S)z'abc' --> 'cba'r)r-rrU)rs rreverse_string_zParser.reverse_string_ s$wwxQ(()))rct}||krtd|t||dzD]}|d|z|S)z>(location, 999, 1001) --> ["cid00999", "cid01000", "cid01001"]z*Bad range: start should be less than limitrr)rUrrrd)r@rIrrrOrs rrzParser.make_cid_range_ sh 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)rUr,rrospath commonprefixrcompilerrordrdrr)r@rIrrrOrevrr start_range limit_range uppercasec lowercasedigitsrr\s rrzParser.make_glyph_range_ s# u::U # #!/JO%%QVQVQVW  "%%uen55RW))33u::ss5zz*BCCDD v;;??F s6{{l :;KF s6{{l :;KKF .KF .K + % %!=x Jz** ??; ' ' IOOK,H,H 3{++S-=-=-ABB > > h&!V)<<====MJz** ??; ' ' IOOK,H,H 3{++S-=-=-ABB > > h&!V)<<====MO,, << $ $ k)B)B 3{B//["1E1E1IJJ C C#a&&.3{+;+;*;*=*=> &&&&&&ABBBBMoeeeUUUCXNNNr)rTN)F)NFN)l__name__ __module__ __qualname____doc__rvr0rrmrnrFr{rrrmrlrrrrkrrrrrr rirrr#ror>rprrMrNrOrPrirrrrrsrrrrrrrrr staticmethodrrrrrrr(r2r-rrrrBrrrrrtrnrqrwr~rrrrrrr(rhrArrrrrrrgrrrrrrrrr5rrr.rrr?rrrrrrr r s0J C>>UU1f-=-=>>>O>>UU1f-=-=>>>OKO++++B===~4 4 4 l   " H H H R R RHHH    8(((TbbbbH[G[G[Gz&    AAA    YYYWWW27 7 7 r,3 3 3 j   M M MQQQ" R R RCCC }}}~===    $   <0 Y Y Y68SSS"888@888:     ) ) )\44\4   ;;;z***X8    D6 6 6 p@@@B'''R      ,,, :::&      L L L \   UUU$$$$LRRR!!!F+++Z"""H N N NJJJ$S$S$SNRVL!L!L!L!\ JJJ  XXX B B B   ...RRR SSS KKK MMMM6       MMM UUUU0**\*   +O+O+O+O+Orr c,eZdZdZdZdZdZdZdS)r3cig|_dSr!scopes_rRs rrFzSymbolTable.__init__J st rc:|jidSr!)rrdrRs rr{zSymbolTable.enter_scopeM s Brc8|jdSr!)rr+rRs rr|zSymbolTable.exit_scopeP s rc&||jd|<dS)Nrr)r@r]items rrzSymbolTable.defineS s!% Rrcjt|jD]}||}|r|cSdSr!)rrrC)r@r]scopers rrzSymbolTable.resolveV sEdl++  E99T??D   trN)rrrrFr{r|rrrrrr3r3I s_   &&&rr3)fontTools.feaLib.errorrfontTools.feaLib.lexerrrrfontTools.feaLib.variableScalarrfontTools.misc.encodingToolsrfontTools.misc.textToolsr r r fontTools.feaLib.astfeaLibr0loggingrr getLoggerrrobjectr r3rrrrs1222222KKKKKKKKKK::::::444444<<<<<<<<<<""""""""" g!!w$Ow$Ow$Ow$Ow$OVw$Ow$Ow$OtI&r