U
    Dvf1o  ã                   @   sÀ   d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	 ddl
mZ ddlmZ e d¡Zdd	d
gZG dd„ dejƒZG dd„ dƒZG dd„ dƒZddd„Zedkr¼ddlZe eƒ ¡ dS )u  MS VOLT ``.vtp`` to AFDKO ``.fea`` OpenType Layout converter.

Usage
-----

To convert a VTP project file:


    $ fonttools voltLib.voltToFea input.vtp output.fea

It is also possible convert font files with `TSIV` table (as saved from Volt),
in this case the glyph names used in the Volt project will be mapped to the
actual glyph names in the font files when written to the feature file:

    $ fonttools voltLib.voltToFea input.ttf output.fea

The ``--quiet`` option can be used to suppress warnings.

The ``--traceback`` can be used to get Python traceback in case of exceptions,
instead of suppressing the traceback.


Limitations
-----------

* Not all VOLT features are supported, the script will error if it it
  encounters something it does not understand. Please report an issue if this
  happens.
* AFDKO feature file syntax for mark positioning is awkward and does not allow
  setting the mark coverage. It also defines mark anchors globally, as a result
  some mark positioning lookups might cover many marks than what was in the VOLT
  file. This should not be an issue in practice, but if it is then the only way
  is to modify the VOLT file or the generated feature file manually to use unique
  mark anchors for each lookup.
* VOLT allows subtable breaks in any lookup type, but AFDKO feature file
  implementations vary in their support; currently AFDKOâ€™s makeOTF supports
  subtable breaks in pair positioning lookups only, while FontToolsâ€™ feaLib
  support it for most substitution lookups and only some positioning lookups.
é    N)ÚStringIO)Úast)ÚTTFontÚ
TTLibError)ÚParserzfontTools.voltLib.voltToFeaÚGDEFÚGSUBÚGPOSc                   @   s   e Zd Zddd„ZdS )ÚMarkClassDefinitionÚ c                 C   s.   d}t | ddƒs|d7 }|tj | |¡7 }|S )Nr   ÚusedFú#)Úgetattrr   r
   ÚasFea)ÚselfÚindentÚres© r   ú?/tmp/pip-unpacked-wheel-qlge9rch/fontTools/voltLib/voltToFea.pyr   9   s
    zMarkClassDefinition.asFeaN)r   )Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r
   8   s   r
   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚGroupc                 C   s$   |j  ¡ | _ dd„ |jjD ƒ| _d S )Nc                 S   s"   g | ]}t |tjƒr|j ¡ ‘qS r   )Ú
