a
    ׶ab                     @   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_ANCHORZ	GRID_PPEMZPRESENTATION_PPEMZPPOSITIONING_PPEMZCOMPILER_USEEXTENSIONLOOKUPSZCOMPILER_USEPAIRPOSFORMAT2ZCMAP_FORMATZ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)astZ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%   h/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/fontTools/voltLib/parser.py__init__   s    

zParser.__init__c                 C   sf   t |dr t|dd }| }n6|}t|d}| }W d    n1 sL0    Y  t||| _d S )Nreadnamer)hasattrgetattrr(   r   r   lexer_)r#   Zfile_or_pathfilenamedatafr%   r%   r&   r!   $   s    

&zParser.make_lexer_c                 C   sz   | j j}| jd urt|   | jt v rFt| t| j }||  q| 	drTqtqt
ddtt  | jq| j S )NENDz	Expected z, )r   
statementsr   r"   
cur_token_PARSE_FUNCSkeysr,   appendis_cur_keyword_r   joinsortedcur_token_location_)r#   r2   funcr%   r%   r&   parse.   s    

zParser.parsec                 C   s<  |  dsJ | j}|  }| d |  }|dk rBtd| jd }| jdkr~| d |  g}|d dk rtd| jn| jdkr| d |  }d }| jdkr| d |  }|d	v sJ d }| jd
kr| d
 |  }| d | j	
|d urtd||f |tj||||||d}| j	|| |S )Nr   ZIDr   zInvalid glyph IDUNICODEzInvalid glyph UNICODEZUNICODEVALUESZTYPE)ZBASEZLIGATUREMARK	COMPONENTZ
COMPONENTSZ	END_GLYPHz#Glyph "%s" (gid %i) already definedlocation)r7   r:   expect_string_expect_keyword_expect_number_r   r   parse_unicode_values_expect_name_r   resolver   ZGlyphDefinitiondefine)r#   rA   r)   gidZgunicodegtype
componentsZ	def_glyphr%   r%   r&   r   =   sN    











zParser.parse_def_glyph_c                 C   s|   |  dsJ | j}|  }d }| jdkr2|  }| d | j|d urZtd| |t	j
|||d}| j|| |S )Nr   ENUMZ	END_GROUPzBGlyph group "%s" already defined, group names are case insensitiver@   )r7   r:   rB   r   parse_enum_rC   r   rG   r   r   ZGroupDefinitionrH   )r#   rA   r)   enumZ	def_groupr%   r%   r&   r   d   s&    

zParser.parse_def_group_c                 C   s  |  dsJ | j}d }| jdkr4| d |  }| d |  }| j|d urdtd| || j	  g }| jdkr| 
  |  }| d | j|jd urtd|j|f || j|j| || qr| d | j  tj||||d}| j|| |S )	Nr   NAMETAGz=Script "%s" already defined, script tags are case insensitiveZ
END_SCRIPTEND_LANGSYSzPLanguage "%s" already defined in script "%s", language tags are case insensitiver@   )r7   r:   r   rC   rB   r   rG   r   r   enter_scoper"   parse_langsys_tagrH   r6   
exit_scoper   ZScriptDefinition)r#   rA   r)   rT   ZlangslangZ
def_scriptr%   r%   r&   r   w   sF    







zParser.parse_def_script_c                 C   s   |  dsJ | j}d }| jdkr4| d |  }| d |  }g }| jdkrz|   |  }| d || qJtj	||||d}|S )NZDEF_LANGSYSrO   rP   rQ   END_FEATUREr@   )
r7   r:   r   rC   rB   r"   parse_feature_r6   r   ZLangSysDefinition)r#   rA   r)   rT   featuresfeatureZdef_langsysr%   r%   r&   rS      s$    





zParser.parse_langsys_c                 C   sz   |  dsJ | j}| d |  }| d |  }g }| jdkrd| d |  }|| q<tj||||d}|S )NZDEF_FEATURErO   rP   rW   ZLOOKUPr@   )r7   r:   rC   rB   r   r6   r   ZFeatureDefinition)r#   rA   r)   rT   lookupslookuprZ   r%   r%   r&   rX      s    




