B
    Scœb  ã               @   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$   ú7lib/python3.7/site-packages/fontTools/voltLib/parser.pyÚ__init__   s    

zParser.__init__c          	   C   sR   t |dƒr t|dd ƒ}| ¡ }n"|}t|dƒ}| ¡ }W d Q R X 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   s~   | j j}xn| jd k	rv|  ¡  | jt ¡ krHt| t| j ƒ}| |ƒ ¡ q
|  	d¡rVP q
t
dd tt ¡ ƒ¡ | jƒ‚q
W | 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"   r1   Úfuncr$   r$   r%   Úparse.   s    
zParser.parsec             C   s<  |   d¡st‚| j}|  ¡ }|  d¡ |  ¡ }|dk rBtd| jƒ‚d }| jdkr~|  d¡ |  ¡ g}|d dk rštd| jƒ‚n| jdkrš|  d¡ |  ¡ }d }| jdkrÆ|  d¡ |  	¡ }|d	ksÆt‚d }| jd
kræ|  d
¡ |  ¡ }|  d¡ | j
 |¡d k	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)r6   ÚAssertionErrorr9   Úexpect_string_Úexpect_keyword_Úexpect_number_r   r   Úparse_unicode_values_Úexpect_name_r   Úresolver   ZGlyphDefinitionÚdefine)r"   r?   r(   ÚgidZgunicodeZgtypeZ
componentsZ	def_glyphr$   r$   r%   r   =   sH    












zParser.parse_def_glyph_c             C   s|   |   d¡st‚| j}|  ¡ }d }| jdkr2|  ¡ }|  d¡ | j |¡d k	rZt	d| |ƒ‚t
j|||d}| j ||¡ |S )Nr   ÚENUMZ	END_GROUPzBGlyph group "%s" already defined, group names are case insensitive)r?   )r6   r@   r9   rA   r   Úparse_enum_rB   r   rF   r   r   ZGroupDefinitionrG   )r"   r?   r(   ÚenumZ	def_groupr$   r$   r%   r   d   s     

zParser.parse_def_group_c             C   s  |   d¡st‚| j}d }| jdkr4|  d¡ |  ¡ }|  d¡ |  ¡ }| j |¡d k	rdtd| |ƒ‚| j	 
¡  g }xh| jdkrÚ|  ¡  |  ¡ }|  d¡ | j	 |j¡d k	r¾td|j|f |ƒ‚| j	 |j|¡ | |¡ qtW |  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 insensitive)r?   )r6   r@   r9   r   rB   rA   r   rF   r   r   Úenter_scoper!   Úparse_langsys_ÚtagrG   r5   Ú
exit_scoper   ZScriptDefinition)r"   r?   r(   rQ   ZlangsZlangZ
def_scriptr$   r$   r%   r   w   s>    







zParser.parse_def_script_c             C   s”   |   d¡st‚| j}d }| jdkr4|  d¡ |  ¡ }|  d¡ |  ¡ }g }x2| jdkr||  ¡  |  ¡ }|  d¡ | |¡ qLW t	j
||||d}|S )NZDEF_LANGSYSrL   rM   rN   ÚEND_FEATURE)r?   )r6   r@   r9   r   rB   rA   r!   Úparse_feature_r5   r   ZLangSysDefinition)r"   r?   r(   rQ   ZfeaturesÚfeatureZdef_langsysr$   r$   r%   rP   š   s"    




zParser.parse_langsys_c             C   s~   |   d¡st‚| j}|  d¡ |  ¡ }|  d¡ |  ¡ }g }x*| jdkrf|  d¡ |  ¡ }| |¡ q>W tj||||d}|S )NZDEF_FEATURErL   rM   rS   ZLOOKUP)r?   )	r6   r@   r9   rB   rA   r   r5   r   ZFeatureDefinition)r"   r?   r(   rQ   ZlookupsÚlookuprU   r$   r$   r%   rT   ­   s    