isinstanceÚVAstÚ	GroupNameÚgroupÚlower)Ú.0Úxr   r   r   Ú
<listcomp>E   s     z"Group.__init__.<locals>.<listcomp>)Únamer   ÚenumÚgroups)r   r   r   r   r   Ú__init__C   s    ÿzGroup.__init__c                 C   sD   | j |jkrdS |j | jkr dS | jr0|js0dS | js@|jr@dS d S )NTF)r!   r#   )r   Úotherr   r   r   Ú__lt__I   s    zGroup.__lt__N)r   r   r   r$   r&   r   r   r   r   r   B   s   r   c                   @   sÔ   e Zd Ze d¡Ze d¡Zd0dd„Zdd„ Zdd	„ Z	d
d„ Z
dd„ Zd1d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S )2Ú	VoltToFeaz[^A-Za-z_0-9.]z[^A-Za-z_0-9.\-]Nc                 C   s`   || _ || _i | _d | _i | _i | _i | _i | _tƒ | _	i | _
i | _i | _i | _i | _i | _d S ©N)Ú_file_or_pathÚ_fontÚ
_glyph_mapÚ_glyph_orderÚ_gdefÚ_glyphclassesÚ	_featuresÚ_lookupsÚsetÚ_marksÚ
_ligaturesÚ_markclassesÚ_anchorsÚ	_settingsÚ_lookup_namesÚ_class_names)r   Úfile_or_pathÚfontr   r   r   r$   X   s    zVoltToFea.__init__c                 C   sD   || j kr:| j d|¡}|| j  ¡ kr0|d7 }q|| j |< | j | S ©NÚ_)r7   Ú_NOT_LOOKUP_NAME_REÚsubÚvalues©r   r!   r   r   r   r   Ú_lookupNameo   s    


zVoltToFea._lookupNamec                 C   sD   || j kr:| j d|¡}|| j  ¡ kr0|d7 }q|| j |< | j | S r;   )r8   Ú_NOT_CLASS_NAME_REr>   r?   r@   r   r   r   Ú
_classNamew   s    


zVoltToFea._classNamec                 C   s  dd„ |j D ƒ}t|dd„ dD ]}|  |¡ q |j D ]Ž}t|tjƒrR|  |¡ q6t|tjƒrrd|krÄ|  |¡ q6t|tj	ƒrŠ|  
|¡ q6t|tjƒr˜q6t|tjƒr°|  |¡ q6t|tjƒs6t|ƒ‚q6|j D ]:}t|tjƒrÌ|jrìd|krìqÌ|jrüd|krüqÌ|  |¡ qÌd S )Nc                 S   s   g | ]}t |tjƒr|‘qS r   )r   r   ÚGroupDefinition)r   Úsr   r   r   r    ƒ   s      z0VoltToFea._collectStatements.<locals>.<listcomp>c                 S   s   t | ƒS r(   )r   )r   r   r   r   Ú<lambda>„   ó    z.VoltToFea._collectStatements.<locals>.<lambda>©Úkeyr	   r   )Ú
statementsÚsortedÚ_groupDefinitionr   r   ZGlyphDefinitionÚ_glyphDefinitionZAnchorDefinitionÚ_anchorDefinitionZSettingDefinitionÚ_settingDefinitionrD   ZScriptDefinitionÚ_scriptDefinitionZLookupDefinitionÚNotImplementedErrorÚposr>   Ú_lookupDefinition)r   ÚdocÚtablesr#   Ú	statementr   r   r   Ú_collectStatements   s0    


zVoltToFea._collectStatementsc              	      sÂ  t  ¡ }|j}ˆ jr4| t  d¡¡ | ˆ j ¡ ¡ ˆ jrh| t  d¡¡ | dd„ t	ˆ j 
¡ ƒD ƒ¡ ˆ jrª| t  d¡¡ ˆ j ¡ D ] }| t|dg ƒ¡ | |¡ qˆˆ j ¡ }|D ]n}|| }|D ]F}|| }	|	D ]}
‡ fdd„|	|
 D ƒ|	|
< qØd	d
„ |	 
¡ D ƒ||< qÈdd
„ | 
¡ D ƒ||< q¸dd
„ | 
¡ D ƒ}|r&| t  d¡¡ | 
¡ D ]Ì\}}t  |¡}t	|dd„ d}|D ]˜}|j t  |¡¡ t	|| dd„ d}|D ]f}
|
dkr¾dnd}|j t j|
|d¡ || |
 D ]*}ˆ j| ¡  }t  |¡}|j |¡ qäq¬q~| |¡ qXˆ jr¾d|kr¾g }dD ]V}|ˆ jkrŠd| ¡  }t  |ˆ j| ¡}| |¡ | t  |¡¡ n
| d ¡ q@t  d¡}|j t j|Ž ¡ | |¡ |S )Nz# Glyph classesz
# Mark classesc                 s   s   | ]}|d  V  qdS )é   Nr   )r   Úcr   r   r   Ú	<genexpr>ª   s     z.VoltToFea._buildFeatureFile.<locals>.<genexpr>z

# LookupsÚtargetsc                    s   g | ]}|  ¡ ˆ jkr|‘qS r   )r   r0   ©r   Úl©r   r   r   r    ¹   s      z/VoltToFea._buildFeatureFile.<locals>.<listcomp>c                 S   s   i | ]\}}|r||“qS r   r   )r   Útr]   r   r   r   Ú
<dictcomp>º   s       z/VoltToFea._buildFeatureFile.<locals>.<dictcomp>c                 S   s   i | ]\}}|r||“qS r   r   )r   r_   rE   r   r   r   r`   »   s       c                 S   s   i | ]\}}|r||“qS r   r   )r   r_   Úfr   r   r   r`   ¼   s       z
# Featuresc                 S   s   | dkrdS dS )NZDFLTr   rX   r   ©Úkr   r   r   rF   Â   rG   z-VoltToFea._buildFeatureFile.<locals>.<lambda>rH   c                 S   s   | dkrdS dS )NÚdfltr   rX   r   rb   r   r   r   rF   Å   rG   rd   TF)Úinclude_defaultr   ©ZBASEÚMARKÚLIGATUREZ	COMPONENTZGDEF_)r   ZFeatureFilerJ   r.   ÚappendÚCommentÚextendr?   r4   rK   Úitemsr0   r   r/   ÚcopyZFeatureBlockZScriptStatementZLanguageStatementr   ZLookupReferenceStatementr-   ÚGlyphClassDefinitionÚGlyphClassNameZ
TableBlockZGlyphClassDefStatement)r   rU   rT   rJ   ÚlookupÚfeaturesÚftagÚscriptsÚstagÚlangsÚltagÚfeatureZstagsZltagsre   r!   Z	lookuprefÚclassesÚ	classnameÚ
glyphclassZgdefr   r^   r   Ú_buildFeatureFile    sl    

ÿ



zVoltToFea._buildFeatureFilec                 C   sN   t | jƒ ¡ }|d krt}| jd k	r0| j ¡ | _|  ||¡ |  |¡}| 	¡ S r(   )
Ú
VoltParserr)   ÚparseÚTABLESr*   ZgetGlyphOrderr,   rW   r{   r   )r   rU   rT   Úfear   r   r   Úconvertâ   s    

zVoltToFea.convertc                 C   s8   z
|j }W n tk
r"   |}Y nX t | j ||¡¡S r(   )ÚglyphÚAttributeErrorr   Ú	GlyphNamer+   Úget)r   r   r!   r   r   r   Ú
_glyphNameî   s
    

zVoltToFea._glyphNamec                 C   s8   z
|j }W n tk
r"   |}Y nX t | j| ¡  ¡S r(   )r   r‚   r   ro   r.   r   )r   r   r!   r   r   r   Ú
_groupNameõ   s
    

zVoltToFea._groupNamec                 C   s”   g }|D ]†}t |tjƒr*| |  |¡¡ qt |tjƒrH| |  |¡¡ qt |tjƒrf| |  |¡¡ qt |tj	ƒr†| |j
|jf¡ qt|ƒ‚q|S r(   )r   r   rƒ   ri   r…   r   r†   ÚEnumÚ_enumZRangeÚstartÚendrQ   )r   Úcoveragerl   Úitemr   r   r   Ú	_coverageü   s    
zVoltToFea._coveragec                 C   s   t  |  |j¡¡S r(   )r   Ú
GlyphClassr   r"   )r   r"   r   r   r   rˆ     s    zVoltToFea._enumc                 C   s:   g }|D ],}|   |¡}t|ttfƒs*|g}| |¡ q|S r(   )r   r   ÚtupleÚlistrk   )r   ÚcontextÚoutrŒ   r‹   r   r   r   Ú_context  s    
zVoltToFea._contextc                 C   s8   |   |j¡}|  |j¡}t ||¡}|| j|j ¡ < d S r(   )rC   r!   rˆ   r"   r   rn   r.   r   )r   r   r!   Úglyphsrz   r   r   r   rL     s    zVoltToFea._groupDefinitionc                 C   s¦   z| j |j | j|j< W n tk
r,   Y nX |jdkrp|j| jkrTt ¡ | j|j< | j|j j	 
|  |j¡¡ |jdkrŠ| j |j¡ n|jdkr¢|j| j|j< d S )Nrf   rg   rh   )r,   Úidr+   r!   Ú	TypeErrorÚtyper-   r   rŽ   r”   ri   r…   r2   ÚaddÚ
componentsr3   )r   r   r   r   r   rM     s    


zVoltToFea._glyphDefinitionc                 C   sš   |j }|jD ]ˆ}|j }|jD ]v}dd„ |jD ƒ}|j }|| jkrJi | j|< || j| krfi | j| |< || j| | ks|t‚| ¡ | j| | |< qqd S )Nc                 S   s   i | ]}|  d ¡d d“qS )ú\r   T)Úsplitr\   r   r   r   r`   3  s      z/VoltToFea._scriptDefinition.<locals>.<dictcomp>)Útagru   rq   Úlookupsr/   ÚAssertionErrorÚkeys)r   Úscriptrt   Úlangrv   rw   r   rr   r   r   r   rP   .  s    