zParser.parse_feature_c                 C   s4  |  dsJ | j}|  }|d  s6td| || j|d urTtd| |d}| jdkrl|   n| jdkr|   d}d}d }| jd	kr|   | jd
kr|   |  }nR| jdkr|   n>| jdkr|   d}n&| j	t
jkr|  }ntd| j	 |n| jdkr&|   d}d }| jdkrV| d |  }|dv sVJ d }| jdkrt| d d}d }| jdkr| d |  dd}g }	| jdv r|  }	q|  }
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 insensitiveTZPROCESS_BASEZ	SKIP_BASEFZPROCESS_MARKSZMARK_GLYPH_SETALLNONEz3Expected ALL, NONE, MARK_GLYPH_SET or an ID. Got %sZ
SKIP_MARKSZ	DIRECTION)ZLTRZRTLZREVERSALZCOMMENTSz\n
ZEXCEPT_CONTEXTZ
IN_CONTEXTAS_SUBSTITUTIONAS_POSITIONz/Expected AS_SUBSTITUTION or AS_POSITION. Got %sr@   )r7   r:   rB   isalphar   r   rG   r   r"   r   r   STRINGrC   rF   replaceparse_context_parse_substitution_parse_position_r   ZLookupDefinitionrH   )r#   rA   r)   Zprocess_baseZprocess_marksZmark_glyph_set	directionreversalcommentscontextZas_pos_or_subsubposZ
def_lookupr%   r%   r&   r      s    















