
    jke#,                         d dl mZmZ d dlmZ d dlZd dlZ	 d dlZ G d de
      Z G d de
      Z G d	 d
e      Zy# e$ r	 d dl	mZ Y /w xY w)    )FeatureLibErrorIncludedFeaNotFound)FeatureLibLocationN)cythonc                       e Zd ZdZdZdZeeef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ZdZedz   Zeez   dz   Z ej4                  d      ZdZdZd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d  Z&y!)"LexerNUMBERHEXADECIMALOCTALFLOATSTRINGNAMEFILENAME
GLYPHCLASSCIDSYMBOLCOMMENTNEWLINEANONYMOUS_BLOCKz 	z
z,;:-+'{}[]<>()=
01234567890123456789ABCDEFabcdef4ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzz	_+*:.^~!\z
_.+*:^~!/-z^[A-Za-z_0-9.\-]+$NORMALc                     || _         d| _        d| _        d| _        || _        t        |      | _        t        j                  | _	        y )N   r   )
	filename_line_pos_line_start_text_lentext_length_r   MODE_NORMAL_mode_)selftextfilenames      8/usr/lib/python3/dist-packages/fontTools/feaLib/lexer.py__init__zLexer.__init__+   s?    !
	
I''
    c                     | S N r%   s    r(   __iter__zLexer.__iter__4       r*   c                 "    | j                         S r,   __next__r.   s    r(   nextz
Lexer.next7       }}r*   c                 ^    	 | j                         \  }}}|t        j                  k7  r|||fS -r,   )next_r   r   )r%   
token_typetokenlocations       r(   r3   zLexer.__next__:   s5    *.**,'JxU]]*"E844 r*   c                     | j                   | j                  z
  dz   }t        | j                  xs d| j                  |      S )Nr   z
<features>)r   r   r   r   r   )r%   columns     r(   	location_zLexer.location_@   s7    T---1!$.."@L$**fUUr*   c                    | j                  t        j                         | j                         }| j                  }| j
                  }t        |      }||k\  r