zVoltToFea._scriptDefinitionc                 C   s2   |j  d¡r|j| j|j < nt d|j › ¡ d S )NZ	COMPILER_zUnsupported setting ignored: )r!   Ú
startswithÚvaluer6   ÚlogÚwarning)r   Zsettingr   r   r   rO   <  s    zVoltToFea._settingDefinitionc                 C   sV   |\}}}}}}|r|  ¡ pd }|r,|  ¡ p.d }	|r<|  ¡ p>d }
tj||||	|
|dS )N)Z
xPlacementZ
yPlacementZxAdvanceZ
xPlaDeviceZ
yPlaDeviceZ
xAdvDevice)rl   r   ZValueRecord)r   Ú
adjustmentÚadvÚdxÚdyÚadv_adjust_byÚdx_adjust_byÚdy_adjust_byZ
adv_deviceÚ	dx_deviceÚ	dy_devicer   r   r   Ú_adjustmentB  s    úzVoltToFea._adjustmentc           
      C   sZ   |\}}}}}}|rt ‚|r$| ¡ p&d }|r4| ¡ p6d }	tj|pBd|pHd|pNd |	pTd dS )Nr   )ZxDeviceTableZyDeviceTable)rž   rl   r   ZAnchor)
r   r¦   r§   r¨   r©   rª   r«   r¬   r­   r®   r   r   r   Ú_anchorR  s    üzVoltToFea._anchorc           	      C   s¸   |j }|j}|  |j¡}| d¡rpd | d¡dd … ¡}t |  	|¡¡}|  
|¡}t|||ƒ}|| j||f< nD|| jkr„i | j|< || j| kr i | j| |< || j| | |j< d S )NÚMARK_r<   rX   )r!   Z
glyph_namer°   rR   r¢   Újoinr›   r   Ú	MarkClassrC   r…   r
   r4   r5   Ú	component)	r   Z	anchordefZ