zParser.parse_def_lookup_c           	      C   s   | j }g }| jdv rd }d }|  }| jdkrg }g }| jdv rp|  }|  }|dkrd|| q6|| q6| d tj||||d}|| q
| d q
|S )Nr`   ZEND_CONTEXT)LEFTRIGHTro   r@   )r:   r   rF   parse_coverage_r6   rC   r   ZContextDefinition)	r#   rA   ZcontextsZsidecoverageZex_or_inleftrightrl   r%   r%   r&   rf     s,    



zParser.parse_context_c           	      C   sl  |  dsJ | j}g }g }| jdkr0td|| jdkrv| d ||   | d ||   | d q0| d tdd |D }td	d |D }|d
kr|d
ks|r|d
ks|d
krtd|tt	t
|t
|}|d
kr"|d
kr"|rtj||d}ntj||d}nF|d
krF|d
krFtj||d}n"|d
krh|d
krhtj||d}|S )Nra   ZSUBzExpected SUBZWITHZEND_SUBZEND_SUBSTITUTIONc                 S   s   g | ]}t |qS r%   len.0covr%   r%   r&   
<listcomp>3      z.Parser.parse_substitution_.<locals>.<listcomp>c                 S   s   g | ]}t |qS r%   ru   rw   r%   r%   r&   rz   4  r{      zInvalid substitution typer@   )r7   r:   r   r   rC   r6   rq   maxdictziptupler   Z+SubstitutionReverseChainingSingleDefinitionZSubstitutionSingleDefinitionZSubstitutionMultipleDefinitionZSubstitutionLigatureDefinition)	r#   rj   rA   srcdestZmax_srcZmax_destmappingrm   r%   r%   r&   rg   %  sX    





zParser.parse_substitution_c                 C   s   |  dsJ | j}|  }|dvr.td||dkr@|  }n4|dkrR|  }n"|dkrd|  }n|dkrt|  }| d |S )	Nrb   )ATTACHATTACH_CURSIVEADJUST_PAIRADJUST_SINGLEz;Expected ATTACH, ATTACH_CURSIVE, ADJUST_PAIR, ADJUST_SINGLEr   r   r   r   ZEND_POSITION)	r7   r:   rF   r   parse_attach_parse_attach_cursive_parse_adjust_pair_parse_adjust_single_rC   )r#   rA   Zpos_typepositionr%   r%   r&   rh   K  s$    



zParser.parse_position_c                 C   s   |  dsJ | j}|  }g }| d | jdkrh|  }| d | d |  }|||f q*| d tj|||d}|S )Nr   TO
END_ATTACHATZANCHORr@   )	r7   r:   rq   rC   r   rB   r6   r   ZPositionAttachDefinition)r#   rA   rr   Zcoverage_tory   Zanchor_namer   r%   r%   r&   r   _  s     




zParser.parse_attach_c                 C   s   |  dsJ | j}g }g }| jdkr@| d ||   q| jdkrd| d ||   q@| d tj|||d}|S )Nr   ZENTERZEXITr   r@   )r7   r:   r   rC   r6   rq   r   ZPositionAttachCursiveDefinition)r#   rA   Zcoverages_exitZcoverages_enterr   r%   r%   r&   r   p  s    




zParser.parse_attach_cursive_c                 C   s   |  dsJ | j}g }g }i }| jdkrF|   |  }|| q | jdkrl|   |  }|| qF| jdkr|  }|  }| d |  }	|  }
|	|
f|||f< ql| d t	j
||||d}|S )Nr   ZFIRSTZSECOND
END_ADJUSTBYr@   )r7   r:   r   r"   rq   r6   rD   rC   
parse_pos_r   ZPositionAdjustPairDefinition)r#   rA   Zcoverages_1Zcoverages_2Zadjust_pairZ
coverage_1Z
coverage_2Zid_1Zid_2Zpos_1Zpos_2r   r%   r%   r&   r     s2    




zParser.parse_adjust_pair_c                 C   sh   |  dsJ | j}g }| jdkrL|  }| d |  }|||f q| d tj||d}|S )Nr   r   r   r@   )	r7   r:   r   rq   rC   r   r6   r   ZPositionAdjustSingleDefinition)r#   rA   Zadjust_singleZ	coveragesrn   r   r%   r%   r&   r     s    


zParser.parse_adjust_single_c           	   	   C   s  |  dsJ | j}|  }| d |  }| d |  }| d |  }|| jv r| j| |}|d ur|j|krt	d| || j
dkrd}|   nd}| d	 |  }| d
 tj|||||||d}|| jvrt | j|< | j| || |S )Nr   ONGLYPHr?   z>Anchor "%s" already defined, anchor names are case insensitiveLOCKEDTFr   Z
END_ANCHORr@   )r7   r:   rB   rC   rD   rF   r   rG   	componentr   r   r"   r   r   ZAnchorDefinitionr   rH   )	r#   rA   r)   rI   Z
glyph_namer   anchorlockedrn   r%   r%   r&   r	     sB    









zParser.parse_def_anchor_c                 C   s8   |    | dsJ |  }| d |  }||fS )N	ADJUST_BYr   )r"   r7   rD   rC   )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rr|    |  }| jdkrr|  \}}	|||	< qR| jdkr|    |  }| jdkr|  \}}	|||	< q| jdkr|    |  }| jdkr|  \}}	|||	< q| d t||||||S )NPOSZADVr   ZDXZDYZEND_POS)	r"   r:   r7   r   rD   r   rC   r   Pos)
r#   rA   ZadvZdxZdyZadv_adjust_byZdx_adjust_byZdy_adjust_byr   r   r%   r%   r&   r     s:    









zParser.parse_pos_c              
   C   sj   | j }z |  d}dd |D }W n2 tyX } ztt||W Y d }~n
d }~0 0 |g krf|S d S )N,c                 S   s&   g | ]}|d krt |dd dqS )    N   )int)rx   unir%   r%   r&   rz     s   
z0Parser.parse_unicode_values_.<locals>.<listcomp>)r:   rB   split
ValueErrorr   str)r#   rA   Zunicode_valueserrr%   r%   r&   rE     s    
$zParser.parse_unicode_values_c                 C   s0   |  d | j}tj|  |d}|  d |S )NrL   r@   ZEND_ENUM)rC   r:   r   Enumrq   )r#   rA   rN   r%   r%   r&   rM     s
    

zParser.parse_enum_c                 C   s   g }| j }| jdv r| jdkr2|  }|| q
| jdkrd| d |  }|tj||d q
| jdkr| d |  }|tj|| |d q
| jdkr
| d |  }| d |  }|tj	||| |d q
t
|S )N)r   GROUPRANGErL   rL   r   r@   r   r   r   )r:   r   rM   r6   rC   rB   r   Z	GlyphNameZ	GroupNameRanger   )r#   rr   rA   rN   r)   startendr%   r%   r&   rq     s*    








zParser.parse_coverage_c                 C   s   | j |S N)r   rG   )r#   Z
group_namer%   r%   r&   resolve_group  s    zParser.resolve_groupc                 C   s   | j ||S r   )r   range)r#   r   r   r%   r%   r&   glyph_range  s    zParser.glyph_rangec                 C   s(   | j }| j}|  }tj|||d}|S Nr@   r:   r3   rD   r   SettingDefinition)r#   rA   Z	ppem_namevaluesettingr%   r%   r&   r
   "  s
    zParser.parse_ppem_c                 C   s$   | j }| j}d}tj|||d}|S )NTr@   )r:   r3   r   r   r#   rA   r)   r   r   r%   r%   r&   r   )  s
    zParser.parse_noarg_option_c                 C   s6   | j }| j}|  |  |  f}tj|||d}|S r   r   r   r%   r%   r&   r   0  s    zParser.parse_cmap_formatc                 C   s   | j tju o| j|kS r   )cur_token_type_r   rO   r3   )r#   kr%   r%   r&   r7   8  s    zParser.is_cur_keyword_c                 C   s&   |    | jtjur td| j| jS )NzExpected a string)r"   r   r   rd   r   r:   r3   r#   r%   r%   r&   rB   ;  s    zParser.expect_string_c                 C   s8   |    | jtju r$| j|kr$| jS td| | jd S )NzExpected "%s"r"   r   r   rO   r3   r   r:   )r#   keywordr%   r%   r&   rC   A  s    zParser.expect_keyword_c                 C   s*   |    | jtju r| jS td| jd S )NzExpected a namer   r   r%   r%   r&   rF   H  s    zParser.expect_name_c                 C   s&   |    | jtjur td| j| jS )NzExpected a number)r"   r   r   NUMBERr   r:   r3   r   r%   r%   r&   rD   N  s    zParser.expect_number_c                 C   sh   | j | j| j  | _| _| _z(| dr,t| j	 \| _ | _| _W n tyb   d\| _ | _Y n0 d S )Nr1   r   )
r   r   r    r   r3   r:   r7   StopIterationr-   nextr   r%   r%   r&   r"   T  s    

zParser.advance_lexer_N)$__name__
__module____qualname__r'   r!   r<   r   r   r   rS   rX   r   rf   rg   rh   r   r   r   r   r	   r   r   rE   rM   rq   r   r   r
   r   r   r7   rB   rC   rF   rD   r"   r%   r%   r%   r&   r      sB   
'#M&# 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   s   i g| _ d S r   scopes_r   r%   r%   r&   r'   a  s    zSymbolTable.__init__c                 C   s   | j i  d S r   r   r6   r   r%   r%   r&   rR   d  s    zSymbolTable.enter_scopec                 C   s   | j   d S r   )r   popr   r%   r%   r&   rU   g  s    zSymbolTable.exit_scopec                 C   s   || j d |< d S )Nr   )r#   r)   itemr%   r%   r&   rH   j  s    zSymbolTable.defineTc                 C   sT   t | jD ]}||}|r
|  S q
|rP|D ] }| | kr.||   S q.d S r   )reversedr   getlower)r#   r)   case_insensitivescoper   keyr%   r%   r&   rG   m  s    

zSymbolTable.resolveN)T)r   r   r   r'   rR   rU   rH   rG   r%   r%   r%   r&   r   `  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   s   i g| _ d S r   r   r   r%   r%   r&   r'   z  s    zOrderedSymbolTable.__init__c                 C   s   | j i  d S r   r   r   r%   r%   r&   rR   }  s    zOrderedSymbolTable.enter_scopeFc                 C   s   t j| ||d d S )N)r   )r   rG   )r#   r)   r   r%   r%   r&   rG     s    zOrderedSymbolTable.resolvec                 C   sd   t | jD ]T}||v r
||v r
t| |}t| |}t| ||d    S q
d S )Nr|   )r   r   listr5   index)r#   r   r   r   Z	start_idxZend_idxr%   r%   r&   r     s    zOrderedSymbolTable.rangeN)F)r   r   r   r'   rR   rG   r   r%   r%   r%   r&   r   y  s   
r   )ZfontTools.voltLib.astZvoltLibr   ZfontTools.voltLib.lexerr   ZfontTools.voltLib.errorr   ior   r4   objectr   r   r   r%   r%   r%   r&   <module>   s.       N