o
    _h4c                     @   s   d dl m  mZ d dlmZ d dlmZ d dlmZ ddddd	d
d
d
dddddZ	G dd de
ZG dd de
ZG dd deZdS )    N)Lexer)VoltLibError)openparse_def_glyph_parse_def_group_parse_def_script_parse_def_lookup_parse_def_anchor_parse_ppem_parse_noarg_option_parse_cmap_format)	DEF_GLYPH	DEF_GROUP
DEF_SCRIPT
DEF_LOOKUP
DEF_ANCHOR	GRID_PPEMPRESENTATION_PPEMPPOSITIONING_PPEMCOMPILER_USEEXTENSIONLOOKUPSCOMPILER_USEPAIRPOSFORMAT2CMAP_FORMATDO_NOT_TOUCH_CMAPc                   @   s  e 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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'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCS )DParserc                 C   s`   t  | _t | _t | _i | _t | _t | _	t | _
d\| _| _d | _| | |   d S )NNN)astVoltFiledoc_OrderedSymbolTableglyphs_SymbolTablegroups_anchors_scripts_langs_lookups_next_token_type_next_token_next_token_location_make_lexer_advance_lexer_)selfpath r-   L/var/www/html/myenv/lib/python3.10/site-packages/fontTools/voltLib/parser.py__init__   s   

zParser.__init__c                 C   sf   t |drt|dd }| }n|}t|d}| }W d    n1 s&w   Y  t||| _d S )Nreadnamer)hasattrgetattrr0   r   r   lexer_)r+   file_or_pathfilenamedatafr-   r-   r.   r)   $   s   


zParser.make_lexer_c                 C   s   | j j}| jd ur@|   | jt v r#t| t| j }||  n| 	dr,	 | j S t
ddtt  | j| jd us	| j S )NENDz	Expected z, )r   
statementsr&   r*   
cur_token_PARSE_FUNCSkeysr4   appendis_cur_keyword_r   joinsortedcur_token_location_)r+   r;   funcr-   r-   r.   parse.   s   


zParser.parsec                 C   s:  |  dsJ | j}|  }| d |  }|dk r!td| jd }| jdkr?| d |  g}|d dk r>td| jn| jdkrM| d |  }d }| jdkrc| d |  }|d	v scJ d }| jd
krs| d
 |  }| d | j	
|d urtd||f |tj||||||d}| j	|| |S )Nr   IDr   zInvalid glyph IDUNICODEzInvalid glyph UNICODEUNICODEVALUESTYPE)BASELIGATUREMARK	COMPONENT
COMPONENTS	END_GLYPHz#Glyph "%s" (gid %i) already definedlocation)r@   rC   expect_string_expect_keyword_expect_number_r   r'   parse_unicode_values_expect_name_r   resolver   GlyphDefinitiondefine)r+   rQ   r1   gidgunicodegtype
components	def_glyphr-   r-   r.   r   >   sH   










zParser.parse_def_glyph_c                 C   s|   |  dsJ | j}|  }d }| jdkr|  }| d | j|d ur-td| |t	j
|||d}| j|| |S )Nr   ENUM	END_GROUPzBGlyph group "%s" already defined, group names are case insensitiverP   )r@   rC   rR   r'   parse_enum_rS   r!   rW   r   r   GroupDefinitionrY   )r+   rQ   r1   enum	def_groupr-   r-   r.   r   c   s"   

zParser.parse_def_group_c                 C   s  |  dsJ | j}d }| jdkr| d |  }| d |  }| j|d ur2td| || j	  g }| jdkrp| 
  |  }| d | j|jd ur^td|j|f || j|j| || | jdks>| d | j  tj||||d}| j|| |S )	Nr   NAMETAGz=Script "%s" already defined, script tags are case insensitive
END_SCRIPTEND_LANGSYSzPLanguage "%s" already defined in script "%s", language tags are case insensitiverP   )r@   rC   r'   rS   rR   r#   rW   r   r$   enter_scoper*   parse_langsys_tagrY   r?   
exit_scoper   ScriptDefinition)r+   rQ   r1   rk   langslang
def_scriptr-   r-   r.   r   u   sH   









zParser.parse_def_script_c                 C   s   |  dsJ | j}d }| jdkr| d |  }| d |  }g }| jdkrA|   |  }| d || | jdks*tj	||||d}|S )NDEF_LANGSYSre   rf   rh   END_FEATURErP   )
r@   rC   r'   rS   rR   r*   parse_feature_r?   r   LangSysDefinition)r+   rQ   r1   rk   featuresfeaturedef_langsysr-   r-   r.   rj      s"   