anchornameZ	glyphnameÚanchorr!   Ú	markclassr   Zmarkdefr   r   r   rN   `  s    



zVoltToFea._anchorDefinitionc           &   
   C   sJ  |j }|j}t|tjƒrà|j ¡ D ]¸\\}}\}}|j|d  }	|j|d  }
d}|	|
 D ]}t|tj	ƒsZd}qZ|  
|	¡}|  
|
¡}|  |¡}|  |¡}t|ƒdks¨t‚t|ƒdks¸t‚| tj|d ||d ||d¡ q"nft|tjƒrH|jD ]N\}}|  
|¡}|  |¡}t|ƒdks"t‚| t |d |fgg g d¡¡ qônþt|tjƒri }|jD ]š\}}|D ].}| ¡ D ]}|d| f}d| j| _qxqlt |  |¡¡}|jD ]D}| ¡ D ]4}||krÔg ||< ||| kr¾||  |¡ q¾q²q`|D ]}d}|| jkr | j| }g }|| D ]„}t |  |¡¡}td|d ƒD ]^}t|ƒ|k rj| g ¡ d }|| j| | kr”| j| | | }||d   ||f¡ qNq,|  |¡}|| j krÚt !||d ¡}n*|| jkrôt "||¡}nt #||d ¡}| |¡ q n0t|tj$ƒr>g } |j%D ],}!|!D ] }| ¡ D ]}|  |¡ qBq6q.g }"|j&D ],}!|!D ] }| ¡ D ]}|" |¡ qzqnqf| D ]f}|  |¡}#| j| d d }$d }%||"krè| j| d d }%|" '|" (|¡¡ | t )|#|$|%¡¡ q˜|"D ]6}|  |¡}#| j| d d }%| t )|#d |%¡¡ qnt*|ƒ‚d S )	NrX   FTr   )Ú
enumeratedr±   ÚentryÚexit)+rJ   rR   r   r   ÚPositionAdjustPairDefinitionÚadjust_pairrl   Úcoverages_1Úcoverages_2r   r   r¯   Úlenrž   ri   r   ZPairPosStatementÚPositionAdjustSingleDefinitionÚadjust_singleZSinglePosStatementÚPositionAttachDefinitionÚcoverage_toZglyphSetr4   r   r³   rC   r‹   r3   Úranger5   r…   r2   ZMarkMarkPosStatementZMarkLigPosStatementZMarkBasePosStatementZPositionAttachCursiveDefinitionZcoverages_enterZcoverages_exitÚpopÚindexZCursivePosStatementrQ   )&r   rp   Ú	fealookuprJ   rR   Úidx1Úidx2Úpos1Úpos2Z
coverage_1Z
coverage_2r·   rŒ   Úglyphs1Úglyphs2Zrecord1Zrecord2ÚaÚbr”   ÚrecordZanchorsZmarksry   Úmarkr!   rI   r¶   Úbaser™   r´   rµ   Zenter_coverager‹   Zexit_coverager   r¸   r¹   r   r   r   Ú_gposLookupr  s¸    



    ÿÿ