zParser.parse_feature_c             C   s8  |   d¡st‚| j}|  ¡ }|d  ¡ s6td| |ƒ‚| j |¡d k	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ksVt‚d }| jdkrt|  d¡ d}d }| jdkrž|  d¡ |  ¡  dd¡}g }	x| jdkr¼|  ¡ }	q¤W |  ¡ }
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_SETZALLZNONEz3Expected ALL, NONE, MARK_GLYPH_SET or an ID. Got %sZ
SKIP_MARKSZ	DIRECTION)ZLTRZRTLZREVERSALZCOMMENTSz\nÚ
)ÚEXCEPT_CONTEXTÚ
IN_CONTEXTÚAS_SUBSTITUTIONÚAS_POSITIONz/Expected AS_SUBSTITUTION or AS_POSITION. Got %s)r?   )r6   r@   r9   rA   Úisalphar   r   rF   r   r!   r   r   ÚSTRINGrB   rE   ÚreplaceÚparse_context_Úparse_substitution_Úparse_position_r   ZLookupDefinitionrG   )r"   r?   r(   Zprocess_baseZprocess_marksZmark_glyph_setÚ	directionÚreversalZcommentsÚcontextZas_pos_or_subÚsubÚposZ
def_lookupr$   r$   r%   r   ¾   sŽ    















zParser.parse_def_lookup_c       	      C   s°   | j }g }x | jdkrªd }d }|  ¡ }| jdkržg }g }x<| jdkrt|  ¡ }|  ¡ }|dkrh| |¡ q:| |¡ q:W |  d¡ tj||||d}| |¡ q|  d¡ qW |S )N)rX   rY   ZEND_CONTEXT)ÚLEFTZRIGHTrg   )r?   )r9   r   rE   Úparse_coverage_r5   rB   r   ZContextDefinition)	r"   r?   ZcontextsZsideÚcoverageZex_or_inÚleftÚrightrd   r$   r$   r%   r_     s*    


zParser.parse_context_c       	      C   sp  |   d¡st‚| j}g }g }| jdkr0td|ƒ‚xH| jdkrx|  d¡ | |  ¡ ¡ |  d¡ | |  ¡ ¡ |  d¡ q2W |  d¡ tdd„ |D ƒƒ}td	d„ |D ƒƒ}|d
kr¸|d
ksÌ|rÖ|d
ksÌ|d
krÖtd|ƒ‚t	t
t|ƒt|ƒƒƒ}|d
kr&|d
kr&|rtj||d}ntj||d}nF|d
krJ|d
krJtj||d}n"|d
krl|d
krltj||d}|S )NrZ   ZSUBzExpected SUBZWITHZEND_SUBZEND_SUBSTITUTIONc             S   s   g | ]}t |ƒ‘qS r$   )Úlen)Ú.0Úcovr$   r$   r%   ú
<listcomp>3  s    z.Parser.parse_substitution_.<locals>.<listcomp>c             S   s   g | ]}t |ƒ‘qS r$   )rl   )rm   rn   r$   r$   r%   ro   4  s    é   zInvalid substitution type)r?   )r6   r@   r9   r   r   rB   r5   rh   ÚmaxÚdictÚzipÚtupler   Z+SubstitutionReverseChainingSingleDefinitionZSubstitutionSingleDefinitionZSubstitutionMultipleDefinitionZSubstitutionLigatureDefinition)	r"   rc   r?   ÚsrcÚdestZmax_srcZmax_destÚmappingre   r$   r$   r%   r`   %  sD    






