B
    Scw3  ใ               @   sฬ  d dl mZ d dlmZ G dd deZG dd deZG dd deZG d	d
 d
eZG dd deZ	G dd deZ
G dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd  d eZG d!d" d"eZG d#d$ d$eZG d%d& d&eZG d'd( d(eZG d)d* d*eZG d+d, d,eZG d-d. d.eZG d/d0 d0eZG d1d2 d2eZG d3d4 d4eZG d5d6 d6eZG d7d8 d8eZd9S ):้    )ฺVoltLibError)ฺ
NamedTuplec               @   sF   e Zd ZU eed< eed< eed< eed< eed< eed< dd Zd	S )
ฺPosฺadvฺdxฺdyZadv_adjust_byZdx_adjust_byZdy_adjust_byc             C   s   d}xrdD ]j}t | |}|d k	r
|d| ก  d| 7 }t | | di }x(| ก D ]\}}|d| d| 7 }qTW q
W |d7 }|S )Nz POS)r   r   r   ๚ Z
_adjust_byz ADJUST_BY z AT z END_POS)ฺgetattrฺupperฺitems)ฺselfฺresฺattrฺvalueZ	adjust_byฺsizeZ
adjustmentฉ r   ๚4lib/python3.7/site-packages/fontTools/voltLib/ast.pyฺ__str__   s    

zPos.__str__N)ฺ__name__ฺ
__module__ฺ__qualname__ฺintฺ__annotations__ฺdictr   r   r   r   r   r      s   
r   c               @   s&   e Zd ZdddZdd Zdd ZdS )	ฺElementNc             C   s
   || _ d S )N)ฺlocation)r   r   r   r   r   ฺ__init__   s    zElement.__init__c             C   s   d S )Nr   )r   ฺbuilderr   r   r   ฺbuild   s    zElement.buildc             C   s   t d S )N)ฺNotImplementedError)r   r   r   r   r   !   s    zElement.__str__)N)r   r   r   r   r   r   r   r   r   r   r      s   
r   c               @   s   e Zd ZdS )ฺ	StatementN)r   r   r   r   r   r   r   r    %   s   r    c               @   s   e Zd ZdS )ฺ
ExpressionN)r   r   r   r   r   r   r   r!   )   s   r!   c               @   s$   e Zd Zdd Zdd Zdd ZdS )ฺVoltFilec             C   s   t j| d d g | _d S )N)r   )r    r   ฺ
statements)r   r   r   r   r   .   s    zVoltFile.__init__c             C   s   x| j D ]}| |ก qW d S )N)r#   r   )r   r   ฺsr   r   r   r   2   s    zVoltFile.buildc             C   s   dd  dd | jD ก d S )Nฺ
c             s   s   | ]}t |V  qd S )N)ฺstr)ฺ.0r$   r   r   r   ๚	<genexpr>7   s    z#VoltFile.__str__.<locals>.<genexpr>z END
)ฺjoinr#   )r   r   r   r   r   6   s    zVoltFile.__str__N)r   r   r   r   r   r   r   r   r   r   r"   -   s   r"   c               @   s   e Zd ZdddZdd ZdS )ฺGlyphDefinitionNc             C   s.   t  | |ก || _|| _|| _|| _|| _d S )N)r    r   ฺnameฺidฺunicodeฺtypeฺ
components)r   r+   ฺgidZgunicodeZgtyper/   r   r   r   r   r   ;   s    zGlyphDefinition.__init__c             C   sจ   d| j  d| j }| jd k	rht| jdkrTd dd | jD ก}|d| d7 }n|d	| jd
  7 }| jd k	r|d| j 7 }| jd k	r|d| j 7 }|d7 }|S )NzDEF_GLYPH "z" ID ้   ๚,c             s   s   | ]}d |dV  qdS )zU+Z04XNr   )r'   ฺur   r   r   r(   G   s    z*GlyphDefinition.__str__.<locals>.<genexpr>z UNICODEVALUES "๚"z	 UNICODE r   z TYPE z COMPONENTS z
 END_GLYPH)r+   r,   r-   ฺlenr)   r.   r/   )r   r   Zunicodesr   r   r   r   C   s    