zParser.parse_langsys_c                 C   s   |  dsJ | j}| d |  }| d |  }g }| jdkr6| d |  }|| | jdks#tj||||d}|S )NDEF_FEATUREre   rf   rr   LOOKUPrP   )r@   rC   rS   rR   r'   r?   r   FeatureDefinition)r+   rQ   r1   rk   lookupslookuprv   r-   r-   r.   rs      s   





zParser.parse_feature_c                 C   s&  |  dsJ | j}|  }|d  std| || j|d ur*td| |d}| jdkr6|   n| jdkrA|   d}d}d }| jd	kr|   | jd
kr\|   |  }n4| jdkrf|   n*| jdkrr|   d}n| j	t
jkr}|  }ntd| j	 || jdkr|   d}d }| jdkr| d |  }|dv sJ d }| jdkr| d d}d }| jdkr| d |  dd}g }	| jdv r|  }	| jdv s|  }
d }d }|
dkr| |}n|
dkr|  }ntd|
 |tj||||||||	|||d}| j|| |S )Nr   r   z)Lookup name "%s" must start with a letterz>Lookup "%s" already defined, lookup names are case insensitiveTPROCESS_BASE	SKIP_BASEFPROCESS_MARKSMARK_GLYPH_SETALLNONEz3Expected ALL, NONE, MARK_GLYPH_SET or an ID. Got %s
SKIP_MARKS	DIRECTION)LTRRTLREVERSALCOMMENTSz\n
EXCEPT_CONTEXT
IN_CONTEXTAS_SUBSTITUTIONAS_POSITIONz/Expected AS_SUBSTITUTION or AS_POSITION. Got %srP   )r@   rC   rR   isalphar   r%   rW   r'   r*   r&   r   STRINGrS   rV   replaceparse_context_parse_substitution_parse_position_r   LookupDefinitionrY   )r+   rQ   r1   process_baseprocess_marksmark_glyph_set	directionreversalcommentscontextas_pos_or_subsubpos
def_lookupr-   r-   r.   r      s   



















zParser.parse_def_lookup_c           	      C   s   | j }g }| jdv rZd }d }|  }| jdkrPg }g }| jdv r<|  }|  }|dkr2|| n|| | jdv s | d tj||||d}|| n| d | jdv s
|S )Nr   END_CONTEXT)LEFTRIGHTr   rP   )rC   r'   rV   parse_coverage_r?   rS   r   ContextDefinition)	r+   rQ   contextssidecoverageex_or_inleftrightr   r-   r-   r.   r     s0   







zParser.parse_context_c           
      C   s  |  dsJ | j}g }g }| jdkrtd|| jdkr?| d ||   | d ||   | d | jdks| d tdd |D }td	d |D }|d
krc|d
krctd|tt	t
|t
|}|d
kr|d
krdd |D }tt|t|krtj||d}	|	S |rtj||d}	|	S tj||d}	|	S |d
kr|d
krtj||d}	|	S |d
kr|d
krtj||d}	|	S )Nr   SUBzExpected SUBWITHEND_SUBEND_SUBSTITUTIONc                 S      g | ]}t |qS r-   len.0covr-   r-   r.   
<listcomp>:      z.Parser.parse_substitution_.<locals>.<listcomp>c                 S   r   r-   r   r   r-   r-   r.   r   ;  r      zInvalid substitution typec                 S   s   g | ]}|D ]}|  qqS r-   )glyphSet)r   r   xr-   r-   r.   r   E  s    rP   )r@   rC   r'   r   rS   r?   r   maxdictziptupler   setr   SubstitutionAlternateDefinition+SubstitutionReverseChainingSingleDefinitionSubstitutionSingleDefinitionSubstitutionMultipleDefinitionSubstitutionLigatureDefinition)
r+   r   rQ   srcdestmax_srcmax_destmappingglyphsr   r-   r-   r.   r   ,  sJ   








	zParser.parse_substitution_c                 C   s   |  dsJ | j}|  }|dvrtd||dkr |  }n|dkr)|  }n|dkr2|  }n|dkr:|  }| d |S )	Nr   )ATTACHATTACH_CURSIVEADJUST_PAIRADJUST_SINGLEz;Expected ATTACH, ATTACH_CURSIVE, ADJUST_PAIR, ADJUST_SINGLEr   r   r   r   END_POSITION)	r@   rC   rV   r   parse_attach_parse_attach_cursive_parse_adjust_pair_parse_adjust_single_rS   )r+   rQ   pos_typepositionr-   r-   r.   r   W  s"   



