
    NgYo                     ,   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j        d          Zg dZ G d	 d
ej                  Z G d d          Z G d d          ZddZedk    rddlZ ej         e                       dS dS )u6  MS VOLT ``.vtp`` to AFDKO ``.fea`` OpenType Layout converter.

Usage
-----

To convert a VTP project file:


.. code-block:: sh

    $ 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:

.. code-block:: sh

    $ 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                       e Zd ZddZdS )MarkClassDefinition c                 |    d}t          | dd          s|dz  }|t          j                            | |          z  }|S )Nr   usedF#)getattrr   r   asFea)selfindentress      W/var/www/html/ai-engine/env/lib/python3.11/site-packages/fontTools/voltLib/voltToFea.pyr   zMarkClassDefinition.asFea=   sF    tVU++ 	3JCs&,,T6:::
    N)r   )__name__
__module____qualname__r    r   r   r   r   <   s(             r   r   c                       e Zd Zd Zd ZdS )Groupc                 x    |j                                         | _         d |j        j        D             | _        d S )Nc                 t    g | ]5}t          |t          j                  |j                                        6S r   )
isinstanceVAst	GroupNamegrouplower).0xs     r   
<listcomp>z"Group.__init__.<locals>.<listcomp>I   sC     
 
 
 !
1dn8U8U
GMMOO
 
 
r   )namer$   enumgroups)r   r#   s     r   __init__zGroup.__init__G   s?    J$$&&	
 
%*Z_
 
 
r   c                     | j         |j        v rdS |j         | j        v rdS | j        r	|j        sdS | j        s	|j        rdS d S d S )NTF)r(   r*   )r   others     r   __lt__zGroup.__lt__M   sn    9$$4:$$5; 	u| 	5{ 	u| 	4	 	 	 	r   N)r   r   r   r+   r.   r   r   r   r   r   F   s2        
 
 
    r   r   c                       e Zd Z ej        d          Z ej        d          ZddZd Zd Z	d Z
d Zdd	Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )	VoltToFeaz[^A-Za-z_0-9.]z[^A-Za-z_0-9.\-]Nc                     || _         || _        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fonts      r   r+   zVoltToFea.__init__\   s{    )
 
eer   c                     || j         vr`| j                            d|          }|| j                                         v r |dz  }|| j                                         v  || j         |<   | j         |         S N_)rA   _NOT_LOOKUP_NAME_REsubvaluesr   r(   r   s      r   _lookupNamezVoltToFea._lookupNames   s    t)))*..sD99C+224444s
 +224444'*Dt$!$''r   c                     || j         vr`| j                            d|          }|| j                                         v r |dz  }|| j                                         v  || j         |<   | j         |         S rF   )rB   _NOT_CLASS_NAME_RErI   rJ   rK   s      r   
_classNamezVoltToFea._className{   s    t((()--c488C*113333s
 *113333&)Dd# &&r   c                 F   d |j         D             }t          |d           D ]}|                     |           |j         D ]}t          |t          j                  r|                     |           3t          |t          j                  rd|v r|                     |           gt          |t          j	                  r| 
                    |           t          |t          j                  rt          |t          j                  r|                     |           t          |t          j                  st          |          |j         D ]I}t          |t          j                  r-|j        rd|vr(|j        rd|vr4|                     |           Jd S )Nc                 F    g | ]}t          |t          j                  |S r   )r    r!   GroupDefinition)r%   ss     r   r'   z0VoltToFea._collectStatements.<locals>.<listcomp>   s*    SSSz!T=Q/R/RS!SSSr   c                      t          |           S r2   )r   )r&   s    r   <lambda>z.VoltToFea._collectStatements.<locals>.<lambda>   s    eAhh r   keyr
   r	   )