zParser.parse_substitution_c             C   s‚   |   d¡st‚| j}|  ¡ }|dkr.td|ƒ‚|dkr@|  ¡ }n4|dkrR|  ¡ }n"|dkrd|  ¡ }n|dkrt|  ¡ }|  	d¡ |S )	Nr[   )ÚATTACHÚATTACH_CURSIVEÚADJUST_PAIRÚADJUST_SINGLEz;Expected ATTACH, ATTACH_CURSIVE, ADJUST_PAIR, ADJUST_SINGLErx   ry   rz   r{   ZEND_POSITION)
r6   r@   r9   rE   r   Úparse_attach_Úparse_attach_cursive_Úparse_adjust_pair_Úparse_adjust_single_rB   )r"   r?   Zpos_typeÚpositionr$   r$   r%   ra   K  s$    



zParser.parse_position_c             C   sŠ   |   d¡st‚| j}|  ¡ }g }|  d¡ x@| jdkrj|  ¡ }|  d¡ |  d¡ |  ¡ }| ||f¡ q,W |  d¡ tj	|||d}|S )Nrx   ÚTOÚ
END_ATTACHÚATZANCHOR)r?   )
r6   r@   r9   rh   rB   r   rA   r5   r   ZPositionAttachDefinition)r"   r?   ri   Zcoverage_torn   Zanchor_namer€   r$   r$   r%   r|   _  s    



zParser.parse_attach_c             C   sŠ   |   d¡st‚| j}g }g }x&| jdkrB|  d¡ | |  ¡ ¡ qW x&| jdkrj|  d¡ | |  ¡ ¡ qFW |  d¡ tj|||d}|S )Nry   ZENTERZEXITr‚   )r?   )	r6   r@   r9   r   rB   r5   rh   r   ZPositionAttachCursiveDefinition)r"   r?   Zcoverages_exitZcoverages_enterr€   r$   r$   r%   r}   p  s    


zParser.parse_attach_cursive_c             C   sÞ   |   d¡st‚| j}g }g }i }x(| jdkrH|  ¡  |  ¡ }| |¡ q"W x(| jdkrr|  ¡  |  ¡ }| |¡ qLW xH| jdkr¼|  ¡ }|  ¡ }|  d¡ |  	¡ }	|  	¡ }
|	|
f|||f< qvW |  d¡ t
j||||d}|S )Nrz   ZFIRSTZSECONDÚ
END_ADJUSTÚBY)r?   )r6   r@   r9   r   r!   rh   r5   rC   rB   Ú
parse_pos_r   ZPositionAdjustPairDefinition)r"   r?   Zcoverages_1Zcoverages_2Zadjust_pairZ
coverage_1Z
coverage_2Zid_1Zid_2Zpos_1Zpos_2r€   r$   r$   r%   r~   €  s0    

zParser.parse_adjust_pair_c             C   sl   |   d¡st‚| j}g }x6| jdkrN|  ¡ }|  d¡ |  ¡ }| ||f¡ qW |  d¡ tj	||d}|S )Nr{   r„   r…   )r?   )
r6   r@   r9   r   rh   rB   r†   r5   r   ZPositionAdjustSingleDefinition)r"   r?   Zadjust_singleZ	coveragesrf   r€   r$   r$   r%   r   š  s    


zParser.parse_adjust_single_c       	   	   C   s  |   d¡st‚| j}|  ¡ }|  d¡ |  ¡ }|  d¡ |  ¡ }|  d¡ |  ¡ }|| jkrŒ| j|  |¡}|d k	rŒ|j	|krŒt
d| |ƒ‚| jdkr¤d}|  ¡  nd}|  d	¡ |  ¡ }|  d
¡ tj|||||||d}|| jkròtƒ | j|< | j|  ||¡ |S )Nr   ZONÚGLYPHr>   z>Anchor "%s" already defined, anchor names are case insensitiveZLOCKEDTFrƒ   Z
END_ANCHOR)r?   )r6   r@   r9   rA   rB   rC   rE   r   rF   Ú	componentr   r   r!   r†   r   ZAnchorDefinitionr   rG   )	r"   r?   r(   rH   Z
glyph_namerˆ   ZanchorÚlockedrf   r$   r$   r%   r	   ¨  s<    