zParser.parse_position_c                 C   s   |  dsJ | j}|  }g }| d | jdkr8|  }| d | d |  }|||f | jdks| d tj|||d}|S )Nr   TO
END_ATTACHATANCHORrP   )	r@   rC   r   rS   r'   rR   r?   r   PositionAttachDefinition)r+   rQ   r   coverage_tor   anchor_namer   r-   r-   r.   r   j  s"   





zParser.parse_attach_c                 C   s   |  dsJ | j}g }g }| jdkr$| d ||   | jdks| jdkr:| d ||   | jdks)| d tj|||d}|S )Nr   ENTEREXITr   rP   )r@   rC   r'   rS   r?   r   r   PositionAttachCursiveDefinition)r+   rQ   coverages_exitcoverages_enterr   r-   r-   r.   r   |  s"   






zParser.parse_attach_cursive_c                 C   s   |  dsJ | j}g }g }i }| jdkr'|   |  }|| | jdks| jdkr>|   |  }|| | jdks,| jdkre|  }|  }| d |  }	|  }
|	|
f|||f< | jdksC| d t	j
||||d}|S )Nr   FIRSTSECOND
END_ADJUSTBYrP   )r@   rC   r'   r*   r   r?   rT   rS   
parse_pos_r   PositionAdjustPairDefinition)r+   rQ   coverages_1coverages_2adjust_pair
coverage_1
coverage_2id_1id_2pos_1pos_2r   r-   r-   r.   r     s8   









zParser.parse_adjust_pair_c                 C   sp   |  dsJ | j}g }| jdkr*|  }| d |  }|||f | jdks| d tj||d}|S )Nr   r   r   rP   )	r@   rC   r'   r   rS   r   r?   r   PositionAdjustSingleDefinition)r+   rQ   adjust_single	coveragesr   r   r-   r-   r.   r     s   



zParser.parse_adjust_single_c           	   	   C   s  |  dsJ | j}|  }| d |  }| d |  }| d |  }|| jv rF| j| |}|d urF|j|krFt	d| || j
dkrRd}|   nd}| d	 |  }| d
 tj|||||||d}|| jvryt | j|< | j| || |S )Nr   ONGLYPHrM   z>Anchor "%s" already defined, anchor names are case insensitiveLOCKEDTFr   
END_ANCHORrP   )r@   rC   rR   rS   rT   rV   r"   rW   	componentr   r'   r*   r   r   AnchorDefinitionr    rY   )	r+   rQ   r1   rZ   
glyph_namer   anchorlockedr   r-   r-   r.   r	     s@   








zParser.parse_def_anchor_c                 C   s8   |    | dsJ |  }| d |  }||fS )N	ADJUST_BYr   )r*   r@   rT   rS   )r+   
adjustmentsizer-   r-   r.   parse_adjust_by_  s   
zParser.parse_adjust_by_c           
      C   s  |    | j}| dsJ |d }d }d }i }i }i }| jdkr=|    |  }| jdkr=|  \}}	|||	< | jdks.| jdkr^|    |  }| jdkr^|  \}}	|||	< | jdksO| jdkr|    |  }| jdkr|  \}}	|||	< | jdksp| d t||||||S )NPOSADVr   DXDYEND_POS)	r*   rC   r@   r'   rT   r   rS   r   Pos)
r+   rQ   advdxdyadv_adjust_bydx_adjust_bydy_adjust_byr   r   r-   r-   r.   r     s@   









zParser.parse_pos_c              
   C   s^   | j }z|  d}dd |D }W n ty& } ztt||d }~ww |g kr-|S d S )N,c                 S   s&   g | ]}|d krt |dd dqS )    N   )int)r   unir-   r-   r.   r     s   & z0Parser.parse_unicode_values_.<locals>.<listcomp>)rC   rR   split
ValueErrorr   str)r+   rQ   unicode_valueserrr-   r-   r.   rU      s   zParser.parse_unicode_values_c                 C   s0   |  d | j}tj|  |d}|  d |S )Nr_   rP   END_ENUM)rS   rC   r   Enumr   )r+   rQ   rc   r-   r-   r.   ra   	  s
   

zParser.parse_enum_c                 C   s   g }| j }| jdv rt| jdkr|  }|| nV| jdkr2| d |  }|tj||d n=| jdkrL| d |  }|tj|| |d n#| jdkro| d |  }| d |  }|tj	||| |d | jdv s
t
|S )N)r   GROUPRANGEr_   r_   r   rP   r  r  r   )rC   r'   ra   r?   rS   rR   r   	GlyphName	GroupNameRanger   )r+   r   rQ   rc   r1   startendr-   r-   r.   r     s,   









