)Ej,ddlmZmZddlmZddlZddlZ ddlZn#e$r ddl mZYnwxYwGdde Z Gdde Z Gd d e Z dS) )FeatureLibErrorIncludedFeaNotFound)FeatureLibLocationN)cythonceZdZdZdZdZeeefZdZdZdZ dZ dZ d Z d Z d Zd Zd ZdZdZdZdZdZdZedzZeezdzZejdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%d Z&d!S)"LexerNUMBER HEXADECIMALOCTALFLOATSTRINGNAMEFILENAME GLYPHCLASSCIDSYMBOLCOMMENTNEWLINEANONYMOUS_BLOCKz z z,;:-+'{}[]<>()= 01234567890123456789ABCDEFabcdef4ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzz _+*:.^~!\z _.+*:^~!/-z^[A-Za-z_0-9.\-]+$NORMALc||_d|_d|_d|_||_t ||_tj|_ dS)Nr) filename_line_pos_ line_start_text_len text_length_r MODE_NORMAL_mode_)selftextfilenames HC:\PYTHON\MyICR_Suite\python\Lib\site-packages\fontTools/feaLib/lexer.py__init__zLexer.__init__+sB!   II' c|SNr%s r(__iter__zLexer.__iter__4 r*c*|Sr,__next__r.s r(nextz Lexer.next7}}r*c` |\}}}|tjkr|||fS.r,)next_rr)r% token_typetokenlocations r(r3zLexer.__next__:s: 5*.**,, 'JxU]**"E844 5r*c`|j|jz dz}t|jpd|j|S)Nrz )rrrrr)r%columns r( location_zLexer.location_@s1T--1!$."@L$*fUUUr*c |tj|}|j}|j}t |}||krt||}|dz|kr ||dznd}|dkr;|xjdz c_|xjdz c_|j|_ tj d|fS|dkrC|xj|dkrdndz c_|xjdz c_|j|_ tj d|fS|dkr;| tj tj |||j|fS|jtjur|dkrt!d|| d|j|kr ||jnd}|dkrt!d ||xjdz c_tj|_tj||dz|jdz |fS|d krj|tjvr\|xjdz c_|tjtjt+||dz|jd |fS|d kr|xjdz c_|tj||dz|j}t |dkrt!d |tj|st!d|tj||fS|tjvrd|xjdz c_|tj|||j}|dkrtj|_tj||fS|dkr]|dvrY|xjdz c_|tjtjt+|||jd|fS|dkrW|tjvrI|tjtjt+|||jd|fS|tjvr|tj|j|ks||jdkr*tjt+|||jd |fS|d|tjtj tC|||j|fS|dkr|tjvr|xjdz c_|tj|j|ks||jdkr*tjt+|||jd |fS|d|tjtj tC|||j|fS|tj"vr|xjdz c_tj#||fS|dkr|xjdz c_| d|j|j$kr^|j|jdkrH|xjdz c_tKj&dd||dz|jdz } tj'| |fSt!d|t!d|z|)Nr  #(zExpected '(' before file name)zExpected ')' after file name\ @zExpected glyph class namezOGlyph class names must consist of letters, digits, underscore, period or hypheninclude0xX.-"z[ ]z Expected '"' to terminate stringzUnexpected character: %r)( scan_over_rCHAR_WHITESPACE_r=rr r! StopIterationrrr scan_until_ CHAR_NEWLINE_rr$MODE_FILENAME_rr#r CHAR_DIGIT_rintCHAR_NAME_CONTINUATION_ RE_GLYPHCLASSmatchrCHAR_NAME_START_rCHAR_HEXDIGIT_r r r r float CHAR_SYMBOL_rr"resubr ) r%r:startr&limitcur_char next_char glyphclassr9strings r(r7z Lexer.next_Dsu .///>>## zD  E>>// !;',qy5'8'8DOOd t   IINII JJ!OJJ#yD M42 2 t   IIi4//Q 6II JJ!OJJ#yD M42 2 s??   U0 1 1 1M4 (9#:HE E :- - -3%&ExPPP   S ! ! !*.)e*;*;tDIH3%&DhOOO IINII+DJNDTY])B$CXN N t   U-> > > IINII OOE- . . .Is4 DI(=#>CCXN N s?? IINII OOE9 : : :eai$)34J:""%&A8LLL&,,Z88 %3 $j(; ; u- - - IINII OOE9 : : :*+E !!"1 Jx0 0 s??yD00 IINII OOE0 1 1 1%s4 0A+BB'G'GR R s??yE,=== OOE- . . .KT%$)*;%!?!?J J u) ) ) IINIIL(H5 5 s?? IINII   S ! ! !y4,,,DI1F#1M1M Q "d519ty1}3L.MNN fh77%&I8TTT88CXNNNr*c|j}||jkr.|j||vr|dz }||jkr|j||v||_dSNrrr"r )r%validps r(rQzLexer.scan_over_s[ I$### 1 (>(> FA$### 1 (>(> r*c|j}||jkr.|j||vr|dz }||jkr|j||v||_dSrirj)r%stop_atrls r(rTzLexer.scan_until_s[ I$### 1 W(D(D FA$### 1 W(D(D r*c|}|}|tj|tjd|zdz}t j||j|j dd}t|dkrtd|z||xj t|dz c_ tj |d|fS)Nz}\s*z\s*;r)maxsplitrAz-Expected '} %s;' to terminate anonymous blockr) r=striprTrrUrQr`splitr rr!rr)r%tagr:regexprrs r(scan_anonymous_blockzLexer.scan_anonymous_blocks>>##iikk ,--- +,,,3(DIKK!81EEE u::??!?#Ex  Sq]]" %uQx::r*N)'__name__ __module__ __qualname__r r r NUMBERSr r rrrrrrrrrRrUr_rWr] CHAR_LETTER_r\rYr`compilerZr#rVr)r/r4r3r=r7rQrTrur-r*r(rr sH FK E{E*G E F DHJ C FGG'OM$LK-NIL#l2*[8<GBJ455MLN(((555 VVV_O_O_OB  ; ; ; ; ;r*rcLeZdZdZdddZdZdZdZedZ d Z dS) IncludingLexeraA Lexer that follows include statements. The OpenType feature file specification states that due to historical reasons, relative imports should be resolved in this order: 1. If the source font is UFO format, then relative to the UFO's font directory 2. relative to the top-level include file 3. relative to the parent include file We only support 1 (via includeDir) and 2. N) includeDircx||g|_|jdj|_||_dS)aOInitializes an IncludingLexer. Behavior: If includeDir is passed, it will be used to determine the top-level include directory to use for all encountered include statements. If it is not passed, ``os.path.dirname(featurefile)`` will be considered the include directory. rN) make_lexer_lexers_rfeaturefilepathr~)r% featurefiler~s r(r)zIncludingLexer.__init__s8((556 #|A8$r*c|Sr,r-r.s r(r/zIncludingLexer.__iter__r0r*c*|Sr,r2r.s r(r4zIncludingLexer.nextr5r*c|jr|jd} t|\}}}n)#t$r|jYOwxYw|tjurG|dkr@|\}}}|tjurtd|tj |r|}nn|j |j } n?|j %tj |j } ntj} tj | |}t!|jdkrtd| |j||n(#t&$r} t)||| d} ~ wwxYw|||fS|jt)NrHzExpected file namezToo many recursive includes)rr4rSpoprrrrospathisabsr~rdirnamegetcwdjoinr!appendrFileNotFoundErrorr) r%lexerr8r9r: fname_type fname_tokenfname_locationrcurpatherrs r(r3zIncludingLexer.__next__sl# 5L$E .25kk+ E88       """ UZ''EY,>,>:?**,,7 KU^33)*>OOO7==-- >&DD2"&/-9"$'//$2F"G"G #%)++7<<==Dt|$$)))*GXXXTL''(8(8(>(>????(TTT-k>JJPSST#E844Gl# 5Hoos'+#AA-F F'F""F'ct|dr|d}}n|d}}t|dd}|}t|dd}|r|t ||S)NreadFTrz utf-8-sig)encodingname)hasattropenrgetattrcloser) file_or_pathfileobjclosingr'datas r(rzIncludingLexer.make_lexer_ s < ( ( @+UWGG ,dgH8S;???G||~~7FD11   MMOOOT8$$$r*cB|jd|S)Nr)rru)r%rss r(ruz#IncludingLexer.scan_anonymous_blocks|B44S999r*) rvrwrx__doc__r)r/r4r3 staticmethodrrur-r*r(r}r}s  37 % % % % %%%%N % %\ %:::::r*r}ceZdZdZdZdS)NonIncludingLexerzBLexer that does not follow `include` statements, emits them as-is.c6t|jdS)Nr)r4rr.s r(r3zNonIncludingLexer.__next__sDLO$$$r*N)rvrwrxrr3r-r*r(rrs)LL%%%%%r*r)fontTools.feaLib.errorrrfontTools.feaLib.locationrr`rr ImportErrorfontTools.miscobjectrr}rr-r*r(rsGGGGGGGG888888 &MMMM&&&%%%%%%%%& p;p;p;p;p;Fp;p;p;fX:X:X:X:X:VX:X:X:v%%%%%%%%%%s  ++