statementssorted_groupDefinitionr    r!   GlyphDefinition_glyphDefinitionAnchorDefinition_anchorDefinitionSettingDefinition_settingDefinitionrR   ScriptDefinition_scriptDefinitionLookupDefinitionNotImplementedErrorposrI   _lookupDefinition)r   doctablesr*   	statements        r   _collectStatementszVoltToFea._collectStatements   s    TSS^SSS,>,>??? 	- 	-I!!),,,, 	5 	5I)T%9:: 5%%i0000It'<== 
5V##**9555It'=>> 5''	2222It';<< 5It'<== 5&&y1111	4+@AA 5))4445
  	2 	2I)T%:;; 2= V6%9%9= V6%9%9&&y111	2 	2r   c           	          t          j                    }|j        } j        rS|                    t          j        d                     |                     j                                                    j        rj|                    t          j        d                     |                    d t           j        
                                          D                         j        r||                    t          j        d                      j                                        D ];}|                    t          |dg                      |                    |           < j                                        }|D ]u}||         }|D ]G}||         }	|	D ]}
 fd|	|
         D             |	|
<   d |	
                                D             ||<   Hd |
                                D             ||<   vd	 |
                                D             }|rb|                    t          j        d
                     |
                                D ]%\  }}t          j        |          }t          |d           }|D ]}|j                            t          j        |                     t          ||         d           }|D ]}
|
dk    rdnd}|j                            t          j        |
|                     ||         |
         D ]O} j        |                                         }t          j        |          }|j                            |           P|                    |           ' j        rd|v rg }dD ]}| j        v rtd|                                z   }t          j        | j        |                   }|                    |           |                    t          j        |                     |                    d            t          j        d          }|j                            t          j        |            |                    |           |S )Nz# Glyph classesz
# Mark classesc              3   &   K   | ]}|d          V  dS )   Nr   )r%   cs     r   	<genexpr>z.VoltToFea._buildFeatureFile.<locals>.<genexpr>   s&      NNqadNNNNNNr   z