zGlyphDefinition.__str__)N)r   r   r   r   r   r   r   r   r   r*   :   s   
r*   c               @   s(   e Zd ZdddZd	ddZdd ZdS )
ฺGroupDefinitionNc             C   s"   t  | |ก || _|| _d | _d S )N)r    r   r+   ฺenumฺglyphs_)r   r+   r7   r   r   r   r   r   T   s    zGroupDefinition.__init__c             C   sd   |d k	r$| j |kr$td| j  | j| jd kr^|d krDt| j h}n| | j ก | j |ก| _| jS )NzGroup "%s" contains itself.)r+   r   r   r8   ฺsetฺaddr7   ฺglyphSet)r   ฺgroupsr   r   r   r;   Z   s    
zGroupDefinition.glyphSetc             C   s(   | j rt| j pd}d| j d| dS )Nฺ zDEF_GROUP "z"
z

END_GROUP)r7   r&   r+   )r   r7   r   r   r   r   g   s    zGroupDefinition.__str__)N)N)r   r   r   r   r;   r   r   r   r   r   r6   S   s   

r6   c               @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
ฺ	GlyphNamez%A single glyph name, such as cedilla.Nc             C   s   t  | |ก || _d S )N)r!   r   ฺglyph)r   r?   r   r   r   r   r   n   s    zGlyphName.__init__c             C   s   | j fS )N)r?   )r   r   r   r   r;   r   s    zGlyphName.glyphSetc             C   s   d| j  dS )Nz GLYPH "r4   )r?   )r   r   r   r   r   u   s    zGlyphName.__str__)N)r   r   r   ฺ__doc__r   r;   r   r   r   r   r   r>   l   s   
r>   c               @   s4   e Zd ZdZdddZdd ZdddZd	d
 ZdS )ฺEnumzAn enumNc             C   s   t  | |ก || _d S )N)r!   r   r7   )r   r7   r   r   r   r   r   {   s    zEnum.__init__c             c   s   x|   ก D ]
}|V  q
W d S )N)r;   )r   ฺer   r   r   ฺ__iter__   s    zEnum.__iter__c             C   sJ   g }x<| j D ]2}t|ttfr0| | |กก q| | ก ก qW t|S )N)r7   ฺ
isinstanceฺ	GroupNamerA   ฺextendr;   ฺtuple)r   r<   Zglyphsฺelementr   r   r   r;      s    zEnum.glyphSetc             C   s"   d  dd | jD ก}d| dS )Nr=   c             s   s   | ]}t |V  qd S )N)r&   )r'   rB   r   r   r   r(      s    zEnum.__str__.<locals>.<genexpr>z ENUMz	 END_ENUM)r)   r7   )r   r7   r   r   r   r      s    zEnum.__str__)N)N)r   r   r   r@   r   rC   r;   r   r   r   r   r   rA   y   s
   

	rA   c               @   s,   e Zd ZdZd	ddZd
ddZdd ZdS )rE   zA glyph groupNc             C   s   t  | |ก || _|| _d S )N)r!   r   ฺgroupฺparser_)r   rI   ฺparserr   r   r   r   r      s    zGroupName.__init__c             C   s>   | j  | jก}|d k	r(| |ก| _| jS td| j | jd S )Nz!Group "%s" is used but undefined.)rJ   Zresolve_grouprI   r;   r8   r   r   )r   r<   rI   r   r   r   r;      s    zGroupName.glyphSetc             C   s   d| j  dS )Nz GROUP "r4   )rI   )r   r   r   r   r   ข   s    zGroupName.__str__)N)N)r   r   r   r@   r   r;   r   r   r   r   r   rE      s   


rE   c               @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
ฺRangezA glyph rangeNc             C   s"   t  | |ก || _|| _|| _d S )N)r!   r   ฺstartฺendrK   )r   rM   rN   rK   r   r   r   r   r   จ   s    zRange.__init__c             C   s   t | j | j| jกS )N)rG   rK   Zglyph_rangerM   rN   )r   r   r   r   r;   ฎ   s    zRange.glyphSetc             C   s   d| j  d| j dS )Nz RANGE "z" TO "r4   )rM   rN   )r   r   r   r   r   ฑ   s    zRange.__str__)N)r   r   r   r@   r   r;   r   r   r   r   r   rL   ฆ   s   
rL   c               @   s   e Zd ZdddZdd ZdS )ฺScriptDefinitionNc             C   s"   t  | |ก || _|| _|| _d S )N)r    r   r+   ฺtagฺlangs)r   r+   rP   rQ   r   r   r   r   r   ถ   s    zScriptDefinition.__init__c             C   sX   d}| j d k	r |d| j  d7 }|d| j d7 }x| jD ]}|| 7 }q:W |d7 }|S )NZ
DEF_SCRIPTz NAME "r4   z TAG "z"