t               ||   }|dz   |k  r||dz      nd }|dk(  rN| xj                  dz  c_        | xj                  dz  c_        | j                  | _	        t        j                  d |fS |dk(  rU| xj                  |dk(  rdndz  c_        | xj                  dz  c_        | j                  | _	        t        j                  d |fS |dk(  r?| j                  t        j                         t        j                  ||| j                   |fS | j                  t        j                  u r|dk7  rt!        d|      | j                  d       | j                  |k  r|| j                     nd }|dk7  rt!        d	|      | xj                  dz  c_        t        j"                  | _        t        j$                  ||dz   | j                  dz
   |fS |d
k(  rs|t        j&                  v ra| xj                  dz  c_        | j                  t        j&                         t        j(                  t+        ||dz   | j                   d      |fS |dk(  r| xj                  dz  c_        | j                  t        j,                         ||dz   | j                   }t        |      dk  rt!        d|      t        |      dkD  rt!        d|      t        j.                  j1                  |      st!        d|      t        j2                  ||fS |t        j4                  v rp| xj                  dz  c_        | j                  t        j,                         ||| j                   }|dk(  rt        j                  | _        t        j6                  ||fS |dk(  rb|dv r^| xj                  dz  c_        | j                  t        j8                         t        j:                  t+        ||| j                   d      |fS |dk(  r[|t        j&                  v rI| j                  t        j&                         t        j<                  t+        ||| j                   d      |fS |t        j&                  v r| j                  t        j&                         | j                  |k\  s|| j                     dk7  r*t        j>                  t+        ||| j                   d      |fS | j                  d       | j                  t        j&                         t        j@                  tC        ||| j                         |fS |dk(  r|t        j&                  v r| xj                  dz  c_        | j                  t        j&                         | j                  |k\  s|| j                     dk7  r*t        j>                  t+        ||| j                   d      |fS | j                  d       | j                  t        j&                         t        j@                  tC        ||| j                         |fS |t        jD                  v r(| xj                  dz  c_        t        jF                  ||fS |dk(  r| xj                  dz  c_        | j                  d       | j                  | jH                  k  rn| j
                  | j                     dk(  rR| xj                  dz  c_        tK        jL                  dd||dz   | j                  dz
         }	t        jN                  |	|fS t!        d|      t!        d|z  |      )Nr   
   #(zExpected '(' before file name)zExpected ')' after file name\
   @zExpected glyph class name?   z7Glyph class names must not be longer than 63 characterszOGlyph class names must consist of letters, digits, underscore, period or hypheninclude0xX      .-"z[
] z Expected '"' to terminate stringzUnexpected character: %r)(
scan_over_r   CHAR_WHITESPACE_r=   r   r    r!   StopIterationr   r   r   scan_until_CHAR_NEWLINE_r   r$   MODE_FILENAME_r   r#   r   CHAR_DIGIT_r   intCHAR_NAME_CONTINUATION_RE_GLYPHCLASSmatchr   CHAR_NAME_START_r   CHAR_HEXDIGIT_r
   r   r	   r   floatCHAR_SYMBOL_r   r"   resubr   )
r%   r:   startr&   limitcur_char	next_char
glyphclassr9   strings
             r(   r7   zLexer.next_D   s   ../>>#		zzD	E>/!;',qy5'8DOd	tIINIJJ!OJ#yyDMM422tIIi4/Q6IJJ!OJ#yyDMM422s?U001MM4		#:HEE::---3%&ExPPS!*.))e*;tDIIH3%&DhOOIINI++DJNNDTYY]$CXNNt	U->-> >IINIOOE--.IIs4	DII#>CXNNs?IINIOOE99:eai$))4J:"%&A8LL:#%Mx  &&,,Z8%3 
 $$j(;;u---IINIOOE99:+E	!"11
JJx00s?yD0IINIOOE001%%s4		+BB'GRRs?yE,=,==OOE--.KKT%$))%<a!@(KKu(((OOE--.yyE!T$))_%;c$utyy*A2&FQQOOC OOE--.KKtEDII'>!?JJs?yE,=,==IINIOOE--.yyE!T$))_%;c$utyy*A2&FQQOOC OOE--.KKtEDII'>!?JJu)))IINILL(H55s?IINIS!yy4,,,DII1F#1M		Q	"d519tyy1}.MNfh77%&I8TT88CXNNr*   c                     | j                   }|| j                  k  r7| j                  |   |v r&|dz  }|| j                  k  r| j                  |   |v r&|| _         y Nr   r   r"   r    )r%   validps      r(   rR   zLexer.scan_over_   sW    II$###

1(>FA $###

1(>	r*   c                     | j                   }|| j                  k  r7| j                  |   |vr&|dz  }|| j                  k  r| j                  |   |vr&|| _         y rj   rk   )r%   stop_atrm   s      r(   rU   zLexer.scan_until_   sW    II$###

1W(DFA $###

1W(D	r*   c                    | j                         }|j                         }| j                  t        j                         | j                  t        j                         d|z   dz   }t        j                  || j                  | j                  d  d      }t        |      dk7  rt        d|z  |      | xj                  t        |d         z  c_	        t        j                  |d   |fS )Nz}\s*z\s*;r   )maxsplitrA   z-Expected '} %s;' to terminate anonymous blockr   )r=   striprU   r   rV   rR   ra   splitr    r   r!   r   r   )r%   tagr:   regexprs   s        r(   scan_anonymous_blockzLexer.scan_anonymous_block   s    >>#iik,,-++,3(DIIK!81Eu:?!?#Ex  			Sq]"	%%uQx::r*   N)'__name__
__module____qualname__r	   r
   r   NUMBERSr   r   r   r   r   r   r   r   r   r   rS   rV   r`   rX   r^   CHAR_LETTER_r]   rZ   ra   compiler[   r#   rW   r)   r/   r4   r3   r=   r7   rR   rU   rv   r-   r*   r(   r   r      s    FKE{E*GEFDHJ
CFGG'OM$LK-NIL#l2*[8<GBJJ45MLN(5VcOJ;r*   r   c                   D    e Zd ZdZdddZd Zd Zd Zed        Z	d	 Z
y)
IncludingLexera  A 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| _        | j                  d   j                  | _        || _        y)aO  Initializes 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.
        r   N)make_lexer_lexers_r   featurefilepathr   )r%   featurefiler   s      r(   r)   zIncludingLexer.__init__   s6     ((56#||A88$r*   c                     | S r,   r-   r.   s    r(   r/   zIncludingLexer.__iter__   r0   r*   c                 "    | j                         S r,   r2   r.   s    r(   r4   zIncludingLexer.next   r5   r*   c                    | j                   rr| j                   d   }	 t        |      \  }}}|t        j
                  u r-|dk(  r'|j                         \  }}}|t        j                  urt        d|      t        j                  j                  |      r|}n| j                  | j                  }	nJ| j                  *t        j                  j                  | j                        }	nt        j                         }	t        j                  j                  |	|      }t!        | j                         dk\  rt        d|      	 | j                   j#                  | j%                  |             n|||fS | j                   rrt               # t        $ r | j                   j                          Y w xY w# t&        $ r}
t)        ||      |
d }
~
ww xY w)NrI   zExpected file name   zToo many recursive includes)r   r4   rT   popr   r   r   r   ospathisabsr   r   dirnamegetcwdjoinr!   appendr   FileNotFoundErrorr   )r%   lexerr8   r9   r:   
fname_typefname_tokenfname_locationr   curpatherrs              r(   r3   zIncludingLexer.__next__   s   llLL$E.25k+
E8 UZZ'EY,>:?**,7
KU^^3)*>OO 77==-&D2"&//--9"$''//$2F2F"G #%))+77<<=Dt||$))*GXXTLL''(8(8(>? #E844G llH oA !   "8 ) T-k>JPSSTs)   F
 *F4 
#F10F14	G=G

Gc                     t        | d      r| d}}n| d}}t        |dd      }|j                         }t        |dd       }|r|j	                          t        ||      S )NreadFTrzutf-8)encodingname)hasattropenr   getattrcloser   )file_or_pathfileobjclosingr'   datas        r(   r   zIncludingLexer.make_lexer_  s^    <(+UWG ,dgH8S7;G||~7FD1MMOT8$$r*   c                 >    | j                   d   j                  |      S )Nr   )r   rv   )r%   rt   s     r(   rv   z#IncludingLexer.scan_anonymous_block  s    ||B44S99r*   )rw   rx   ry   __doc__r)   r/   r4   r3   staticmethodr   rv   r-   r*   r(   r~   r~      s:     37 %%N 
% 
%:r*   r~   c                       e Zd ZdZd Zy)NonIncludingLexerzBLexer that does not follow `include` statements, emits them as-is.c                 2    t        | j                  d         S )Nr   )r4   r   r.   s    r(   r3   zNonIncludingLexer.__next__"  s    DLLO$$r*   N)rw   rx   ry   r   r3   r-   r*   r(   r   r     s
    L%r*   r   )fontTools.feaLib.errorr   r   fontTools.feaLib.locationr   ra   r   r   ImportErrorfontTools.miscobjectr   r~   r   r-   r*   r(   <module>r      sX    G 8 	 	&t;F t;nX:V X:v% %o  &%&s   > AA