# Lookupstargetsc                 J    g | ]}|                                 j        v | S r   )r$   r:   )r%   lr   s     r   r'   z/VoltToFea._buildFeatureFile.<locals>.<listcomp>   s-    "X"X"XQWWYY$-=W=W1=W=W=Wr   c                     i | ]
\  }}|||S r   r   )r%   trr   s      r   
<dictcomp>z/VoltToFea._buildFeatureFile.<locals>.<dictcomp>   s#     E E E$!Q1 EA E E Er   c                     i | ]
\  }}|||S r   r   )r%   rt   rS   s      r   ru   z/VoltToFea._buildFeatureFile.<locals>.<dictcomp>   s#    DDDtq!!DaDDDr   c                     i | ]
\  }}|||S r   r   )r%   rt   fs      r   ru   z/VoltToFea._buildFeatureFile.<locals>.<dictcomp>   s#    ;;;TQ;Aq;;;r   z
# Featuresc                     | dk    rdndS )NDFLTr   rm   r   ks    r   rU   z-VoltToFea._buildFeatureFile.<locals>.<lambda>   s    1;;aaA r   rV   c                     | dk    rdndS )Ndfltr   rm   r   r{   s    r   rU   z-VoltToFea._buildFeatureFile.<locals>.<lambda>   s    Q&[[VW r   r~   TF)include_defaultr   BASEMARKLIGATURE	COMPONENTGDEF_)r   FeatureFilerX   r8   appendCommentextendrJ   r>   rY   itemsr:   r   r9   copyFeatureBlockScriptStatementLanguageStatementr$   LookupReferenceStatementr7   GlyphClassDefinitionGlyphClassName
TableBlockGlyphClassDefStatement)r   rh   rg   rX   lookupfeaturesftagscriptsstaglangsltagfeaturestagsltagsr   r(   	lookuprefclasses	classname
glyphclassgdefs   `                    r   _buildFeatureFilezVoltToFea._buildFeatureFile   s   o^
 	;ck*;<<===d07799::: 	Ock*<==>>>NNF43D3J3J3L3L,M,MNNNNNN= 	*ck-88999-..00 * *!!'&)R"@"@AAA!!&)))) >&&(( 	E 	EDtnG F F! Y YD"X"X"X"XeDk"X"X"XE$KK E E%++-- E E EDDw}}DDDHTNN;;X^^%5%5;;; 	+ck,77888!)!1!1 + +g*400w,M,MNNN! A AD&--c.A$.G.GHHH"74=6W6WXXXE % A A26&..$$e*111$XXX   %,DM$$7 A AD%)]4::<<%@F(+(DV(L(LI#.55i@@@@AA !!'****: 	$&F**GA ) )4:%% '$**,, 6I!$!9)TZPTEU!V!VJ%%j111NN3#5j#A#ABBBBNN4((((>&))DO""3#=w#GHHHd###
r   c                 (   t          | j                                                  }|t          }| j        | j                                        | _        |                     ||           |                     |          }|	                                S r2   )

VoltParserr3   parseTABLESr4   getGlyphOrderr6   rj   r   r   )r   rh   rg   feas       r   convertzVoltToFea.convert   s}    +,,2244>F:! $
 8 8 : :DV,,,$$V,,yy{{r   c                     	 |j         }n# t          $ r |}Y nw xY wt          j        | j                            ||                    S r2   )glyphAttributeErrorr   	GlyphNamer5   get)r   r   r(   s      r   
_glyphNamezVoltToFea._glyphName   sV    	;DD 	 	 	DDD	}T_00t<<===   
 c                     	 |j         }n# t          $ r |}Y nw xY wt          j        | j        |                                                   S r2   )r#   r   r   r   r8   r$   )r   r#   r(   s      r   
_groupNamezVoltToFea._groupName   sU    	;DD 	 	 	DDD	!$"4TZZ\\"BCCCr   c                 >   g }|D ]}t          |t          j                  r)|                    |                     |                     Ft          |t          j                  r)|                    |                     |                     t          |t          j                  r)|                    |                     |                     t          |t          j	                  r#|                    |j
        |j        f           	t          |          |S r2   )r    r!   r   r   r   r"   r   Enum_enumRangestartendrd   )r   coverager   items       r   	_coveragezVoltToFea._coverage   s     
	0 
	0D$// 	0T__T223333D$.11 0T__T223333D$),, 0TZZ--....D$*-- 0dj$(34444)$///r   c                 Z    t          j        |                     |j                            S r2   )r   
GlyphClassr   r)   )r   r)   s     r   r   zVoltToFea._enum  s     ~dnnTY77888r   c                     g }|D ]K}|                      |          }t          |t          t          f          s|g}|                    |           L|S r2   )r   r    tuplelistr   )r   contextoutr   r   s        r   _contextzVoltToFea._context  s^     	! 	!D~~d++Hh66 &$:JJx    
r   c                     |                      |j                  }|                     |j                  }t	          j        ||          }|| j        |j                                        <   d S r2   )rO   r(   r   r)   r   r   r8   r$   )r   r#   r(   glyphsr   s        r   rZ   zVoltToFea._groupDefinition  s[    uz**EJ''-dF;;
1;5:++--...r   c                    	 | j         |j                 | j        |j        <   n# t          $ r Y nw xY w|j        dv rp|j        | j        vr t          j                    | j        |j        <   | j        |j                 j	        
                    |                     |j                             |j        dk    r!| j                            |j                   d S |j        dk    r|j        | j        |j        <   d S d S )Nr   r   r   )r6   idr5   r(   	TypeErrortyper7   r   r   r   r   r   r<   add
componentsr=   )r   r   s     r   r\   zVoltToFea._glyphDefinition"  s    	*.*;EH*EDOEJ'' 	 	 	D	 :BBBz++),)9)9
5:&Juz")001L1LMMM:KOOEJ'''''Z:%%*/*:DOEJ''' &%s   " 
//c                 \   |j         }|j        D ]}|j         }|j        D ]}d |j        D             }|j         }|| j        vr
i | j        |<   || j        |         vri | j        |         |<   || j        |         |         vsJ |                                | j        |         |         |<   d S )Nc                 F    i | ]}|                     d           d         dS )\r   T)split)r%   rr   s     r   ru   z/VoltToFea._scriptDefinition.<locals>.<dictcomp>7  s)    KKKa1774==+TKKKr   )tagr   r   lookupsr9   keys)r   scriptr   langr   r   r   r   s           r   rb   zVoltToFea._scriptDefinition2  s    zL 
	B 
	BD8D= B BKK7?KKK{t~--+-DN4(t~d33313DN4(.4>$#7#=====3:<<>>t$T*400B
	B 
	Br   c                     |j                             d          r|j        | j        |j         <   d S t                              d|j                     d S )N	COMPILER_zUnsupported setting ignored: )r(   
startswithvaluer@   logwarning)r   settings     r   r`   zVoltToFea._settingDefinition@  sT    <"";// 	H+2=DN7<(((KKFFFGGGGGr   c                     |\  }}}}}}|r|                                 pd }|r|                                 pd }	|r|                                 pd }
t          j        ||||	|
|          S )N)
xPlacement
yPlacementxAdvance
xPlaDevice
yPlaDevice
xAdvDevice)r   r   ValueRecord)r   
adjustmentadvdxdyadv_adjust_bydx_adjust_bydy_adjust_by
adv_device	dx_device	dy_devices              r   _adjustmentzVoltToFea._adjustmentF  s    AK>R]L,"<}':':'<'<D
 9\%7%7%9%9AT	 9\%7%7%9%9AT	  !
 
 
 	