Z
END_SCRIPT)r+   rP   rQ   )r   r   Zlangr   r   r   r   ผ   s    
zScriptDefinition.__str__)N)r   r   r   r   r   r   r   r   r   rO   ต   s   
rO   c               @   s   e Zd ZdddZdd ZdS )ฺLangSysDefinitionNc             C   s"   t  | |ก || _|| _|| _d S )N)r    r   r+   rP   ฺfeatures)r   r+   rP   rS   r   r   r   r   r   ศ   s    zLangSysDefinition.__init__c             C   sX   d}| j d k	r |d| j  d7 }|d| j d7 }x| jD ]}|| 7 }q:W |d7 }|S )NZDEF_LANGSYSz NAME "r4   z TAG "z"

zEND_LANGSYS
)r+   rP   rS   )r   r   Zfeaturer   r   r   r   ฮ   s    
zLangSysDefinition.__str__)N)r   r   r   r   r   r   r   r   r   rR   ว   s   
rR   c               @   s   e Zd ZdddZdd ZdS )ฺFeatureDefinitionNc             C   s"   t  | |ก || _|| _|| _d S )N)r    r   r+   rP   ฺlookups)r   r+   rP   rU   r   r   r   r   r   ฺ   s    zFeatureDefinition.__init__c             C   sD   d| j  d| j d}|dd dd | jD ก d 7 }|d7 }|S )	NzDEF_FEATURE NAME "z" TAG "z"
r   c             s   s   | ]}d | dV  qdS )zLOOKUP "r4   Nr   )r'   ฺlr   r   r   r(   โ   s    z,FeatureDefinition.__str__.<locals>.<genexpr>r%   zEND_FEATURE
)r+   rP   r)   rU   )r   r   r   r   r   r   เ   s    "zFeatureDefinition.__str__)N)r   r   r   r   r   r   r   r   r   rT   ู   s   
rT   c               @   s   e Zd ZdddZdd ZdS )ฺLookupDefinitionNc             C   sL   t  | |ก || _|| _|| _|| _|| _|| _|| _|| _	|	| _
|
| _d S )N)r    r   r+   ฺprocess_baseฺprocess_marksฺmark_glyph_setฺ	directionฺreversalฺcommentsฺcontextฺsubฺpos)r   r+   rX   rY   rZ   r[   r\   r]   r^   r_   r`   r   r   r   r   r   ่   s    zLookupDefinition.__init__c             C   s2  d| j  d}|d| jrdpd 7 }| jrx|d7 }| jrN|d| j d7 }qt| jtrn|d| j d7 }q|d7 }n|d	7 }| jd k	r|d
| j 7 }| jrจ|d7 }| jd k	rะ| j 	ddก}|d| d7 }| j
r๖|dd dd | j
D ก 7 }n|d7 }| jr|d| j 7 }| jr.|d| j 7 }|S )NzDEF_LOOKUP "r4   r   ZPROCESS_BASEZ	SKIP_BASEz PROCESS_MARKS zMARK_GLYPH_SET "ZALLz SKIP_MARKSz DIRECTION z	 REVERSALr%   z\nz
COMMENTS "c             s   s   | ]}t |V  qd S )N)r&   )r'   ฺcr   r   r   r(     s    z+LookupDefinition.__str__.<locals>.<genexpr>z
IN_CONTEXT
END_CONTEXT)r+   rX   rY   rZ   rD   r&   r[   r\   r]   ฺreplacer^   r)   r_   r`   )r   r   r]   r   r   r   r   ๗   s2    


 zLookupDefinition.__str__)N)r   r   r   r   r   r   r   r   r   rW   ็   s   