zParser.parse_coverage_c                 C   s   | j |S N)r!   rW   )r+   
group_namer-   r-   r.   resolve_group'     zParser.resolve_groupc                 C   s   | j ||S r!  )r   range)r+   r  r   r-   r-   r.   glyph_range*     zParser.glyph_rangec                 C   s(   | j }| j}|  }tj|||d}|S NrP   rC   r<   rT   r   SettingDefinition)r+   rQ   	ppem_namevaluesettingr-   r-   r.   r
   -  s
   zParser.parse_ppem_c                 C   s$   | j }| j}d}tj|||d}|S )NTrP   )rC   r<   r   r*  r+   rQ   r1   r,  r-  r-   r-   r.   r   4  s
   zParser.parse_noarg_option_c                 C   s6   | j }| j}|  |  |  f}tj|||d}|S r(  r)  r.  r-   r-   r.   r   ;  s
   zParser.parse_cmap_formatc                 C   s   | j tju o
| j|kS r!  )cur_token_type_r   re   r<   )r+   kr-   r-   r.   r@   B  s   zParser.is_cur_keyword_c                 C   &   |    | jtjurtd| j| jS )NzExpected a string)r*   r/  r   r   r   rC   r<   r+   r-   r-   r.   rR   E     zParser.expect_string_c                 C   s4   |    | jtju r| j|kr| jS td| | j)NzExpected "%s"r*   r/  r   re   r<   r   rC   )r+   keywordr-   r-   r.   rS   K  s   zParser.expect_keyword_c                 C   s&   |    | jtju r| jS td| j)NzExpected a namer4  r2  r-   r-   r.   rV   Q  s   zParser.expect_name_c                 C   r1  )NzExpected a number)r*   r/  r   NUMBERr   rC   r<   r2  r-   r-   r.   rT   W  r3  zParser.expect_number_c                 C   sh   | j | j| j| _| _| _z| drt| j	 \| _ | _| _W d S  ty3   d\| _ | _Y d S w )Nr:   r   )
r&   r'   r(   r/  r<   rC   r@   StopIterationr5   nextr2  r-   r-   r.   r*   ]  s   

zParser.advance_lexer_N)$__name__
__module____qualname__r/   r)   rE   r   r   r   rj   rs   r   r   r   r   r   r   r   r   r	   r   r   rU   ra   r   r#  r&  r
   r   r   r@   rR   rS   rV   rT   r*   r-   r-   r-   r.   r      sD    
%#W+# 	r   c                   @   s6   e Zd Zdd Zdd Zdd Zdd Zdd
dZdS )r    c                 C      i g| _ d S r!  scopes_r2  r-   r-   r.   r/   p  r$  zSymbolTable.__init__c                 C      | j i  d S r!  r>  r?   r2  r-   r-   r.   ri   s     zSymbolTable.enter_scopec                 C   s   | j   d S r!  )r>  popr2  r-   r-   r.   rl   v  r'  zSymbolTable.exit_scopec                 C   s   || j d |< d S )Nr=  )r+   r1   itemr-   r-   r.   rY   y  s   zSymbolTable.defineTc                 C   sT   t | jD ]}||}|r|  S q|r(|D ]}| | kr'||   S qd S r!  )reversedr>  getlower)r+   r1   case_insensitivescoperD  keyr-   r-   r.   rW   |  s   
zSymbolTable.resolveN)T)r9  r:  r;  r/   ri   rl   rY   rW   r-   r-   r-   r.   r    o  s    r    c                   @   s.   e Zd Zdd Zdd ZdddZdd	 Zd
S )r   c                 C   r<  r!  r=  r2  r-   r-   r.   r/     r$  zOrderedSymbolTable.__init__c                 C   r?  r!  r@  r2  r-   r-   r.   ri     rA  zOrderedSymbolTable.enter_scopeFc                 C   s   t j| ||d d S )N)rH  )r    rW   )r+   r1   rH  r-   r-   r.   rW     s   zOrderedSymbolTable.resolvec                 C   sd   t | jD ]*}||v r/||v r/t| |}t| |}t| ||d    S qd S )Nr   )rE  r>  listr>   index)r+   r  r   rI  	start_idxend_idxr-   r-   r.   r%    s   zOrderedSymbolTable.rangeN)F)r9  r:  r;  r/   ri   rW   r%  r-   r-   r-   r.   r     s
    
r   )fontTools.voltLib.astvoltLibr   fontTools.voltLib.lexerr   fontTools.voltLib.errorr   ior   r=   objectr   r    r   r-   r-   r-   r.   <module>   s0        ]