r   c                     |\  }}}}}}|rJ |r|                                 pd }|r|                                 pd }	t          j        |pd|pd|pd |	pd           S )Nr   )xDeviceTableyDeviceTable)r   r   Anchor)
r   r   r   r   r   r   r   r   r   r   s
             r   _anchorzVoltToFea._anchorV  s    AK>R]L,     9\%7%7%9%9AT	 9\%7%7%9%9AT	zG!G!"*d"*d	
 
 
 	
r   c                 0   |j         }|j        }|                     |j                  }|                    d          rd                    |                    d          dd                    }t          j        | 	                    |                    }| 
                    |          }t          |||          }|| j        ||f<   d S || j        vr
i | j        |<   || j        |         vri | j        |         |<   || j        |         |         |j        <   d S )NMARK_rG   rm   )r(   
glyph_namer   re   r   joinr   r   	MarkClassrO   r   r   r>   r?   	component)	r   	anchordef
anchorname	glyphnameanchorr(   	markclassr   markdefs	            r   r^   zVoltToFea._anchorDefinitiond  s   ^
(	im,,  )) 	O88J,,S11!""566Ddood&;&;<<IOOI..E))VUCCG9@Dy*5666--+-i(y!99979i(4HNDM)$Z01DEEEr   c           
         |j         }|j        }t          |t          j                  r%|j                                        D ]\  \  }}\  }}|j        |dz
           }	|j        |dz
           }
d}|	|
z   D ]}t          |t          j	                  sd}| 
                    |	          }| 
                    |
          }|                     |          }|                     |          }t          |          dk    sJ t          |          dk    sJ |                    t          j        |d         ||d         ||                     
d S t          |t          j                  r|j        D ]w\  }}| 
                    |          }|                     |          }t          |          dk    sJ |                    t          j        |d         |fgg g d                     xd S t          |t          j                  r&i }|j        D ]\  }}|D ]2}|                                D ]}|d|z   f}d| j        |         _        3t          j        |                     |                    }|j        D ]G}|                                D ]0}||vrg ||<   |||         vr||                             |           1H|D ]f}d}|| j        v r| j        |         }g }||         D ]}t          j        |                     |                    }t9          d|dz             D ]z}t          |          |k     r|                    g            d }|| j        |         |         v r| j        |         |         |         }||dz
                               ||f           {|                     |          }|| j        v rt          j         ||d                   }n:|| j        v rt          j!        ||          }nt          j"        ||d                   }|                    |           hd S t          |t          j#                  r{g } |j$        D ]3}!|!D ].}|                                D ]}|                     |           /4g }"|j%        D ]3}!|!D ].}|                                D ]}|"                    |           /4| D ]}|                     |          }#| j        |         d         d         }$d }%||"v rA| j        |         d         d         }%|"&                    |"'                    |                     |                    t          j(        |#|$|%                     |"D ]Y}|                     |          }#| j        |         d         d         }%|                    t          j(        |#d |%                     Zd S tS          |          )	Nrm   FTr   )