rW   c               @   s   e Zd ZdddZdd ZdS )ฺSubstitutionDefinitionNc             C   s   t  | |ก || _d S )N)r    r   ฺmapping)r   rd   r   r   r   r   r     s    zSubstitutionDefinition.__init__c             C   sf   d}xT| j  ก D ]F\}}d dd |D ก}d dd |D ก}|d| d| d7 }qW |d	7 }|S )
NzAS_SUBSTITUTION
r=   c             s   s   | ]}t |V  qd S )N)r&   )r'   r$   r   r   r   r(     s    z1SubstitutionDefinition.__str__.<locals>.<genexpr>c             s   s   | ]}t |V  qd S )N)r&   )r'   ฺdr   r   r   r(     s    ZSUBz
WITHz	
END_SUB
ZEND_SUBSTITUTION)rd   r   r)   )r   r   ฺsrcฺdstr   r   r   r     s    zSubstitutionDefinition.__str__)N)r   r   r   r   r   r   r   r   r   rc     s   
rc   c               @   s   e Zd ZdS )ฺSubstitutionSingleDefinitionN)r   r   r   r   r   r   r   rh   %  s   rh   c               @   s   e Zd ZdS )ฺSubstitutionMultipleDefinitionN)r   r   r   r   r   r   r   ri   )  s   ri   c               @   s   e Zd ZdS )ฺSubstitutionLigatureDefinitionN)r   r   r   r   r   r   r   rj   -  s   rj   c               @   s   e Zd ZdS )ฺ+SubstitutionReverseChainingSingleDefinitionN)r   r   r   r   r   r   r   rk   1  s   rk   c               @   s   e Zd ZdddZdd ZdS )ฺPositionAttachDefinitionNc             C   s   t  | |ก || _|| _d S )N)r    r   ฺcoverageฺcoverage_to)r   rm   rn   r   r   r   r   r   6  s    z!PositionAttachDefinition.__init__c             C   sj   d  dd | jD ก}d| d}x:| jD ]0\}}d  dd |D ก}|| d| d7 }q*W |d	7 }|S )
Nr=   c             s   s   | ]}t |V  qd S )N)r&   )r'   ra   r   r   r   r(   <  s    z3PositionAttachDefinition.__str__.<locals>.<genexpr>zAS_POSITION
ATTACHz
TOc             s   s   | ]}t |V  qd S )N)r&   )r'   ra   r   r   r   r(   ?  s    z AT ANCHOR "r4   z
END_ATTACH
END_POSITION)r)   rm   rn   )r   rm   r   Zanchorr   r   r   r   ;  s    z PositionAttachDefinition.__str__)N)r   r   r   r   r   r   r   r   r   rl   5  s   
rl   c               @   s   e Zd ZdddZdd ZdS )ฺPositionAttachCursiveDefinitionNc             C   s   t  | |ก || _|| _d S )N)r    r   ฺcoverages_exitฺcoverages_enter)r   rp   rq   r   r   r   r   r   F  s    z(PositionAttachCursiveDefinition.__init__c             C   st   d}x0| j D ]&}d dd |D ก}|d| 7 }qW x0| jD ]&}d dd |D ก}|d| 7 }q>W |d7 }|S )	NzAS_POSITION
ATTACH_CURSIVEr=   c             s   s   | ]}t |V  qd S )N)r&   )r'   ra   r   r   r   r(   N  s    z:PositionAttachCursiveDefinition.__str__.<locals>.<genexpr>z
EXIT c             s   s   | ]}t |V  qd S )N)r&   )r'   ra   r   r   r   r(   Q  s    z
ENTER z
END_ATTACH
END_POSITION)rp   r)   rq   )r   r   rm   r   r   r   r   K  s    z'PositionAttachCursiveDefinition.__str__)N)r   r   r   r   r   r   r   r   r   ro   E  s   
ro   c               @   s   e Zd ZdddZdd ZdS )ฺPositionAdjustPairDefinitionNc             C   s"   t  | |ก || _|| _|| _d S )N)r    r   ฺcoverages_1ฺcoverages_2ฺadjust_pair)r   rs   rt   ru   r   r   r   r   r   X  s    z%PositionAdjustPairDefinition.__init__c          
   C   sฤ   d}x0| j D ]&}d dd |D ก}|d| 7 }qW |d7 }x0| jD ]&}d dd |D ก}|d| 7 }qFW |d7 }x>| j ก D ]0\\}}\}}|d| d| d	| | d7 }qW |d
