Warning: session_start(): Session cannot be started after headers have already been sent in /home/tvrreohg/public_html/manga.php on line 13
3 2jon@sddlmZddlmZmZmZddlmZddlm Z m Z m Z ddl j jZddlZddlZddlZejeZGdddeZGdd d eZdS) )FeatureLibError)LexerIncludingLexerNonIncludingLexer) getEncoding)bytechrtobytestostrNc@s2eZdZdZiZeZddeddDZddeddƒDZfdd fd d Z d d Z ddZ ddZ ddZ ddZddZddZddZddZddZdd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Z d;d<Z!d=d>Z"d?d@Z#dAdBZ$dCdDZ%dEdFZ&dGdHZ'dIdJZ(dKdLZ)dMdNZ*dOdPZ+dQdRZ,dSdTZ-dUdVZ.dWdXZ/dYdZZ0d[d\Z1d]d^Z2e3d_d`Z4e3dadbZ5dcddZ6dedfZ7dgdhZ8didjZ9dkdlZ:dmdnZ;dodpZdudvZ?dwdxZ@dydzZAd{d|ZBd}d~ZCddZDddZEddZFddZGddZHddZIddZJddZKdddZLddZMddZNddZOddZPddZQddZRddZSddZTddZUddZVddZWddZXddZYddZZddZ[ddZ\ddZ]ddZ^ddZ_ddZ`dddZae3ddZbddZcddZdd S)Parsera 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. cCsh|] }d|qS)zss%02d).0ir r )szParser.cCsh|] }d|qS)zcv%02dr )r r r r rr*scTNcKsd|kr4ddlm}|dd|r*td|jd}|rhtdt|dkrLdnd d jd d |Dft||_|jj |_ t |_ t |_ t |_t |_|j |jh|_d\|_|_g|_d|_|rtnt}|||d |_|jdddS)NZglyphMapr)deprecateArgumentz#use 'glyphNames' (iterable) insteadz?'glyphNames' and (deprecated) 'glyphMap' are mutually exclusivez"unsupported keyword argument%s: %srsz, css|]}t|VqdS)N)repr)r kr r r <sz"Parser.__init__..) includeDirT)comments)NN)ZfontTools.misc.loggingToolsr TypeErrorpoplenjoinset glyphNames_astZ FeatureFiledoc_ SymbolTableanchors_ glyphclasses_lookups_ valuerecords_symbol_tables_next_token_type_ next_token_ cur_comments_next_token_location_rrlexer_advance_lexer_)selfZ featurefileZ glyphNamesZfollowIncludesrkwargsrZ lexerClassr r r__init__,s0   ,    zParser.__init__cCs|jj}x|jdk s|jr|jdd|jtjkrR|j|j j |j |j dq |j drl|j|jq |jtjkr|j|jq |j dr|j|jq |j dr|j|jq |j d r|j|jq |j d r|j|jd d q |j d r|j|jq |j dr.|j|jq |j drJ|j|jq |j drj|j|jd d q |jtjkr|j |jkr|j|j|j |q |jtjkr|j dkrq q tdj|j|j |j q W|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.NT)r)locationincludeanon anonymous anchorDeflanguagesystemlookupF)vertical markClassfeaturetablevalueRecordDef;zbExpected feature, languagesystem, lookup, markClass, table, or glyph class definition, got {} "{}")r4r5)r" statementsr)r+r.cur_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_table_parse_valuerecord_definition_NAME extensionsSYMBOLrformat)r/r?r r rparseMsH              z Parser.parsec Cs|jd|jd|j}|jdkr<|jd|jddS|jtjkr|j}|jj |}|dkrtt d||j|jd|j j |j |j||jdd|dS|j|j}}d}|jdkr|jd|j}|jdkr|j}|j}nd\}}|jd|j j ||d||||dS) N<anchorNULL>zUnknown anchor "%s")name contourpoint xDeviceTable yDeviceTabler2r\)NN)expect_symbol_expect_keyword_rEr*r)rrR expect_name_r$resolverr!ZAnchorxyr\expect_number_ parse_device_) r/r2r[ anchordefrcrdr\r]r^r r r parse_anchor_}sP             zParser.parse_anchor_cCsTg}xJ|jdkrN|j}|dkr,|jdkr,q|jd|j}|j||fqW|S)NrWmark)r*rhr`expect_markClass_reference_rB)r/Z anchorMarksrXr:r r rparse_anchor_marks_s  zParser.parse_anchor_marks_cCs|jdst|j}|j|j}}d}|jdkrF|jd|j}|j}|jd|jj |||||d}|j j |||S)Nr6r\r>)r\r2) rFAssertionErrorrErer*r`rar_r!ZAnchorDefinitionr$define)r/r2rcrdr\r[rgr r rrKs   zParser.parse_anchordef_cCsn|jdst|j}|jj|\}}}|j|jd|j}||ksRtd|jd|jj|||dS)Nr4r5}z-bad splitting in Lexer.scan_anonymous_block()r>)r2)r4r5) rFrl expect_tag_r-Zscan_anonymous_blockr.r_r!ZAnonymousBlock)r/tag_contentr2end_tagr r rrJs  zParser.parse_anonymous_cCsd|jdst|j}|jdd}|jh}x|jdkrF|j|jq,W|jd|jj |||dS)NAttachT)accept_glyphnamer>)r2) rFrlrEparse_glyphclass_rer*addr_r!ZAttachStatement)r/r2glyphsZ contourPointsr r r parse_attach_s    zParser.parse_attach_cCs$|jdkst|j|jd|dS)N enumerateenumT) enumeratedr9>rzr{)rDrlr.parse_position_)r/r9r r rparse_enumerate_szParser.parse_enumerate_cCs|jdst|j}|jdkr,|jdd}nd}|jd|jdkrR|jdd}nd}|jd|jdkrx|jdd}nd}|jd|jdkr|jdd}nd}|jd|jj|||||dS)N GlyphClassDef,F)rur>)r2)rFrlrEr*rvr_r!ZGlyphClassDefStatement)r/r2Z baseGlyphsZligatureGlyphsZ markGlyphsZcomponentGlyphsr r rparse_GlyphClassDef_s(        zParser.parse_GlyphClassDef_cCsR|j|j}}|jd|jdd}|jd|jj|||d}|jj|||S)N=F)rur>)r2)rErDr_rvr!ZGlyphClassDefinitionr%rm)r/r2r[rx glyphclassr r rrI s   z#Parser.parse_glyphclass_definition_c Cs|jd}g}x\tt|D]L}dj|d|dj||d}}||jkr||jkr|j||fqWt|dkr|d\}}||fSt|dkrtd||n&djdd|D}td||f|dS) N-rrzU"%s" is not a glyph in the font, and it can not be split into a range of known glyphsz or cSsg|]\}}d||fqS)z "%s - %s"r )r rlr r r 6sz-Parser.split_glyph_range_..zBAmbiguous glyph range "%s"; please use %s to clarify what you mean)splitrangerrr rBr) r/r[r2partsZ solutionsr startlimitrangesr r rsplit_glyph_range_s& &   zParser.split_glyph_range_Fc Cs:|r`|jtjtjfkr`|r<|jdkr<|j|jj|jdS|j }|j ||jj ||jdS|jtj kr|j|j j|j}|dkrtd|j|jt||jjr|jj||jdS|jj||jdS|jd|j}|jj|d}x<|jdkr*|jtjkr|j }|j}d|krl|jrl||jkrl|j||\}}|j |||j|||j|||n|jdkr|}|jd|j }|j |||j|||j|||nBd|kr|j rtjttd|||j ||j|q|jtjkr|j }|jdkrn|j} |j} |jd|j} |j d| d d| d |j | | |j!| | | n"d|jd } |j | |j| q|jtj kr|j|j j|j}|dkrtd|j|jt||jjr|jj||jd}n|jj||jd}|j"|qtd |j|j#qW|jd|S) NrY)r2zUnknown glyph class @%s[]rz.Ambiguous glyph name that looks like a range: cidZ05dzBExpected glyph name, glyph range, or glyph class reference, found )$r)rrRCIDr*r.r!Z NullGlyphrE expect_glyph_check_glyph_name_in_glyph_setZ GlyphNamerHr%rbrDr isinstance MarkClassZ MarkClassNameZGlyphClassNamer_Z GlyphClassr rZ add_rangemake_glyph_range_logwarningstrrB expect_cid_Z add_cid_rangemake_cid_range_Z add_classr,) r/ru accept_nullglyphgcr2rxrrZrange_locationZ range_startZ range_endZ glyph_namer r rrv=s                    zParser.parse_glyphclass_cCs`gggggf\}}}}}d}x|jdkr:|jdd}d} |jdkrX|jdd}} | rx|rltd |j|j|n|r|j|n |j||jr|j|j|n |jdd} xn|jd kr(| dkrg} |jd | std |j|j } |j j | } | dkrtd | |j| j| qW| r |j| q W| rt| rt|gksZt g|dgt ||g|fSt|dt |rtd |j|t |t |t |} t| rt|t |t |drtd|j| }n`|r6|dr6t |dkst|ddr(td|j|dd}nt|rLtd|j||||||fSdS)NFbyfromr>rT)ru'z_Unsupported contextual target sequence: at most one run of marked (') glyph/class names allowedr8z%Lookups can only follow marked glyphszUnknown 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>rrrr>rr)r*rvr_rrErBis_next_value_parse_valuerecord_r`rar&rbrlrany)r/r9prefixrxlookupsvaluessuffixhasMarksrZmarkedZ lookuplist lookup_namer8Z marked_valuesr r rparse_glyph_pattern_s|             zParser.parse_glyph_pattern_c Cs|j}|jdd\}}}}}}|||fg}t|} xL|jdkr~|jd|jdd\}}}}}}|j|||f| pzt|} q4W|jd|| fS)NF)r9rr>)rErrr*r_rB) r/r2rrxrrrr chainContext hasLookupsr r rparse_chain_context_s    zParser.parse_chain_context_cCs|jdst|j}|j|jd krP|j\}}|r@td||jj||dS|jd kr|j\}}|rttd||jj ||dStd |jdS) Nignore substitutesubz,No lookups can be specified for "ignore sub")r2positionposz,No lookups can be specified for "ignore pos"z#Expected "substitute" or "position")rr)rr) rFrlrEr.rDrrr!ZIgnoreSubstStatementZIgnorePosStatement)r/r2rrr r r parse_ignore_s"    zParser.parse_ignore_cCs*|jdkst|j}|j}tj||dS)Nr3)r2)rDrlrEexpect_filename_r!ZIncludeStatement)r/r2filenamer r rrG+szParser.parse_include_cCsp|jdst|j}|j}d \}}|jd kr:|jdk}|jdkrR|jdd}|jd|jj ||||dS) NlanguageTF exclude_dflt include_dfltrequiredr>)r2)TF>rr) rFrlrEexpect_language_tag_r*rar`r_r!ZLanguageStatement)r/r2rinclude_defaultrr r rparse_language_2s     zParser.parse_language_cCsd|jdst|j}|jdd}|jg}x|jdkrF|j|jq,W|jd|jj |||dS)NLigatureCaretByIndexT)rur>)r2) rFrlrErvrer*rBr_r!ZLigatureCaretByIndexStatement)r/r2rxcaretsr r rparse_ligatureCaretByIndex_As    z"Parser.parse_ligatureCaretByIndex_cCsd|jdst|j}|jdd}|jg}x|jdkrF|j|jq,W|jd|jj |||dS)NLigatureCaretByPosT)rur>)r2) rFrlrErvrer*rBr_r!ZLigatureCaretByPosStatement)r/r2rxrr r rparse_ligatureCaretByPos_Ks    z Parser.parse_ligatureCaretByPos_cCs|jdst|j|j}}|jdkrf|jj|}|dkrLtd||j|jd|j j ||dSd}|jdkr|j dd}|j j |||d}|j |||jj|||S)Nr8r>zUnknown lookup "%s")r2F useExtensionT)rFrlrErar*r&rbrr_r!ZLookupReferenceStatementr`Z LookupBlock parse_block_rm)r/r9r2r[r8 use_extensionblockr r rrMUs"      zParser.parse_lookup_cCsP|jdst|j}|jtjkrB|j}|jd|jj ||dSd}d\}}}dddd d }t }x|j dkr|j |krt d |j |j |j|j |j d kr|jd |jdd }qf|j dkr|jd|jdd }qf|j |krd}|||jB}qft d|j |j qfW|jdt|||gs)r2Frr)Z RightToLeftZIgnoreBaseGlyphsZIgnoreLigaturesZ IgnoreMarksz%s can be specified only onceZMarkAttachmentType)ruZUseMarkFilteringSetTz#"%s" is not a recognized lookupflagzlookupflag must have a value)markAttachmentmarkFilteringSetr2)rNN)rFrlrEr)rNUMBERrer_r!ZLookupFlagStatementrr*rr,rwr`rvrar)r/r2valueZ value_seenrrflagsseenr r rparse_lookupflag_nsP             zParser.parse_lookupflag_cCs|jdst|j}|jdd}|j}|j}|jd|jjj |}|dkrv|j j |}||jj|<|j j |||j j||||d}|j||S)Nr:T)rur>)r2)rFrlrErvrhexpect_class_name_r_r"Z markClassesgetr!rr%rmZMarkClassDefinitionZ addDefinition)r/r2rxrXr[r:Zmcdefr r rrNs     zParser.parse_markClass_c CsH|jdkst|jdkr$|j||S|jdkr:|j||S|jdkrP|j||S|jdkrf|j||S|j}|j|\}}}}}} |j dt |rt |rt d||j j |||||d S| o| ot|d ko| r|d dkr|j|j j|d |d |d |d ||d S|r(t d||j jtt||||| |dS)Nrrcursivebaseligaturerir>z3If "lookup" is present, no values must be specified)r2rrr)r|r2z2"enumerate" is only allowed with pair positionings) forceChainr2>rr)rDrlr*parse_position_cursive_parse_position_base_parse_position_ligature_parse_position_mark_rErr_rrr!ZChainContextPosStatementrreverseZPairPosStatementZSinglePosStatementlistzip) r/r|r9r2rrxrrrrr r rr}sL            zParser.parse_position_cCsX|j}|jd|rtd||jdd}|j}|j}|jd|jj||||dS)Nrz>"enumerate" is not allowed with cursive attachment positioningT)rur>)r2)rEr`rrvrhr_r!ZCursivePosStatement)r/r|r9r2rZ entryAnchorZ exitAnchorr r rrs   zParser.parse_position_cursive_cCsN|j}|jd|rtd||jdd}|j}|jd|jj|||dS)NrzC"enumerate" is not allowed with mark-to-base attachment positioningT)rur>)r2)rEr`rrvrkr_r!ZMarkBasePosStatement)r/r|r9r2rmarksr r rrs   zParser.parse_position_base_cCsx|j}|jd|rtd||jdd}|jg}x&|jdkrZ|jd|j|jq6W|jd|jj |||dS)NrzG"enumerate" is not allowed with mark-to-ligature attachment positioningT)ruZ ligComponentr>)r2) rEr`rrvrkr*rBr_r!ZMarkLigPosStatement)r/r|r9r2Z ligaturesrr r rr s      zParser.parse_position_ligature_cCsN|j}|jd|rtd||jdd}|j}|jd|jj|||dS)NrizC"enumerate" is not allowed with mark-to-mark attachment positioningT)rur>)r2)rEr`rrvrkr_r!ZMarkMarkPosStatement)r/r|r9r2Z baseMarksrr r rrs   zParser.parse_position_mark_cCs8|jdst|j|j}}|jd|jj||dS)Nscriptr>)r2)rFrlrEexpect_script_tag_r_r!ZScriptStatement)r/r2rr r r parse_script_+s zParser.parse_script_cCs|jd kst|j}|jd!k}|jdd\}}}}}}t|rHtd|g} |jdkr|jd} xP|jd kr|jd d d } | j | qbWn(|jd kr|jd } |jdd g} nd} |j d t | dkrt| rtd|j| d kr\|rtd|t |dkst |dj dkr&td|t | dkr>td||j j||d|| d|dSt dd|D} d} t | dkrt | dj dkrg} d } | rJt |dkrJt | dkrJ| dkrJt|dj }t| dj }t |dkr|t |}t |t |kr2tdt |t |f||j j|| ||||dS| rt |dkr| dkr|j j||d|f||dS| rt |dkrt |dj dkrt | dkrtdd| Ddkr| dkr|j j|t|dj d|tdd| D||dS| rt |dkrt | dkrt | dj dkr| dkr|j j|||t| dj d||dS|rPt |dkrtd|t | dkrtd|| dkrtd|tt|dj }tt| dj }t |dkr|t |}t |t |kr:tdt |t |f||j j|||| |dSt |dkrvt | dkrvtd|t | dks| rtd||j j|||||d}|S)"Nrr reversesubrsubF)r9z-Substitution statements cannot contain valuesrr>T)rurr)rurz3Expected "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")r2cSsg|]}|dk r|qS)Nr )r rr r rrdsz,Parser.parse_substitute_..z\Expected a glyph class with %d elements after "by", but found a glyph class with %d elements)rr2cSsg|]}t|jqSr )rglyphSet)r nr r rrscSsg|]}t|jdqS)r)rr)r rr r rrsz\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>rrrr>rr)rDrlrErrrr*r`rvrBr_rrr!ZAlternateSubstStatementrSingleSubstStatementMultipleSubstStatementmaxtupleZLigatureSubstStatementsortedZ ReverseChainSingleSubstStatementZChainContextSubstStatement)r/r2rZ old_prefixoldrrZ old_suffixrnewkeywordrZ num_lookupsZ is_deletionrx replacementsZruler r rparse_substitute_1s        $ $.      zParser.parse_substitute_cCs,|jdst|j}|jd|jj|dS)Nsubtabler>)r2)rFrlrEr_r!ZSubtableStatement)r/r2r r rparse_subtable_s zParser.parse_subtable_cCsv|jdst|j}|j}|j}d}d}|jtjtjfksF|dkrV|j}|j}|j d|j j |||||dS)N parametersgrr>)r2) rFrlrEexpect_decipoint_rer)rrFLOATr_r!ZSizeParameters)r/r2Z DesignSizeZ SubfamilyIDZ RangeStartZRangeEndr r rparse_size_parameters_s zParser.parse_size_parameters_cCs<|jdst|j}|j\}}}}|jjd|||||dS)N sizemenunamesize)r2)rFrlrE parse_name_r!FeatureNameStatement)r/r2 platformID platEncIDlangIDstringr r rparse_size_menuname_s zParser.parse_size_menuname_c Cs|jdst|j|j}}|jj||d}|jd|j|j|j |j |j |j |j |jdj|}|rr||ntd|j||jd|j}||krtd|j|j|jd|S) Nr<)r2{)ZGDEFheadZhheaZvhear[ZBASEzOS/2ZSTATz"table %s" is not supportedrnz Expected "%s"r>)rFrlrEror!Z TableBlockr_parse_table_GDEF_parse_table_head_parse_table_hhea_parse_table_vhea_parse_table_name_parse_table_BASE_parse_table_OS_2_parse_table_STAT_rrstrip)r/r2r[r<handlerrsr r rrPs0     zParser.parse_table_cCs|j}x|jdks|jr|jdd|jtjkrL|j|jj |j |j dq|j drf|j|j q|j dr|j|jq|j dr|j|jq|j dr|j|jq|j d krqqtd |j qWdS) NrnT)r)r2rtrrrr>zzExpected FontRevision)r?r*r+r.r@rrArBr!rCrDrErFparse_FontRevision_r)r/r<r?r r rr9s    zParser.parse_table_head_cCs|j}d }x|jdks|jr|jdd|jtjkrP|j|jj |j |j dq |jtj kr|j |kr|j j }|j}|j|jj|||j d|jd krtd |jq |j d krq q td |j q WdS) N CaretOffsetAscender DescenderLineGaprnT)r)r2r>zIncomplete statementz4Expected CaretOffset, Ascender, Descender or LineGap)rrrr)r?r*r+r.r@rrArBr!rCrDrErRlowerreZ HheaFieldrr,)r/r<r?fieldskeyrr r rrHs(      zParser.parse_table_hhea_cCs|j}d }x|jdks|jr|jdd|jtjkrP|j|jj |j |j dq |jtj kr|j |kr|j j }|j}|j|jj|||j d|jdkrtd |jq |j dkrq q td |j q WdS) NVertTypoAscenderVertTypoDescenderVertTypoLineGaprnT)r)r2r>zIncomplete statementz?Expected VertTypoAscender, VertTypoDescender or VertTypoLineGap)rrr)r?r*r+r.r@rrArBr!rCrDrErRrreZ VheaFieldrr,)r/r<r?rrrr r rrcs(      zParser.parse_table_vhea_cCs|j}x|jdks|jr|jdd|jtjkrL|j|jj |j |j dq|j drn|j }|r|j|q|j dkr|qqtd|j qWdS)NrnT)r)r2nameidr>zExpected nameid)r?r*r+r.r@rrArBr!rCrDrErF parse_nameid_r)r/r<r?Z statementr r rrs     zParser.parse_table_name_cCsd}d}|jtjkrR|j}|j}|d kr4td||jtjkr\|j}|j}n d}|j}|dkrv|pjd}|prd}n|p|d}|pd}|j}|jdt|||}|dkrtd||j ||}||||fS) z~Parses a name record. See `section 9.e `_.NrzExpected platform id 1 or 3ri r>zUnsupported encoding)rr) r)rNUMBERSexpect_any_number_rErexpect_string_r_runescape_string_)r/rrrr2rencoding unescapedr r rrs0         zParser.parse_name_cCsd}d}|jtjkrR|j}|j}|dkr4td||jtjkr\|j}|j}n d}|j}|dkrv|pjd}|prd}n|p|d}|pd}|j}t|||}|dkrtd||j||}||||fS)NrrzExpected platform id 1 or 3ri zUnsupported encoding)rr) r)rrrrErrrr)r/rrrr2rr r!r r rparse_stat_name_s.        zParser.parse_stat_name_cCs|jdkst|j|j|j}}|dkr8td|jd|koJdknrjtjd||jdS|j\}}}}|jj ||||||dS)Nriz*Name id value cannot be greater than 32767rz?Name id %d cannot be set from the feature file. Ignoring record)r2) rDrlrErrrrrr!Z NameRecord)r/r2ZnameIDrrrrr r rrs zParser.parse_nameid_csLdkrtjdj|}nfdd}tjd||}t|dd}t|dS)N utf_16_bez\\[0-9a-fA-F]{4}cs j|S)N)unescape_byte_)m)r r/r rsz)Parser.unescape_string_..z\\[0-9a-fA-F]{2} surrogatepass)rerunescape_unichr_rr )r/rr runescapeutf16r )r r/rrs  zParser.unescape_string_cCs |jddd}tt|dS)Nrr)groupchrint)matchrr r rr*szParser.unescape_unichr_cCs&|jddd}tt|dj|S)Nrrr-)r.rr0decode)r1r rr r rr%szParser.unescape_byte_cCs|j}x|jdks|jr|jdd|jtjkrL|j|jj |j |j dq|j dr`|j }q|j dr|jt|}|j|jj||d|j dq|j dr|j }q|j d r|jt|}|j|jj||d|j dq|j d krqqWdS) NrnT)r)r2zHorizAxis.BaseTagListzHorizAxis.BaseScriptListFzVertAxis.BaseTagListzVertAxis.BaseScriptListr>)r?r*r+r.r@rrArBr!rCrDrErFparse_base_tag_list_parse_base_script_list_rZBaseAxis)r/r<r?Z horiz_basesZ horiz_scriptsZ vert_basesZ vert_scriptsr r rrs8         zParser.parse_table_BASE_c Cs.|j}d}d}x|jdks$|jr(|jdd|jtjkrX|j|jj |j |j dq|jtj kr|j j }d}|j |kr|j}nv|jdrg}xftdD]}|j|jqWnF|j |krg}x4|jdkr|j|jqWn|jdr|j}|j|jj|||j dq|j dkrqqWdS)NFSType TypoAscender TypoDescender TypoLineGap winAscent winDescentXHeight CapHeight WeightClass WidthClass LowerOpSize UpperOpSize UnicodeRange CodePageRangernT)r)r2ZPanose r>ZVendor) r5r6r7r8r9r:r;r<r=r>r?r@)rArB)r?r*r+r.r@rrArBr!rCrDrErRrrerFrrZOS2Field)r/r<r?numbersrrrr r r rr sL         zParser.parse_table_OS_2_cCs|jdst|jdg}x||jdks.|jr|j|jdrv|j\}}}}|jjd|||||j d}|j |q|j dkrt d|j d |j qW|jd|st d |j |S) NElidedFallbackNamerrnr[stat)r2r>zUnexpected token z in ElidedFallbackNamezExpected "name") rFrlr_r*r+r.r"r!STATNameStatementrErBrDr)r/namesrrrrZ nameRecordr r rparse_STAT_ElidedFallbackNameFs.         z$Parser.parse_STAT_ElidedFallbackNamec Cs|jdstg}|j}|dkr>|j r>tjd|d|j}|jd x|jd ksb|j r|j |j t j krzqRqR|jd r|j}|j\}}}}|jjd |||||d } |j| qR|jdkrqRqRtd|j|jqRW|jd |jj||||jS)N DesignAxisitalopszslntwdthwghtzUnregistered axis tag z should be uppercase.rrnr[rF)r2r>zExpected "name", got )rKrLrMrNrO)rFrlroisupperrrrer_r*r+r.r@rrArEr"r!rGrBrDrZSTATDesignAxisStatement) r/rHZaxisTagZ axisOrderr2rrrrr[r r rparse_STAT_design_axisbs2       zParser.parse_STAT_design_axisc Cs|jdst|jdg}g}d}x|jdks6|jr|jdd|jtjkrRq&q&|jdr|j }|j \}}}}|j j d|||||d } |j | q&|jd r|j}|j |q&|jd r|j}q&|jd krq&q&td |jd|j q&W|jd|s td|j |std|j t|dkrx8|D]0}t|jdkr2tdt|jd|j q2Wg} x<|D]4}|j} | | krtd| d|j | j | qpW|j j||||j S)N AxisValuerrrnT)rr[rF)r2r2flagr>zUnexpected token z in AxisValuezExpected "Axis Name"zExpected "Axis location"rz?Only one value is allowed in a Format 4 Axis Value Record, but z were found.z Axis tag z already defined.)rFrlr_r*r+r.r@rrArEr"r!rGrBparse_STAT_locationexpect_stat_flagsrDrrrrpZSTATAxisValueStatement) r/ locationsrHrr2rrrrr[Z format4_tagsrpr r rparse_STAT_axis_value_sZ                  zParser.parse_STAT_axis_value_cCsg}|j}t|jdkr2td|jd|jxd|jdkr|jtj kr^|j }|j |q4|jtj kr~|j }|j |q4td|jd|jq4Wt|dkr|\}}}||ks||krtd|d |d |d |j|jj||S) Nrz Axis tag z must be 4 charactersr>zUnexpected value "z". Expected integer or float.rzDefault value z is outside of specified range r.)rorr rrDrEr*r)rr expect_float_rBrrer,r!ZAxisValueLocationStatement)r/rrprZnominalZmin_valZmax_valr r rrTs.          zParser.parse_STAT_locationc Cst|j}g}xb|jdks |jrn|jdd|jtjkrT|j|jj |j |j dq|jtj kr`|j dr|j}|j|jj|n|j dr|j}|j|jj||jdn|j dr|j}|j|j|j||jdnr|j d rJ|j}x2|jD](}|j|krtd |jd |j qW|j||jdntd |j |j q|j dkrqqWdS) NrnT)r)r2rEElidedFallbackNameIDr>rJrRzDesignAxis not defined for rXzUnexpected token )r?r*r+r.r@rrArBr!rCrDrErRrFrIrErerZr_rQrprWrVr) r/r<r?Z design_axesrHrZ designAxisZaxisValueRecordr2r r rr sB                zParser.parse_table_STAT_cCsD|jdkst|jg}x|jdkr4|j|jqW|jd|S)NHorizAxis.BaseTagListVertAxis.BaseTagListr>)r[r\)rDrlr*rBrr_)r/basesr r rr3s  zParser.parse_base_tag_list_cCsX|jdkst|j|j|g}x(|jdkrH|jd|j|j|q"W|jd|S)NHorizAxis.BaseScriptListVertAxis.BaseScriptListrr>)r^r_)rDrlparse_base_script_record_r*r_rB)r/countscriptsr r rr4s    zParser.parse_base_script_list_cs0j}j}fddt|D}|||fS)Ncsg|] }jqSr )re)r r )r/r rr!sz4Parser.parse_base_script_record_..)rr)r/raZ script_tagZbase_tagZcoordsr )r/rr`sz Parser.parse_base_script_record_cCsd}|jd|jd|jdkr.|jdnJ|j|jfg}x.|jdkrn|jd|j|j|jfqBWt|}|jd|S)NrWZdevicerYrrZ)r_r`r*rerBr)r/resultr r rrf$s       zParser.parse_device_cCs|jtjkp|jdkS)NrW)r)rrr*)r/r r rr3szParser.is_next_value_c Cs|jtjkrJ|j|j}}|r4|jj|||d}n|jj|||d}|S|jd|j}|jtjkr|j }|dkr|jd|jjS|j j |}|dkrt d||j|j }|j|j}} |j|j} } n$|j|j|j|jf\}} } } |jdkr|j|j|j|jf\} } }}tdd| r8| nf| rD| nf|rR|nf|r`|nfD}|d dks|dd krt d |jn d\} } }}|jd|jj|| | | | | ||||d S)N)yAdvancer9r2)xAdvancer9r2rWrYrZzUnknown valueRecordDef "%s"cSsg|] \}}|qSr r )r rdeltar r rrbsz-Parser.parse_valuerecord_..rrz+Device value out of valid range (-128..127))r9r2ir)NNNN)r)rrrerEr!Z ValueRecordr_rRrar'rbrr xPlacement yPlacementrerdr*rfr)r/r9numberr2valr[vrdrrirjrerdZ xPlaDeviceZ yPlaDeviceZ xAdvDeviceZ yAdvDeviceZ allDeltasr r rr6sf        >   zParser.parse_valuerecord_cCsT|jdst|j}|j|}|j}|jd|jj|||d}|jj |||S)Nr=r>)r2) rFrlrErrar_r!ZValueRecordDefinitionr'rm)r/r9r2rr[rmr r rrQs  z$Parser.parse_valuerecord_definition_cCs@|jdkst|j}|j}|j}|jd|jj|||dS)Nr7r>)r2)rDrlrErrr_r!ZLanguageSystemStatement)r/r2rrr r rrLs  zParser.parse_languagesystem_c Cs|jdkst|j}|j}|d k}d}d}d}||jkr@|}n||jkrP|}n |dkr\d}d}|jd krx|jd d}|jj |||d }|j ||||||S) Nr;vkrnvpalvhalvaltFrTr)rr2>rnrprqro) rDrlrEroSS_FEATURE_TAGSCV_FEATURE_TAGSr*r`r!Z FeatureBlockr) r/r2rpr9 stylisticset cv_feature size_featurerrr r rrOs*     zParser.parse_feature_block_cCs<|jdkst|j|j}|j}|jd|jj||dS)Nr;r>)r2)rDrlrEror_r!ZFeatureReferenceStatement)r/r2Z featureNamer r rparse_feature_reference_s  zParser.parse_feature_reference_c Cs&|jdkst|j|jj||j|jd}|jdx|jD] }|jq`_. featureNames)r2rrnT)rr[r>zExpected "name")rDrlr! NestedBlockrEr_r( enter_scoper*r+r.r@rrAr?rBrCrFrrr exit_scope) r/rprsymtabr2rrrrr r rparse_featureNames_s2          zParser.parse_featureNames_cCs:|jdkst|j|jj||j|jd}|jdx|jD] }|jqzExpected statement: got {} {})rDrlr!ryrEr_r(rzr?r*r+r.r@rrArBrCrFparse_cvNameIDs_parse_cvCharacter_rrUr{)r/rprr|r?r r rparse_cvParameters_s>            zParser.parse_cvParameters_c Cs&|j|kst|j|jj|||jd}|jdx|jD] }|jq:Wx|jdks\|j r|j dd|j t j kr|jj|jj|j|jdqL|jdr|j}|j\}}}} |jj|jj||||| ||dqL|jdkrqLqLtd|jqLW|jdx|jD]}|jqW|jd|S) N)r2rrnT)rr[r>zExpected "name")rDrlr!ryrEr_r(rzr*r+r.r@rrAr?rBrCrFrZCVParametersNameStatementrr{) r/rpZ block_namerr|r2rrrrr r rrs<           zParser.parse_cvNameIDs_cCsj|jdkst|j|j|j}}|jdd|ko@dknsXtdjdd||jj|||dS)Nrr>irz/Character value must be between {:#x} and {:#x})r2) rDrlrErr_rrUr!ZCharacterStatement)r/rpr2 characterr r rr's zParser.parse_cvCharacter_cCsP|jdkst|j|j|j}}|jd|dkr@td||jj||dS)Nr r>rz&Font revision numbers must be positive)r2)rDrlrErYr_rr!ZFontRevisionStatement)r/r2versionr r rr3s   zParser.parse_FontRevision_c Cs|jdx|jD] }|jqW|j}x|jdks>|jr|jdd|jtj krr|j |j j |j |jdq,|jtjkr|j |jq,|jdr|j |jq,|jddhr|j |j|d q,|jd r|j |jq,|jd r|j |jq,|jd r|j |jq,|jd r:|j |j|q,|jdrV|j |jq,|jdrr|j |jq,|jddhr|j |jd|dq,|jdr|j |jq,|jddddhr|j |jq,|jdr|j |jq,|jdr|j |j|q,|r6|jdr6|j |j|q,|rZ|jdrZ|j |j |q,|r||jdr||j |j!q,|r|jdr|j |j"q,|jtj#kr|j |j$kr|j |j$|j |q,|j dkrq,q,t%d j&|j|j |jq,W|jdx|jD]}|j'qW|j(}||j)j*krPt%d!|j)j*|j|jdd} d} x\|D]T} t+| |j j,rt-| j.| j/| j0g } n&t+| |j j1rht-| j.| j/| j0g } qhW| r~| r~g}x|jD]} t+| |j j,rh| j2d"j3} | j4d"j3} t5| d#kr"| t5| 9} xNt6| D]6\}}|j |j j1| j.|| j/| |g| j0| j7dq,Wn |j | qW||_dS)$NrrnT)r)r2r6r{rz)r9r;rrr8rr:rrF)r|r9rrrrrrr=rxr~rrr>z7Expected glyph class definition or statement: got {} {}z Expected "%s"rr)8r_r(rzr?r*r+r.r@rrArBr!rCrDrErHrIrFrKr~rwrrrMrrNr}rrrrQr}rrrrRrSrrUr{rar[r rrrrrrrrxrrrrzr2)r/rr9rtrvrur|r?r[Z has_singleZ has_multiplerrxrr rr r rr=s                          zParser.parse_block_cCs2|jtjkr.t|tdr$|j|kS|j|kSdS)NrF)r@rrRrtyperD)r/rr r rrFs    zParser.is_cur_keyword_cCs&|j|jtjk r td|j|jS)NzExpected @NAME)r.r@rrHrrErD)r/r r rrs  zParser.expect_class_name_cCs*|j|jtjkr|jStd|jdS)NzExpected a CID)r.r@rrrDrrE)r/r r rrs zParser.expect_cid_cCs&|j|jtjk r td|j|jS)NzExpected file name)r.r@rZFILENAMErrErD)r/r r rrs  zParser.expect_filename_cCsh|j|jtjkrB|jjd|_t|jdkr.zMThe following glyph names are referenced but are missing from the glyph set: z, N)r rrrE)r/rHmissingr )r/rrs z$Parser.check_glyph_name_in_glyph_setcCsN|j}|jj|}|dkr,td||jt||jjsJtd||j|S)NzUnknown markClass @%sz@%s is not a markClass)rr%rbrrErr!r)r/r[Zmcr r rrjs z"Parser.expect_markClass_reference_cCsL|j|jtjk r td|jt|jdkr:td|j|jdddS)NzExpected a tagrz'Tags cannot be longer than 4 charactersz )r.r@rrRrrErrD)r/r r rros   zParser.expect_tag_cCs |j}|dkrtd|j|S)NZdfltz4"dflt" is not a valid script tag; use "DFLT" instead)rorrE)r/rpr r rrs zParser.expect_script_tag_cCs |j}|dkrtd|j|S)NZDFLTz6"DFLT" is not a valid language tag; use "dflt" instead)rorrE)r/rpr r rrs zParser.expect_language_tag_cCs6|j|jtjkr"|j|kr"|Std||jdS)Nz Expected '%s')r.r@rrTrDrrE)r/symbolr r rr_szParser.expect_symbol_cCs8|j|jtjkr$|j|kr$|jStd||jdS)Nz Expected "%s")r.r@rrRrDrrE)r/rr r rr`szParser.expect_keyword_cCs*|j|jtjkr|jStd|jdS)NzExpected a name)r.r@rrRrDrrE)r/r r rras zParser.expect_name_cCs*|j|jtjkr|jStd|jdS)NzExpected a number)r.r@rrrDrrE)r/r r rre#s zParser.expect_number_cCs*|j|jtjkr|jStd|jdS)Nz/Expected a decimal, hexadecimal or octal number)r.r@rrrDrrE)r/r r rr)s  zParser.expect_any_number_cCs*|j|jtjkr|jStd|jdS)Nz Expected a floating-point number)r.r@rrrDrrE)r/r r rrY1s  zParser.expect_float_cCs<|jtjkr|jS|jtjkr,|jdStd|jdS)NrCz,Expected an integer or floating-point number)r)rrrYrrerrE)r/r r rr9s    zParser.expect_decipoint_cCsVd}ddd}xB|jdkrP|j|kr:|j}|||B}qtd|j|jqW|S)Nrrr)ZOlderSiblingFontAttributeZElidableAxisValueNamer>zUnexpected STAT flag )r*rarrDrE)r/rrr[r r rrUCs  zParser.expect_stat_flagscCs8|jtjkr|jS|jtjkr(|jStd|jdS)Nz,Expected an integer or floating-point number)r)rrrYrrerrE)r/r r rexpect_stat_values_Ss   zParser.expect_stat_values_cCs*|j|jtjkr|jStd|jdS)NzExpected a string)r.r@rSTRINGrDrrE)r/r r rr]s zParser.expect_string_c Cs|r*|jr*tj|_|jjd\|_|_dS|j|j|j |_|_|_xbyt |j \|_|_|_ Wn t k rd\|_|_YnX|jtjkrP|jj |j|j fqHWdS)Nr)NN)r+rrAr@rrDrEr)r*r,nextr- StopIterationrB)r/rr r rr.cs  zParser.advance_lexer_cCsdjtt|S)z'abc' --> 'cba'r)rreversedr)rr r rreverse_string_{szParser.reverse_string_cCsBt}||krtd|x$t||dD]}|jd|q(W|S)z>(location, 999, 1001) --> ["cid00999", "cid01000", "cid01001"]z*Bad range: start should be less than limitrzcid%05d)rrrrB)r/r2rrrcrr r rrszParser.make_cid_range_cCs t}t|t|kr(td||f||j}tjj||g}|tjj||||g}t|dkr|t|t| }|t|t| } n |t|d}|t|d} || krtd|tjd} | j |o| j | rx2t t |t | dD]} |j d|| |fqW|Stjd} | j |rz| j | rzx4t t |t | dD]} |j d|| |fqXW|Stjd } | j |r| j | rxRt t |d t | d dD]4}d t|t| d}|j d |||fqW|Std ||f|dS)z?(location, "a.sc", "d.sc") --> ["a.sc", "b.sc", "c.sc", "d.sc"]z4Bad range: "%s" and "%s" 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}$rCZ000z%s%s%szBad range: "%s-%s")rrrrospath commonprefixr)compiler1rordrBr0r)r/r2rrrcrevrrZ start_rangeZ limit_rangeZ uppercasecZ lowercasedigitsr rkr r rrsB      zParser.make_glyph_range_d)F)NFN)F)e__name__ __module__ __qualname____doc__rSr!rrrrsr1rVrhrkrKrJryr~rrIrrvrrrrGrrrrMrrNr}rrrrrrrrrrPrrrrrrr"rr staticmethodr*r%rr rIrQrWrTr r3r4r`rfrrrQrLrOrwr}rrrrrrFrrrrrrjrorrr_r`rarerrYrrUrrr.rrrr r r rr s 06    * d]  953   #,"8!)  I "-$  s         r c@s4eZdZddZddZddZddZd d Zd S) r#cCs ig|_dS)N)scopes_)r/r r rr1szSymbolTable.__init__cCs|jjidS)N)rrB)r/r r rrzszSymbolTable.enter_scopecCs|jjdS)N)rr)r/r r rr{szSymbolTable.exit_scopecCs||jd|<dS)Nrr)r)r/r[itemr r rrmszSymbolTable.definecCs*x$t|jD]}|j|}|r |Sq WdS)N)rrr)r/r[Zscoperr r rrbs  zSymbolTable.resolveN)rrrr1rzr{rmrbr r r rr#s r#)ZfontTools.feaLib.errorrZfontTools.feaLib.lexerrrrZfontTools.misc.encodingToolsrZfontTools.misc.textToolsrrr ZfontTools.feaLib.astZfeaLibr!loggingrr) getLoggerrrobjectr r#r r r rs6    <