enumeratedr   entryexit)*rX   re   r    r!   PositionAdjustPairDefinitionadjust_pairr   coverages_1coverages_2r"   r   r   lenr   r   PairPosStatementPositionAdjustSingleDefinitionadjust_singleSinglePosStatementPositionAttachDefinitioncoverage_toglyphSetr>   r   r   rO   r   r=   ranger?   r   r<   MarkMarkPosStatementMarkLigPosStatementMarkBasePosStatementPositionAttachCursiveDefinitioncoverages_entercoverages_exitpopindexCursivePosStatementrd   )&r   r   	fealookuprX   re   idx1idx2pos1pos2
coverage_1
coverage_2r  r   glyphs1glyphs2record1record2abr   recordanchorsmarksr   markr(   rW   r   baser   r   r   enter_coverager   exit_coverager   r  r  s&                                         r   _gposLookupzVoltToFea._gposLookupv  s   )
jc4<== h	+.1o.C.C.E.E  *tltT _TAX6
 _TAX6
 #
&3 * *D%dDN;; *%)
..44..44**400**4007||q((((7||q((((!!(
GWQZZ     # , T@AA Q	+)  1**))!,,6{{a''''!!*VAY,?+@"b%PP   	  T:;; I	+G$'O < < y! ; ;D
 !% ; ;#Wy%896:)#.33;  M$//)*D*DEE	L < <D $ < <w..,.GDM$GDM99#DM00;;;	<<   ( (
4?**!%!6J#DM I ID #dood.C.C D DI%*1j1n%=%= I I	u::	11!LL,,,!%$d(;D(AAA%)]4%8%>y%IFi!m,33VY4GHHHHI t,,4;&&3D%(CCDDT_,,24??DD3D%(CCD!!$''''/( (0 TABB 	+N/ 4 4$ 4 4D $ 4 4&--d333344 M. 3 3$ 3 3D $ 3 3%,,T222233 ' O O--d+G4Q7=((=.v6q9D!%%m&9&9$&?&?@@@!!#"9%"M"MNNNN & N N--}T*6215!!#"9%t"L"LMMMMN N
 &c***r   c                 6   |j         }|j        rJ |j        }t          |t          j                  r|j                                        D ]\  \  }	}
\  }}|                     |j	        |	dz
                     }|                     |j
        |
dz
                     }t          |          dk    sJ t          |          dk    sJ |d         |d         f}|rt          j        |||fg          }n||f}t          j        ||||          }|                    |           d S t          |t          j                  rt          j                    g}|j        D ]5\  }}|                     |          }|d                             |           6|rt          j        |||fg          }nt          j        ||||g          }|                    |           d S t          |t          j                  rt          j                    g}|j        D ]3\  }}|d                             |                     |                     4|rt          j        |||fg          }nt          j        ||||g          }|                    |           d S t-          |          )Nrm   r   )rX   reversalre   r    r!   r  r  r   r   r  r  r	  r   IgnorePosStatementChainContextPosStatementr   r  r   r  r   r  r  rd   )r   r   prefixsuffixignorer  targetlookuprX   re   r  r  r  r  r"  r#  r   ri   r   r&  r'  r   r   rG   s                          r   _gposContextLookupzVoltToFea._gposContextLookup  s    )