ÿ











zVoltToFea._gposLookupc                 C   sÌ  |j }|jrt‚|j}t|tjƒrÒ|j ¡ D ]¢\\}	}
\}}|  	|j
|	d  ¡}|  	|j|
d  ¡}t|ƒdkstt‚t|ƒdks„t‚|d |d f}|r¬t |||fg¡}n||f}t ||||¡}| |¡ q,nöt|tjƒrJt ¡ g}|jD ] \}}|  	|¡}|d  |¡ qð|r,t |||fg¡}nt ||||g¡}| |¡ n~t|tjƒrÀt ¡ g}|jD ]\}}|d  |  	|¡¡ qh|r¢t |||fg¡}nt ||||g¡}| |¡ nt|ƒ‚d S )NrX   r   )rJ   Zreversalrž   rR   r   r   rº   r»   rl   r   r¼   r½   r¾   r   ZIgnorePosStatementZChainContextPosStatementri   r¿   rŽ   rÀ   rk   rÁ   rÂ   rQ   )r   rp   ÚprefixÚsuffixÚignorerÆ   ÚtargetlookuprJ   rR   rÇ   rÈ   rÉ   rÊ   rË   rÌ   r”   rV   r   rÍ   rÎ   r   r‹   r<   r   r   r   Ú_gposContextLookupà  s`    
   ÿ

   ÿ
   ÿzVoltToFea._gposContextLookupc              	   C   sŽ  |j }|j}|j ¡ D ]p\}	}
|	r(|
sR|j\}}}t |› d|› d|› d¡ qd }|  |	¡}|  |
¡}|r†|||f}t 	|g¡}nøt
|tjƒrÆt|ƒdks¢t‚t|ƒdks²t‚t |||||¡}n¸t
|tjƒrt|ƒdksät‚t|ƒdksôt‚t ||||¡}nxt
|tjƒr>t|ƒdks&t‚t ||d |||¡}n@t
|tjƒrvt|ƒdks^t‚t ||||d |¡}nt|ƒ‚| |¡ qd S )Nú:z: Ignoring empty substitutionrX   r   )rJ   r>   Úmappingrl   Úlocationr¤   r¥   r   r   ZIgnoreSubstStatementr   r   ZSubstitutionSingleDefinitionr¾   rž   ZSingleSubstStatementZ+SubstitutionReverseChainingSingleDefinitionZ ReverseChainSingleSubstStatementZSubstitutionMultipleDefinitionZMultipleSubstStatementZSubstitutionLigatureDefinitionZLigatureSubstStatementrQ   ri   )r   rp   rÓ   rÔ   rÕ   ÚchainrÆ   rJ   r>   rI   ÚvalÚpathÚlineÚcolumnrV   r”   ÚreplacementsZchain_contextr   r   r   Ú_gsubLookup  sh    


    ÿ   ÿ    ÿ    ÿzVoltToFea._gsubLookupc              	   C   s  d }d }d}|j dkr|dO }|js,|dO }|js<|dO }n0t|jtƒrV|  |j¡}n|jd k	rl|  |j¡}d }|s„|d k	s„|d k	r’t |||¡}d|j	kr@|j	 
d¡d }| ¡ | jkrút |  |¡¡}|d k	rà|j |¡ |j t d|j	 ¡¡ n6| j| ¡  }|j t ¡ ¡ |j t d|j	 ¡¡ || j| ¡ < n8t |  |j	¡¡}|d k	rh|j |¡ || j|j	 ¡ < |jd k	rœ|j t d|j ¡¡ g }|jr|jD ]b}	|  |	j¡}
|  |	j¡}|	jdk}| |
||d	g¡ |r®t|jƒdkr®| g g d	d
g¡ q®n| g g d	d	g¡ d }|D ]Ø\}
}}}|jd k	rZ|  ||
||||¡ |jd k	r.| j d¡rzd
|_|
s’|s’|s’|rø|sâ|d krâ|  |j	d ¡}t |¡}t |dg ƒ|_!|j! |¡ |  "||¡ |  #||
||||¡ n|  "||¡ q.d S )Nr   ZRTLrX   é   é   rš   z# ZEXCEPT_CONTEXTFTZCOMPILER_USEEXTENSIONLOOKUPSz targetr[   )$Ú	directionZprocess_baseZprocess_marksr   Ústrr†   Zmark_glyph_setr   ZLookupFlagStatementr!   r›   r   r0   ZLookupBlockrA   rJ   ri   rj   ZSubtableStatementÚcommentsr‘   r“   ÚleftÚrightZex_or_inr¾   r>   rá   rR   r6   r„   Zuse_extensionr   r[   rÒ   r×   )r   rp   Zmark_attachementZmark_filteringÚflagsZlookupflagsr!   rÆ   Zcontextsr‘   rÓ   rÔ   rÕ   rÖ   rÛ   Z
targetnamer   r   r   rS   =  sŒ    


  ÿ



     ÿzVoltToFea._lookupDefinition)N)N)r   r   r   ÚreÚcompiler=   rB   r$   rA   rC   rW   r{   r€   r…   r†   r   rˆ   r“   rL   rM   rP   rO   r¯   r°   rN   rÒ   r×   rá   rS   r   r   r   r   r'   T   s0   


!B
	n4)r'   c                 C   sÖ  ddl }ddlm} ddlm} |jdtjd}|jdd|d	d
 |jdd|dd
 |jdddt	ddd |jddddd |jdddd | 
| ¡}||jr¢dndd |j}d}z:t|ƒ}d|krÜt|d j d¡ƒ}nt d ¡ W d!S W n tk
r   Y nX t||ƒ}z| |j¡}	W nŽ tk
r® }
 zn|jr>‚ t|
jd d"dƒ}d#|
› d$}|rŽ|\}}}t |› d%|› d%|› d&|› ¡ n
t |¡ W Y ¢d!S d}
~
X Y nX t|jd'ƒ}| |	¡ W 5 Q R X dS )(z'Convert MS VOLT to AFDKO feature files.r   N)ÚPath)ÚconfigLoggerzfonttools voltLib.voltToFea)ÚdescriptionÚinputZINPUTzinput font/VTP file to process)Úmetavarr—   ÚhelpÚfeaturefileZOUTPUTzoutput feature filez-tz--tableri   rU   z:List of tables to write, by default all tables are written)ÚactionÚchoicesÚdestrñ   z-qz--quietÚ
store_truezSuppress non-error messages)ró   rñ   z--tracebacku   Donâ€™t catch exceptionsÚERRORÚINFO)ÚlevelZTSIVzutf-8z6"TSIV" table is missing, font was not saved from VOLT?rX   rÚ   ú"z" is not supportedrØ   z: Úw)ÚargparseÚpathlibrì   Z	fontToolsrí   ÚArgumentParserÚmainÚ__doc__Úadd_argumentr~   Ú
parse_argsÚquietrï   r   r   ÚdataÚdecoder¤   Úerrorr   r'   r€   rU   rQ   Ú	tracebackr   ÚargsÚopenrò   Úwrite)r  rü   rì   rí   ÚparserÚoptionsr9   r:   Ú	converterr   ÚerÚ   ÚmessagerÝ   rÞ   rß   Zfeafiler   r   r   rÿ   ‘  s‚     ÿ   ÿ   ÿú   ÿ  ÿ




"
rÿ   Ú__main__)N)r   Úloggingrê   Úior   ZfontTools.feaLibr   ZfontTools.ttLibr   r   ZfontTools.voltLibr   ZfontTools.voltLib.parserr   r|   Ú	getLoggerr¤   r~   r
   r   r'   rÿ   r   Úsysr¹   r   r   r   r   Ú<module>   s(   )


    A
B