7 }|S )NzAS_POSITION
ADJUST_PAIR
r   c             s   s   | ]}t |V  qd S )N)r&   )r'   ra   r   r   r   r(   a  s    z7PositionAdjustPairDefinition.__str__.<locals>.<genexpr>z FIRST r%   c             s   s   | ]}t |V  qd S )N)r&   )r'   ra   r   r   r   r(   e  s    z SECOND z BYz
END_ADJUST
END_POSITION)rs   r)   rt   ru   r   )r   r   rm   Zid_1Zid_2Zpos_1Zpos_2r   r   r   r   ^  s    $z$PositionAdjustPairDefinition.__str__)N)r   r   r   r   r   r   r   r   r   rr   W  s   
rr   c               @   s   e Zd ZdddZdd ZdS )ฺPositionAdjustSingleDefinitionNc             C   s   t  | |ก || _d S )N)r    r   ฺadjust_single)r   rw   r   r   r   r   r   o  s    z'PositionAdjustSingleDefinition.__init__c             C   sJ   d}x8| j D ].\}}d dd |D ก}|| d| 7 }qW |d7 }|S )NzAS_POSITION
ADJUST_SINGLEr=   c             s   s   | ]}t |V  qd S )N)r&   )r'   ra   r   r   r   r(   v  s    z9PositionAdjustSingleDefinition.__str__.<locals>.<genexpr>z BYz
END_ADJUST
END_POSITION)rw   r)   )r   r   rm   r`   r   r   r   r   s  s    z&PositionAdjustSingleDefinition.__str__)N)r   r   r   r   r   r   r   r   r   rv   n  s   
rv   c               @   s   e Zd ZdddZdd ZdS )ฺContextDefinitionNc             C   s:   t  | |ก || _|d k	r|ng | _|d k	r0|ng | _d S )N)r    r   ฺex_or_inฺleftฺright)r   ry   rz   r{   r   r   r   r   r   ~  s    zContextDefinition.__init__c             C   s~   | j d }x2| jD ](}d dd |D ก}|d| d7 }qW x2| jD ](}d dd |D ก}|d| d7 }qFW |d7 }|S )	Nr%   r=   c             s   s   | ]}t |V  qd S )N)r&   )r'   ra   r   r   r   r(     s    z,ContextDefinition.__str__.<locals>.<genexpr>z LEFTc             s   s   | ]}t |V  qd S )N)r&   )r'   ra   r   r   r   r(     s    z RIGHTZEND_CONTEXT)ry   rz   r)   r{   )r   r   rm   r   r   r   r     s    
zContextDefinition.__str__)NNN)r   r   r   r   r   r   r   r   r   rx   }  s   
rx   c               @   s   e Zd ZdddZdd ZdS )ฺAnchorDefinitionNc             C   s4   t  | |ก || _|| _|| _|| _|| _|| _d S )N)r    r   r+   r0   ฺ
glyph_nameฺ	componentฺlockedr`   )r   r+   r0   r}   r~   r   r`   r   r   r   r   r     s    zAnchorDefinition.__init__c             C   s@   | j r
dpd}d| j d| j d| j d| j | d| j dS )	Nz LOCKEDr=   zDEF_ANCHOR "z" ON z GLYPH z COMPONENT z AT z END_ANCHOR)r   r+   r0   r}   r~   r`   )r   r   r   r   r   r     s    zAnchorDefinition.__str__)N)r   r   r   r   r   r   r   r   r   r|     s   
	r|   c               @   s   e Zd ZdddZdd ZdS )ฺSettingDefinitionNc             C   s   t  | |ก || _|| _d S )N)r    r   r+   r   )r   r+   r   r   r   r   r   r   ฆ  s    zSettingDefinition.__init__c             C   sZ   | j dkr| j S t| j ttfrHd dd | j D ก}| j d| S | j d| j  S )NTr   c             s   s   | ]}t |V  qd S )N)r&   )r'   ฺvr   r   r   r(   ฏ  s    z,SettingDefinition.__str__.<locals>.<genexpr>)r   r+   rD   rG   ฺlistr)   )r   r   r   r   r   r   ซ  s    
zSettingDefinition.__str__)N)r   r   r   r   r   r   r   r   r   r   ฅ  s   
r   N) ZfontTools.voltLib.errorr   ฺtypingr   r   ฺobjectr   r    r!   r"   r*   r6   r>   rA   rE   rL   rO   rR   rT   rW   rc   rh   ri   rj   rk   rl   ro   rr   rv   rx   r|   r   r   r   r   r   ฺ<module>   s8   /