a
    èÝEbƒ+  ã                   @   s`   d dl mZmZ d dlmZ d dlZd dlZG dd„ deƒZG dd„ deƒZ	G dd	„ d	e	ƒZ
dS )
é    )ÚFeatureLibErrorÚIncludedFeaNotFound)ÚFeatureLibLocationNc                   @   sÐ   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ee d Ze d¡ZdZdZdd„ Zdd„ Zdd„ Z dd„ Z!d d!„ Z"d"d#„ Z#d$d%„ Z$d&d'„ Z%d(d)„ Z&d*S )+ÚLexerÚNUMBERÚHEXADECIMALÚOCTALÚFLOATÚSTRINGÚNAMEÚFILENAMEÚ
GLYPHCLASSÚCIDÚSYMBOLÚCOMMENTÚNEWLINEÚANONYMOUS_BLOCKz 	z
z,;:-+'{}[]<>()=Ú
0123456789Ú0123456789ABCDEFabcdefZ4ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzz	_+*:.^~!\z
_.+*:^~!/-z^[A-Za-z_0-9.\-]+$ÚNORMALc                 C   s4   || _ d| _d| _d| _|| _t|ƒ| _tj| _	d S )Né   r   )
Ú	filename_Úline_Úpos_Úline_start_Útext_ÚlenÚtext_length_r   ÚMODE_NORMAL_Úmode_)ÚselfÚtextÚfilename© r#   úV/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/fontTools/feaLib/lexer.pyÚ__init__%   s    
zLexer.__init__c                 C   s   | S ©Nr#   ©r    r#   r#   r$   Ú__iter__.   s    zLexer.__iter__c                 C   s   |   ¡ S r&   ©Ú__next__r'   r#   r#   r$   Únext1   s    z
Lexer.nextc                 C   s(   |   ¡ \}}}|tjkr |||fS q d S r&   )Únext_r   r   )r    Ú
token_typeÚtokenÚlocationr#   r#   r$   r*   4   s    
zLexer.__next__c                 C   s$   | j | j d }t| jpd| j|ƒS )Nr   z
<features>)r   r   r   r   r   )r    Úcolumnr#   r#   r$   Ú	location_:   s    zLexer.location_c           
      C   s  |   tj¡ |  ¡ }| j}| j}t|ƒ}||kr6tƒ ‚|| }|d |k rV||d  nd }|dkr’|  jd7  _|  jd7  _| j| _	tj
d |fS |dkrÖ|  j|dkr¬dnd7  _|  jd7  _| j| _	tj
d |fS |dk�r|  tj¡ tj||| j… |fS | jtju �r�|dk�r$td|ƒ‚|  d¡ | j|k �rD|| j nd }|dk�r\td	|ƒ‚|  jd7  _tj| _tj||d | jd … |fS |d
k�rà|tjv �rà|  jd7  _|   tj¡ tjt||d | j… dƒ|fS |dk�rj|  jd7  _|   tj¡ ||d | j… }t|ƒdk �r.td|ƒ‚t|ƒdk�rFtd|ƒ‚tj |¡�s^td|ƒ‚tj||fS |tjv �r¼|  jd7  _|   tj¡ ||| j… }|dk�r°tj| _tj||fS |dk�r|dv �r|  jd7  _|   tj¡ tjt||| j… dƒ|fS |dk�rD|tjv �rD|   tj¡ tjt||| j… dƒ|fS |tjv �rÄ|   tj¡ | j|k�sx|| j dk�r”tjt||| j… dƒ|fS |   d¡ |   tj¡ tj t!||| j… ƒ|fS |dk�r\|tjv �r\|  jd7  _|   tj¡ | j|k�s|| j dk�r,tjt||| j… dƒ|fS |   d¡ |   tj¡ tj t!||| j… ƒ|fS |tj"v �r‚|  jd7  _tj#||fS |dk�r|  jd7  _|  d¡ | j| j$k �rþ| j| j dk�rþ|  jd7  _t% &dd||d | jd … ¡}	tj'|	|fS td|ƒ‚td| |ƒ‚d S )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_r1   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!   ÚlimitZcur_charZ	next_charZ
glyphclassr.   Ústringr#   r#   r$   r,   >   sº    





 

ÿý




  
zLexer.next_c                 C   s2   | j }|| jk r(| j| |v r(|d7 }q|| _ d S ©Nr   ©r   r   r   )r    ZvalidÚpr#   r#   r$   rE   £   s    
zLexer.scan_over_c                 C   s2   | j }|| jk r(| j| |vr(|d7 }q|| _ d S rY   rZ   )r    Zstop_atr[   r#   r#   r$   rH   ©   s    
zLexer.scan_until_c                 C   s�   |   ¡ }| ¡ }|  tj¡ |  tj¡ d| d }tj|| j| j	d … dd�}t
|ƒdkrjtd| |ƒ‚|  j	t
|d ƒ7  _	tj|d |fS )Nz}\s*z\s*;r   )Úmaxsplitr4   z-Expected '} %s;' to terminate anonymous blockr   )r1   ÚstriprH   r   rI   rE   rT   Úsplitr   r   r   r   r   )r    Útagr/   Úregexpr^   r#   r#   r$   Úscan_anonymous_block¯   s    ÿzLexer.scan_anonymous_blockN)'Ú__name__Ú
__module__Ú__qualname__r   r   r   ZNUMBERSr	   r
   r   r   r   r   r   r   r   r   rF   rI   rS   rK   rQ   ZCHAR_LETTER_rP   rM   rT   ÚcompilerN   r   rJ   r%   r(   r+   r*   r1   r,   rE   rH   ra   r#   r#   r#   r$   r      sD   

	er   c                   @   sJ   e Zd ZdZddœdd„Zdd„ Zdd	„ Zd
d„ Zedd„ ƒZ	dd„ Z
dS )Ú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                C   s&   |   |¡g| _| jd j| _|| _dS )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   Úfeaturefilepathrg   )r    Zfeaturefilerg   r#   r#   r$   r%   Í   s    
zIncludingLexer.__init__c                 C   s   | S r&   r#   r'   r#   r#   r$   r(   Û   s    zIncludingLexer.__iter__c                 C   s   |   ¡ S r&   r)   r'   r#   r#   r$   r+   Þ   s    zIncludingLexer.nextc              
   C   sL  | j �rB| j d }zt|ƒ\}}}W n  tyD   | j  ¡  Y q Y n0 |tju �r6|dk�r6| ¡ \}}}|tjur~td|ƒ‚tj	 
|¡r�|}nB| jd ur¢| j}	n"| jd ur¼tj	 | j¡}	nt ¡ }	tj	 |	|¡}t| j ƒdkrêtd|ƒ‚z| j  |  |¡¡ W n2 t�y2 }
 zt||ƒ|
‚W Y d }
~
n
d }
~
0 0 q |||fS q tƒ ‚d S )Néÿÿÿÿr<   zExpected file nameé   zToo many recursive includes)ri   r+   rG   Úpopr   r   r   r   ÚosÚpathÚisabsrg   rj   ÚdirnameÚgetcwdÚjoinr   Úappendrh   ÚFileNotFoundErrorr   )r    Úlexerr-   r.   r/   Z
fname_typeZfname_tokenZfname_locationro   ZcurpathÚerrr#   r#   r$   r*   á   s6    







$zIncludingLexer.__next__c                 C   sX   t | dƒr| d }}n| d }}t|ddd�}| ¡ }t|dd ƒ}|rN| ¡  t||ƒS )NÚreadFTÚrzutf-8)ÚencodingÚname)ÚhasattrÚopenrx   ÚgetattrÚcloser   )Zfile_or_pathÚfileobjÚclosingr"   Údatar#   r#   r$   rh     s    

zIncludingLexer.make_lexer_c                 C   s   | j d  |¡S )Nrk   )ri   ra   )r    r_   r#   r#   r$   ra     s    z#IncludingLexer.scan_anonymous_block)rb   rc   rd   Ú__doc__r%   r(   r+   r*   Ústaticmethodrh   ra   r#   r#   r#   r$   rf   ¾   s   '
rf   c                   @   s   e Zd ZdZdd„ ZdS )ÚNonIncludingLexerzBLexer that does not follow `include` statements, emits them as-is.c                 C   s   t | jd ƒS )Nr   )r+   ri   r'   r#   r#   r$   r*     s    zNonIncludingLexer.__next__N)rb   rc   rd   rƒ   r*   r#   r#   r#   r$   r…     s   r…   )ZfontTools.feaLib.errorr   r   ZfontTools.feaLib.locationr   rT   rn   Úobjectr   rf   r…   r#   r#   r#   r$   Ú<module>   s    8[