zParser.parse_def_anchor_c             C   s8   |   ¡  |  d¡st‚|  ¡ }|  d¡ |  ¡ }||fS )NÚ	ADJUST_BYrƒ   )r!   r6   r@   rC   rB   )r"   Ú
adjustmentÚsizer$   r$   r%   Úparse_adjust_by_Ë  s    
zParser.parse_adjust_by_c       
      C   s  |   ¡  | j}|  d¡s t|ƒ‚d }d }d }i }i }i }| jdkrv|   ¡  |  ¡ }x"| jdkrt|  ¡ \}}	|||	< qTW | jdkr´|   ¡  |  ¡ }x"| jdkr²|  ¡ \}}	|||	< q’W | jdkrò|   ¡  |  ¡ }x"| jdkrð|  ¡ \}}	|||	< qÐW |  d¡ t 	||||||¡S )NZPOSZADVrŠ   ZDXZDYZEND_POS)
r!   r9   r6   r@   r   rC   r   rB   r   ZPos)
r"   r?   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   sh   | j }y |  ¡  d¡}dd„ |D ƒ}W n0 tk
rV } ztt|ƒ|ƒ‚W d d }~X Y nX |g krd|S d S )Nú,c             S   s&   g | ]}|d krt |dd… dƒ‘qS )Ú é   Né   )Úint)rm   Zunir$   r$   r%   ro   ø  s   z0Parser.parse_unicode_values_.<locals>.<listcomp>)r9   rA   ÚsplitÚ
ValueErrorr   Ústr)r"   r?   Zunicode_valuesÚerrr$   r$   r%   rD   ó  s     zParser.parse_unicode_values_c             C   s0   |   d¡ | j}tj|  ¡ |d}|   d¡ |S )NrI   )r?   ZEND_ENUM)rB   r9   r   ÚEnumrh   )r"   r?   rK   r$   r$   r%   rJ   þ  s
    

zParser.parse_enum_c             C   sì   g }| j }xØ| jdkrâ| jdkr4|  ¡ }| |¡ q| jdkrf|  d¡ |  ¡ }| tj||d¡ q| jdkrš|  d¡ |  ¡ }| tj|| |d¡ q| jdkr|  d¡ |  ¡ }|  d¡ |  ¡ }| tj	||| |d¡ qW t
|ƒS )N)r‡   ÚGROUPÚRANGErI   rI   r‡   )r?   r˜   r™   r   )r9   r   rJ   r5   rB   rA   r   Z	GlyphNameZ	GroupNameZRangert   )r"   ri   r?   rK   r(   ÚstartÚendr$   r$   r%   rh     s*    







zParser.parse_coverage_c             C   s   | j  |¡S )N)r   rF   )r"   Z
group_namer$   r$   r%   Úresolve_group  s    zParser.resolve_groupc             C   s   | j  ||¡S )N)r   Úrange)r"   rš   r›   r$   r$   r%   Úglyph_range  s    zParser.glyph_rangec             C   s(   | j }| j}|  ¡ }tj|||d}|S )N)r?   )r9   r2   rC   r   ÚSettingDefinition)r"   r?   Z	ppem_nameÚvalueÚsettingr$   r$   r%   r
   "  s
    zParser.parse_ppem_c             C   s$   | j }| j}d}tj|||d}|S )NT)r?   )r9   r2   r   rŸ   )r"   r?   r(   r    r¡   r$   r$   r%   r   )  s
    zParser.parse_noarg_option_c             C   s6   | j }| j}|  ¡ |  ¡ |  ¡ f}tj|||d}|S )N)r?   )r9   r2   rC   r   rŸ   )r"   r?   r(   r    r¡   r$   r$   r%   r   0  s    