?"""jc4<== *	+.1o.C.C.E.E - -*tltT..)BCC..)BCC7||q((((7||q((((!!*gaj1  # 68P7Q R RII+\:G # <! !I !!),,,,- - T@AA 	+n&&'F) ( (1q))q	  '''' 2VVV4L3MNN		8FF\N 	 i(((((T:;; 	+n&&'F" ; ;!q	  !9!9:::: 2VVV4L3MNN		8FF\N 	 i(((((%c***r   c           	      R   |j         }|j        }|j                                        D ]\  }	}
|	r|
s/|j        \  }}}t
                              | d| d| d           9d }|                     |	          }|                     |
          }|r|||f}t          j	        |g          }net          |t          j                  rDt          |          dk    sJ t          |          dk    sJ t          j        |||||          }nt          |t          j                  rBt          |          dk    sJ t          |          dk    sJ t          j        ||||          }nt          |t          j                  r4t          |          dk    sJ t          j        ||d         |||          }n]t          |t          j                  r4t          |          dk    sJ t          j        ||||d         |          }nt+          |          |                    |           d S )N:z: Ignoring empty substitutionrm   r   )rX   rI   mappingr   locationr   r   r   r   IgnoreSubstStatementr    r!   SubstitutionSingleDefinitionr	  SingleSubstStatement+SubstitutionReverseChainingSingleDefinition ReverseChainSingleSubstStatementSubstitutionMultipleDefinitionMultipleSubstStatementSubstitutionLigatureDefinitionLigatureSubstStatementrd   r   )r   r   r4  r5  r6  chainr  rX   rI   rW   valpathlinecolumnri   r   replacementschain_contexts                     r   _gsubLookupzVoltToFea._gsubLookup  sj   )
j))++ #	) #	)HC c %(\"dFtRRdRRVRRRSSSI^^C((F>>#..L /!' 84m_EE		C!BCC /6{{a''''<((A----4L&&% 		 C!QRR /6{{a''''<((A----@FFL 		 C!DEE /6{{a''''6F1Iv|U 		 C!DEE /<((A----6FFLOU 		 *#...i((((G#	) #	)r   c           	         d }d }d}|j         dk    r|dz  }|j        s|dz  }|j        s|dz  }nVt          |j        t                    r|                     |j                  }n!|j        |                     |j                  }d }|s||t          j        |||          }d|j	        v rN|j	        
                    d          d         }|                                | j        vrxt          j        |                     |                    }||j                            |           |j                            t          j        d|j	        z                        n~| j        |                                         }|j                            t          j                               |j                            t          j        d|j	        z                        || j        |                                <   nit          j        |                     |j	                            }||j                            |           || j        |j	                                        <   |j        4|j                            t          j        d|j        z                        g }|j        r|j        D ]}	|                     |	j                  }
|                     |	j                  }|	j        dk    }|                    |
||d	g           |r1t3          |j                  dk    r|                    g g d	d
g           n|                    g g d	d	g           d }|D ]\  }
}}}|j        |                     ||
||||           |j        | j                            d          rd
|_        |
s|s|s|r|sy|w|                     |j	        dz             }t          j        |          }tA          |dg           |_!        |j!                            |           | "                    ||           | #                    ||
||||           | "                    ||           d S )Nr   RTLrm         r   z# EXCEPT_CONTEXTFTCOMPILER_USEEXTENSIONLOOKUPSz targetrp   )$	directionprocess_baseprocess_marksr    strr   mark_glyph_setr   LookupFlagStatementr(   r   r$   r:   LookupBlockrL   rX   r   r   SubtableStatementcommentsr   r   leftrightex_or_inr	  rI   rM  re   r@   r   use_extensionr   rp   r/  r8  )r   r   mark_attachementmark_filteringflagslookupflagsr(   r  contextsr   r4  r5  r6  r7  rF  
targetnames                   r   rf   zVoltToFea._lookupDefinitionA  s   u$$QJE" 	QJE # 	DQJEE,c22 	D#v/CDD".!__V-BCCN 	$0N4N1' K 6; ;$$T**1-Dzz||4=00OD,<,<T,B,BCC	*(//<<<$++CKv{8J,K,KLLLL M$**,,7	$++C,A,C,CDDD$++CKv{8J,K,KLLL*3DM$**,,''(8(8(E(EFFI&$++K8881:DM&+++--.?& ''D6?4J(K(KLLL> 	4!> ; ;w|44w}55 )-== ?@@@  ;c&.11Q66OORUD$9:::; OORUE2333-5 	8 	8)FFFEz%  	RRRz%>%%&DEE 3.2I+ 8V 8u 8 8! ?l&:%)%5%5fkI6M%N%N
'*z'B'B,3Iy",M,M	)!)00>>>((>>>++	<    $$VY777%	8 	8r   r2   )r   r   r   recompilerH   rN   r+   rL   rO   rj   r   r   r   r   r   r   r   rZ   r\   rb   r`   r   r   r^   r/  r8  rM  rf   r   r   r   r0   r0   X   s       $"*%677#$788   .( ( (' ' '2 2 2B@ @ @D
 
 
 
> > >D D D  9 9 9  < < <; ; ; B B BH H H
 
 
 
 
 
O O O$l+ l+ l+\2+ 2+ 2+h') ') ')RQ8 Q8 Q8 Q8 Q8r   r0   c           
         ddl }ddlm} ddlm} |                    dt          j                  }|                    dd|d	
           |                    dd|d
           |                    dddt          dd           |                    dddd           |                    ddd           |
                    |           } ||j        rdnd           |j        }d}	 t          |          }d|v r.t          |d         j                            d                    }nt"                              d            d!S n# t&          $ r Y nw xY wt)          ||          }	 |                    |j                  }	n# t.          $ r}}
|j        r t3          |
j        d         d"d          }d#|
 d$}|r,|\  }}}t"                              | d%| d%| d&|            nt"                              |           Y d}
~
d!S d}
~
ww xY wt7          |j        d'          5 }|                    |	           ddd           dS # 1 swxY w Y   dS )(z'Convert MS VOLT to AFDKO feature files.r   N)Path)configLoggerzfonttools voltLib.voltToFea)descriptioninputINPUTzinput font/VTP file to process)metavarr   helpfeaturefileOUTPUTzoutput feature filez-tz--tabler   rh   z:List of tables to write, by default all tables are written)actionchoicesdestrp  z-qz--quiet
store_truezSuppress non-error messages)rs  rp  z--tracebacku   Don’t catch exceptionsERRORINFO)levelTSIVzutf-8z6"TSIV" table is missing, font was not saved from VOLT?rm   r<  "z" is not supportedr:  z: w)argparsepathlibrj  	fontToolsrk  ArgumentParsermain__doc__add_argumentr   
parse_argsquietrm  r   r   datadecoder   errorr   r0   r   rh   rd   	tracebackr   argsopenrq  write)r  r}  rj  rk  parseroptionsrC   rD   	converterr   er<  messagerH  rI  rJ  feafiles                    r   r  r    sQ    OOO&&&&&&$$%4< %  F t2R     xd9N     I     i3P     l1K     %%GL7=<f>>>>=LDl##T>>#DL$5$<$<W$E$EFFLLIINOOO1      ,--I// 
 
 
 	16!9j$77+a+++ 	!)D$II::::v::::;;;;IIgqqqqq
 
g!3	'	' 7c                 s>   )AE 
EE(F 
H
A2HH
"II	I	__main__r2   )r  loggingrg  ior   fontTools.feaLibr   fontTools.ttLibr   r   fontTools.voltLibr!   fontTools.voltLib.parserr   r   	getLoggerr   r   r   r   r0   r  r   sysr  r   r   r   <module>r     sy  + +Z  				                   . . . . . . . . ) ) ) ) ) ) 9 9 9 9 9 9g566	!	!	!    #1          $z8 z8 z8 z8 z8 z8 z8 z8z? ? ? ?D zJJJCHTTVV r   