L iq+ddlmZmZddlmZddlZddlZ ddlZGdde Z Gdde Z Gd d e Z y#e$r ddl mZY/wxYw) )FeatureLibErrorIncludedFeaNotFound)FeatureLibLocationN)cythonceZdZdZdZdZeeefZdZdZdZ dZ dZ d Z d Z d Zd Zd ZdZdZdZdZdZdZedzZeezdzZej4dZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%d Z&y!)"LexerNUMBER HEXADECIMALOCTALFLOATSTRINGNAMEFILENAME GLYPHCLASSCIDSYMBOLCOMMENTNEWLINEANONYMOUS_BLOCKz z z,;:-+'{}[]<>()= 01234567890123456789ABCDEFabcdef4ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzz _+*:.^~!\z _.+*:^~!/-z^[A-Za-z_0-9.\-]+$NORMALc||_d|_d|_d|_||_t ||_tj|_ y)Nr) filename_line_pos_ line_start_text_len text_length_r MODE_NORMAL_mode_)selftextfilenames \/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/fontTools/feaLib/lexer.py__init__zLexer.__init__+s?!   I'' c|SNr%s r(__iter__zLexer.__iter__4 r*c"|jSr,__next__r.s r(nextz Lexer.next7}}r*c^ |j\}}}|tjk7r|||fS-r,)next_rr)r% token_typetokenlocations r(r3zLexer.__next__:s5*.**, 'JxU]]*"E844r*c|j|jz dz}t|jxsd|j|S)Nrz )rrrrr)r%columns r( location_zLexer.location_@s7T---1!$.."@L$**fUUr*c|jtj|j}|j}|j }t |}||k\r t||}|dz|kr||dznd}|dk(rN|xjdz c_|xjdz c_|j|_ tjd|fS|dk(rU|xj|dk(rdndz c_|xjdz c_|j|_ tjd|fS|dk(r?|jtjtj|||j|fS|jtjur|dk7r t!d||jd|j|kr||jnd}|dk7r t!d ||xjdz c_tj"|_tj$||dz|jdz |fS|d k(rs|tj&vra|xjdz c_|jtj&tj(t+||dz|jd |fS|d k(r|xjdz c_|jtj,||dz|j}t |dkr t!d |tj.j1|s t!d|tj2||fS|tj4vrp|xjdz c_|jtj,|||j}|dk(rtj|_tj6||fS|dk(rb|dvr^|xjdz c_|jtj8tj:t+|||jd|fS|dk(r[|tj&vrI|jtj&tj<t+|||jd|fS|tj&vr|jtj&|j|k\s||jdk7r*tj>t+|||jd |fS|jd|jtj&tj@tC|||j|fS|dk(r|tj&vr|xjdz c_|jtj&|j|k\s||jdk7r*tj>t+|||jd |fS|jd|jtj&tj@tC|||j|fS|tjDvr(|xjdz c_tjF||fS|dk(r|xjdz c_|jd|j|jHkrn|j |jdk(rR|xjdz c_tKjLdd||dz|jdz } tjN| |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_Ds ../>># zzD  E>/ !;',qy5'8DOd t  IINI JJ!OJ#yyD MM42 2 t  IIi4/Q 6I JJ!OJ#yyD MM42 2 s?   U00 1MM4 #:HE E ::-- -3%&ExPP   S !*.))e*;tDIIH3%&DhOO IINI++DJNNDTYY]$CXN N t  U->-> > IINI OOE-- .IIs4 DII#>CXN N s? IINI OOE99 :eai$))4J:"%&A8LL&&,,Z8%3 $$j(; ; u-- - IINI OOE99 :+E !"11 JJx0 0 s?yD0 IINI OOE00 1%%s4 +BB'GR R s?yE,=,== OOE-- .KKT%$))%!?J J s?yE,=,== IINI OOE-- .yyE!T$))_%; c$utyy*A2&FQQ OOC OOE-- .KKtEDII'>!?J J u)) ) IINILL(H5 5 s? IINI   S !yy4,,,DII1F#1M Q "d519tyy1}.MN fh77%&I8TT88CXNNr*c|j}||jkr7|j||vr&|dz }||jkr|j||vr&||_yNrrr"r )r%validps r(rQzLexer.scan_over_sW II$### 1 (> FA$### 1 (> r*c|j}||jkr7|j||vr&|dz }||jkr|j||vr&||_yrirj)r%stop_atrls r(rTzLexer.scan_until_sW II$### 1 W(D FA$### 1 W(D r*c|j}|j}|jtj|j tjd|zdz}t j||j|jdd}t|dk7rtd|z||xjt|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>>#iik ,,- ++,3(DIIK!81E 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 s FK E{E*G E F DHJ C FGG'OM$LK-NIL#l2*[8<GBJJ45MLN(5 V_OB  ;r*rcDeZdZdZdddZdZdZdZedZ d Z y) 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) includeDirc||j|g|_|jdj|_||_y)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__s6((56 #||A88$r*c|Sr,r-r.s r(r/zIncludingLexer.__iter__r0r*c"|jSr,r2r.s r(r4zIncludingLexer.nextr5r*c|jrr|jd} t|\}}}|tj ur-|dk(r'|j\}}}|tj ur td|tjj|r|}n|j |j} nJ|j*tjj|j} ntj} tjj| |}t!|jdk\r td| |jj#|j%|n|||fS|jrrt#t$r|jjYwxYw#t&$r} t)||| d} ~ wwxYw)NrHzExpected file namezToo many recursive includes)rr4rSpoprrrrospathisabsr~rdirnamegetcwdjoinr!appendrFileNotFoundErrorr) r%lexerr8r9r: fname_type fname_tokenfname_locationrcurpatherrs r(r3zIncludingLexer.__next__sllLL$E .25k+ E8UZZ'EY,>:?**,7 KU^^3)*>OO77==-&D2"&//--9"$''//$2F2F"G #%))+77<<=Dt||$))*GXXTLL''(8(8(>?#E844GllHoA!    " 8)T-k>JPSSTs)F *F4 #F10F14 G= G  Gct|dr|d}}n|d}}t|dd}|j}t|dd}|r|j t ||S)NreadFTrz utf-8-sig)encodingname)hasattropenrgetattrcloser) file_or_pathfileobjclosingr'datas r(rzIncludingLexer.make_lexer_ s^ < (+UWG ,dgH8S;?G||~7FD1  MMOT8$$r*c>|jdj|S)Nr)rru)r%rss r(ruz#IncludingLexer.scan_anonymous_blocks||B44S99r*) rvrwrx__doc__r)r/r4r3 staticmethodrrur-r*r(r}r}s: 37 %%N % %:r*r}ceZdZdZdZy)NonIncludingLexerzBLexer that does not follow `include` statements, emits them as-is.c2t|jdS)Nr)r4rr.s r(r3zNonIncludingLexer.__next__sDLLO$$r*N)rvrwrxrr3r-r*r(rrs L%r*r)fontTools.feaLib.errorrrfontTools.feaLib.locationrr`rr ImportErrorfontTools.miscobjectrr}rr-r*r(rsXG8 & p;Fp;fX:VX:v%%g&%&s> A  A