zParser.parse_cmap_formatc             C   s   | j tjko| j|kS )N)Úcur_token_type_r   rL   r2   )r"   Úkr$   r$   r%   r6   8  s    zParser.is_cur_keyword_c             C   s&   |   ¡  | jtjk	r td| jƒ‚| jS )NzExpected a string)r!   r¢   r   r]   r   r9   r2   )r"   r$   r$   r%   rA   ;  s    zParser.expect_string_c             C   s8   |   ¡  | jtjkr$| j|kr$| jS td| | jƒ‚d S )NzExpected "%s")r!   r¢   r   rL   r2   r   r9   )r"   Úkeywordr$   r$   r%   rB   A  s
    zParser.expect_keyword_c             C   s*   |   ¡  | jtjkr| jS td| jƒ‚d S )NzExpected a name)r!   r¢   r   rL   r2   r   r9   )r"   r$   r$   r%   rE   H  s    zParser.expect_name_c             C   s&   |   ¡  | jtjk	r td| jƒ‚| jS )NzExpected a number)r!   r¢   r   ÚNUMBERr   r9   r2   )r"   r$   r$   r%   rC   N  s    zParser.expect_number_c             C   sj   | j | j| j  | _| _| _y(|  d¡r,t‚| j 	¡ \| _ | _| _W n  tk
rd   d\| _ | _Y nX d S )Nr0   )NN)
r   r   r   r¢   r2   r9   r6   ÚStopIterationr,   Únext)r"   r$   r$   r%   r!   T  s    
zParser.advance_lexer_N)$Ú__name__Ú
__module__Ú__qualname__r&   r    r;   r   r   r   rP   rT   r   r_   r`   ra   r|   r}   r~   r   r	   r   r†   rD   rJ   rh   rœ   rž   r
   r   r   r6   rA   rB   rE   rC   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 )N)Úscopes_)r"   r$   r$   r%   r&   a  s    zSymbolTable.__init__c             C   s   | j  i ¡ d S )N)r«   r5   )r"   r$   r$   r%   rO   d  s    zSymbolTable.enter_scopec             C   s   | j  ¡  d S )N)r«   Úpop)r"   r$   r$   r%   rR   g  s    zSymbolTable.exit_scopec             C   s   || j d |< d S )Néÿÿÿÿ)r«   )r"   r(   Úitemr$   r$   r%   rG   j  s    zSymbolTable.defineTc             C   sT   x$t | jƒD ]}| |¡}|r|S qW |rPx$|D ]}| ¡ | ¡ kr0|| S q0W d S )N)Úreversedr«   ÚgetÚlower)r"   r(   Úcase_insensitiveÚscoper®   Úkeyr$   r$   r%   rF   m  s    

zSymbolTable.resolveN)T)r¨   r©   rª   r&   rO   rR   rG   rF   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 )N)r«   )r"   r$   r$   r%   r&   z  s    zOrderedSymbolTable.__init__c             C   s   | j  i ¡ d S )N)r«   r5   )r"   r$   r$   r%   rO   }  s    zOrderedSymbolTable.enter_scopeFc             C   s   t j| ||d d S )N)r²   )r   rF   )r"   r(   r²   r$   r$   r%   rF   €  s    zOrderedSymbolTable.resolvec             C   sd   x^t | jƒD ]P}||kr||krt| ¡ ƒ |¡}t| ¡ ƒ |¡}t| ¡ ƒ||d … S qW d S )Nrp   )r¯   r«   Úlistr4   Úindex)r"   rš   r›   r³   Z	start_idxZend_idxr$   r$   r%   r   ƒ  s    zOrderedSymbolTable.rangeN)F)r¨   r©   rª   r&   rO   rF   r   r$   r$   r$   r%   r   y  s   
r   )ZfontTools.voltLib.astZvoltLibr   ZfontTools.voltLib.lexerr   ZfontTools.voltLib.errorr   Úior   r3   Úobjectr   r   r   r$   r$   r$   r%   Ú<module>   s,       N