
    hYo                     $   S r SSKrSSKrSSKJr  SSKJr  SSKJrJ	r	  SSK
Jr  SSKJr  \R                  " S5      r/ SQr " S	 S
\R$                  5      r " S S5      r " S S5      rSS jr\S:X  a  SSKr\R0                  " \" 5       5        gg)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                       \ rS rSrSS jrSrg)MarkClassDefinition<   c                 |    Sn[        U SS5      (       d  US-  nU[        R                  R                  X5      -  nU$ )N usedF#)getattrr   r   asFea)selfindentress      M/var/www/html/env/lib/python3.13/site-packages/fontTools/voltLib/voltToFea.pyr   MarkClassDefinition.asFea=   s?    tVU++3JCs&&,,T::
     N)r   )__name__
__module____qualname____firstlineno__r   __static_attributes__r   r   r   r   r   <   s    r   r   c                        \ rS rSrS rS rSrg)GroupF   c                    UR                   R                  5       U l         UR                  R                   Vs/ s H>  n[        U[        R
                  5      (       d  M$  UR                  R                  5       PM@     snU l        g s  snf N)namelowerenum
isinstanceVAst	GroupNamegroupgroups)r   r+   xs      r   __init__Group.__init__G   sW    JJ$$&	%*ZZ__
%4
1dnn8UOAGGMMO_
 
s   #BBc                     U R                   UR                  ;   a  gUR                   U R                  ;   a  gU R                  (       a  UR                  (       d  gU R                  (       d  UR                  (       a  gg g )NTF)r%   r,   )r   others     r   __lt__Group.__lt__M   sO    99$::$;;u||{{u||  ,{r   )r,   r%   N)r   r   r   r   r.   r2   r   r   r   r   r!   r!   F   s    
r   r!   c                       \ rS rSr\R
                  " S5      r\R
                  " S5      rSS jrS r	S r
S rS	 rSS
 jrS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)	VoltToFeaX   z[^A-Za-z_0-9.]z[^A-Za-z_0-9.\-]Nc                     Xl         X l        0 U l        S U l        0 U l        0 U l        0 U l        0 U l        [        5       U l	        0 U l
        0 U l        0 U l        0 U l        0 U l        0 U l        g r$   )_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.   VoltToFea.__init__\   so    )
 
er   c                    XR                   ;  ak  U R                  R                  SU5      nX R                   R                  5       ;   a$  US-  nX R                   R                  5       ;   a  M$  X R                   U'   U R                   U   $ N_)rF   _NOT_LOOKUP_NAME_REsubvaluesr   r%   r   s      r   _lookupNameVoltToFea._lookupNames   sz    )))**..sD9C++2244s
 ++2244'*t$!!$''r   c                    XR                   ;  ak  U R                  R                  SU5      nX R                   R                  5       ;   a$  US-  nX R                   R                  5       ;   a  M$  X R                   U'   U R                   U   $ rL   )rG   _NOT_CLASS_NAME_RErO   rP   rQ   s      r   
_classNameVoltToFea._className{   sz    ((())--c48C**1133s
 **1133&)d#  &&r   c                    UR                    Vs/ s H&  n[        U[        R                  5      (       d  M$  UPM(     nn[	        US S9 H  nU R                  U5        M     UR                    GH  n[        U[        R                  5      (       a  U R                  U5        M6  [        U[        R                  5      (       a  SU;   a  U R                  U5        Mn  Mp  [        U[        R                  5      (       a  U R                  U5        M  [        U[        R                  5      (       a  M  [        U[        R                  5      (       a  U R                  U5        M  [        U[        R                  5      (       a  GM  [        U5      e   UR                    Hg  n[        U[        R                  5      (       d  M$  UR                   (       a  SU;  a  M=  UR"                  (       a  SU;  a  MV  U R%                  U5        Mi     g s  snf )Nc                     [        U 5      $ r$   )r!   )r-   s    r   <lambda>.VoltToFea._collectStatements.<locals>.<lambda>   s    eAhr   keyr
   r	   )
statementsr(   r)   GroupDefinitionsorted_groupDefinitionGlyphDefinition_glyphDefinitionAnchorDefinition_anchorDefinitionSettingDefinition_settingDefinitionScriptDefinition_scriptDefinitionLookupDefinitionNotImplementedErrorposrO   _lookupDefinition)r   doctablessr,   	statements         r   _collectStatementsVoltToFea._collectStatements   sz    !^^S^z!T=Q=Q/R!^S,>?I!!), @ I)T%9%9::%%i0It'<'<==V#**95 $It'='=>>''	2It';';<<It'<'<==&&y1	4+@+@AA))44 (" I)T%:%:;;==V6%9==V6%9&&y1 (+ Ts
   #H	H	c           
      	   [         R                  " 5       nUR                  nU R                  (       aN  UR	                  [         R
                  " S5      5        UR                  U R                  R                  5       5        U R                  (       a^  UR	                  [         R
                  " S5      5        UR                  S [        U R                  R                  5       5       5       5        U R                  (       as  UR	                  [         R
                  " S5      5        U R                  R                  5        H0  nUR                  [        US/ 5      5        UR	                  U5        M2     U R                  R                  5       nU H  nXV   nU Hv  nXx   n	U	 H9  n
X    Vs/ s H$  oR                  5       U R                  ;   d  M"  UPM&     snX'   M;     U	R                  5        VVs0 s H  u  pU(       d  M  X_M     snnXx'   Mx     UR                  5        VVs0 s H  u  pU(       d  M  X_M     snnXV'   M     UR                  5        VVs0 s H  u  pU(       d  M  X_M     nnnU(       GaT  UR	                  [         R
                  " S5      5        UR                  5        GH  u  pg[         R                   " U5      n[        US S9nU H  nUR                  R	                  [         R"                  " U5      5        [        Xx   S	 S9nU H  n
U
S
:X  a  SOSnUR                  R	                  [         R$                  " U
US95        Xx   U
    HQ  nU R                  UR                  5          n[         R&                  " U5      nUR                  R	                  U5        MS     M     M     UR	                  U5        GM     U R(                  (       a  SU;   a  / nS H  nUU R(                  ;   ao  SUR                  5       -   n[         R*                  " UU R(                  U   5      nUR	                  U5        UR	                  [         R,                  " U5      5        M  UR	                  S 5        M     [         R.                  " S5      nUR                  R	                  [         R0                  " U6 5        UR	                  U5        U$ s  snf s  snnf s  snnf s  snnf )Nz# Glyph classesz
# Mark classesc              3   *   #    U  H	  oS    v   M     g7f)   Nr   ).0cs     r   	<genexpr>.VoltToFea._buildFeatureFile.<locals>.<genexpr>   s     N,Mqd,Ms   z

# Lookupstargetsz
# Featuresc                     U S:X  a  S$ S$ )NDFLTr   rv   r   ks    r   rZ   -VoltToFea._buildFeatureFile.<locals>.<lambda>   s    1;a6MA6Mr   r\   c                     U S:X  a  S$ S$ )Ndfltr   rv   r   r~   s    r   rZ   r      s    Q&[@WVW@Wr   r   TF)include_defaultr   BASEMARKLIGATURE	COMPONENTGDEF_)r   FeatureFiler^   r=   appendCommentextendrP   rC   r`   itemsr?   r   r>   copyr&   FeatureBlockScriptStatementLanguageStatementLookupReferenceStatementr<   GlyphClassDefinitionGlyphClassName
TableBlockGlyphClassDefStatement)r   ro   rn   r^   lookupfeaturesftagscriptsstaglangsltagltrp   ffeaturestagsltagsr   r%   	lookuprefclasses	classname
glyphclassgdefs                            r   _buildFeatureFileVoltToFea._buildFeatureFile   s   oo^^
ckk*;<=d00779:ckk*<=>NF43D3D3J3J3L,MNN==ckk-89--..0!!'&)R"@A!!&) 1
 >>&&(DnG!D.3k"XkWWY$--=W1k"XEK "27++- E-$!1- E	  
 07}}Dtq!dadDHN  &.^^%5;%5TQDAD%5;ckk,78!)!1**40w,MN!D&&--c.A.A$.GH"7=6WXE %26&.$e**1111$X %,M$$7D%)]]4::<%@F(+(D(DV(LI#..55i@ %8 !& " !!'* "2" ::&F*GA4::% '$**, 6I!$!9!9)TZZPTEU!VJ%%j1NN3#5#5j#ABNN4( B >>&)DOO""3#=#=w#GHd#
O #Y ED;s0   +!S
S
2S
S
&S"7S"S(+S(c                    [        U R                  5      R                  5       nUc  [        nU R                  b  U R                  R                  5       U l        U R                  X!5        U R                  U5      nUR                  5       $ r$   )

VoltParserr8   parseTABLESr9   getGlyphOrderr;   rr   r   r   )r   ro   rn   feas       r   convertVoltToFea.convert   sn    ++,224>F::! $

 8 8 :D,$$V,yy{r   c                      UR                   n[        R                  " U R                  R                  X"5      5      $ ! [         a    Un N=f = fr$   )glyphAttributeErrorr   	GlyphNamer:   get)r   r   r%   s      r   
_glyphNameVoltToFea._glyphName   sF    	;;D }}T__00<==  	D	s   = AAc                      UR                   n[        R                  " U R                  UR                  5          5      $ ! [         a    Un N?f = fr$   )r+   r   r   r   r=   r&   )r   r+   r%   s      r   
_groupNameVoltToFea._groupName   sJ    	;;D !!$"4"4TZZ\"BCC  	D	s   ? AAc                 H   / nU GH  n[        U[        R                  5      (       a"  UR                  U R	                  U5      5        ME  [        U[        R
                  5      (       a"  UR                  U R                  U5      5        M  [        U[        R                  5      (       a"  UR                  U R                  U5      5        M  [        U[        R                  5      (       a*  UR                  UR                  UR                  45        GM  [        U5      e   U$ r$   )r(   r)   r   r   r   r*   r   Enum_enumRangestartendrk   )r   coverager   items       r   	_coverageVoltToFea._coverage   s    D$//T__T23D$..11T__T23D$)),,TZZ-.D$**--djj$((34)$//  r   c                 `    [         R                  " U R                  UR                  5      5      $ r$   )r   
GlyphClassr   r'   )r   r'   s     r   r   VoltToFea._enum  s    ~~dnnTYY788r   c                     / nU HC  nU R                  U5      n[        U[        [        45      (       d  U/nUR	                  U5        ME     U$ r$   )r   r(   tuplelistr   )r   contextoutr   r   s        r   _contextVoltToFea._context  sJ    D~~d+Hh66$:JJx 	 
 
r   c                     U R                  UR                  5      nU R                  UR                  5      n[        R
                  " X#5      nX@R                  UR                  R                  5       '   g r$   )rV   r%   r   r'   r   r   r=   r&   )r   r+   r%   glyphsr   s        r   ra   VoltToFea._groupDefinition  sQ    uzz*EJJ'--d;
1;5::++-.r   c                     U R                   UR                     U R                  UR                  '   UR
                  S;   a  UR
                  U R                  ;  a,  [        R                  " 5       U R                  UR
                  '   U R                  UR
                     R                  R                  U R                  UR                  5      5        UR
                  S:X  a&  U R                  R                  UR                  5        g UR
                  S:X  a$  UR                  U R                  UR                  '   g g ! [         a     GNf = f)Nr   r   r   )r;   idr:   r%   	TypeErrortyper<   r   r   r   r   r   rA   add
componentsrB   )r   r   s     r   rc   VoltToFea._glyphDefinition"  s    	*.*;*;EHH*EDOOEJJ' ::BBzz+),)9

5::&JJuzz"))001LM::KKOOEJJ'ZZ:%*/*:*:DOOEJJ' &  		s   0D> >
EEc                    UR                   nUR                   H  nUR                   nUR                   H  nUR                   Vs0 s H  ofR	                  S5      S   S_M     nnUR                   nXR
                  ;  a  0 U R
                  U'   X R
                  U   ;  a  0 U R
                  U   U'   X@R
                  U   U   ;  d   eUR                  5       U R
                  U   U   U'   M     M     g s  snf )N\r   T)tagr   r   lookupssplitr>   keys)	r   scriptr   langr   r   r   r   r   s	            r   ri   VoltToFea._scriptDefinition2  s    zzLLD88D==;B??K?a774=+T1?K{{~~-+-DNN4(~~d3313DNN4(.>>$#7#====3:<<>t$T*40 ) ! Ls   C6c                     UR                   R                  S5      (       a$  UR                  U R                  UR                   '   g [        R                  SUR                    35        g )N	COMPILER_zUnsupported setting ignored: )r%   
startswithvaluerE   logwarning)r   settings     r   rg   VoltToFea._settingDefinition@  sE    <<"";//+2==DNN7<<(KK7~FGr   c           	         Uu  p#pEpgU=(       a    UR                  5       =(       d    S nU=(       a    UR                  5       =(       d    S n	U=(       a    UR                  5       =(       d    S n
[        R                  " UUUU	U
US9$ )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   _adjustmentVoltToFea._adjustmentF  sy    AK>L"<}':':'<D
 9\%7%7%9AT	 9\%7%7%9AT	  !
 	
r   c                    Uu  p#pEpgU(       a   eU=(       a    UR                  5       =(       d    S nU=(       a    UR                  5       =(       d    S n	[        R                  " U=(       d    SU=(       d    SU=(       d    S U	=(       d    S S9$ )Nr   )xDeviceTableyDeviceTable)r   r   Anchor)
r   r   r   r   r   r   r   r   r   r   s
             r   _anchorVoltToFea._anchorV  sv    AK>L    9\%7%7%9AT	 9\%7%7%9AT	zzG!G!"*d"*d	
 	
r   c                 @   UR                   nUR                  nU R                  UR                  5      nUR	                  S5      (       au  SR                  UR                  S5      SS  5      n[        R                  " U R                  U5      5      nU R                  U5      n[        XdU5      nXR                  X24'   g X0R                  ;  a  0 U R                  U'   X R                  U   ;  a  0 U R                  U   U'   X@R                  U   U   UR                  '   g )NMARK_rM   rv   )r%   
glyph_namer  rl   r   joinr   r   	MarkClassrV   r   r   rC   rD   	component)	r   	anchordef
anchorname	glyphnameanchorr%   	markclassr   markdefs	            r   re   VoltToFea._anchorDefinitiond  s    ^^
((	imm,  ))88J,,S1!"56Ddood&;<IOOI.E))UCG9@y56-+-i(y!9979i(4HNMM)$Z01D1DEr   c                    UR                   nUR                  n[        U[        R                  5      (       Ga  UR
                  R                  5        H  u  u  pVu  pxUR                  US-
     n	UR                  US-
     n
SnX-    H&  n[        U[        R                  5      (       a  M$  SnM(     U R                  U	5      nU R                  U
5      nU R                  U5      nU R                  U5      n[        U5      S:X  d   e[        U5      S:X  d   eUR                  [        R                  " US   XS   UUS95        M     g [        U[        R                   5      (       ax  UR"                   Hg  u  nnU R                  U5      nU R                  U5      n[        U5      S:X  d   eUR                  [        R$                  " US   U4// / S5      5        Mi     g [        U[        R&                  5      (       Ga7  0 nUR(                   H  u  nnU H5  nUR+                  5        H  nUSU-   4nSU R,                  U   l        M      M7     [        R0                  " U R3                  U5      5      nUR4                   HD  nUR+                  5        H-  nUU;  a  / UU'   UUU   ;  d  M  UU   R                  U5        M/     MF     M     U GHc  nSnUU R6                  ;   a  U R6                  U   n/ nUU    H  n[        R0                  " U R3                  U5      5      n[9        SUS-   5       Hi  n[        U5      U:  a  UR                  / 5        S nUU R:                  U   U   ;   a  U R:                  U   U   U   nUUS-
     R                  UU45        Mk     M     U R=                  U5      nUU R>                  ;   a  [        R@                  " UUS   5      nOBUU R6                  ;   a  [        RB                  " UU5      nO[        RD                  " UUS   5      nUR                  U5        GMf     g [        U[        RF                  5      (       Gav  / n URH                   H4  n!U! H+  nUR+                  5        H  nU R                  U5        M     M-     M6     / n"URJ                   H4  n!U! H+  nUR+                  5        H  nU"R                  U5        M     M-     M6     U  H  nU R=                  U5      n#U R:                  U   S   S   n$S n%UU";   a5  U R:                  U   S   S   n%U"RM                  U"RO                  U5      5        UR                  [        RP                  " U#U$U%5      5        M     U" HP  nU R=                  U5      n#U R:                  U   S   S   n%UR                  [        RP                  " U#S U%5      5        MR     g [S        U5      e)	Nrv   FTr   )
enumeratedr  entryexit)*r^   rl   r(   r)   PositionAdjustPairDefinitionadjust_pairr   coverages_1coverages_2r*   r   r   lenr   r   PairPosStatementPositionAdjustSingleDefinitionadjust_singleSinglePosStatementPositionAttachDefinitioncoverage_toglyphSetrC   r   r  rV   r   rB   rangerD   r   rA   MarkMarkPosStatementMarkLigPosStatementMarkBasePosStatementPositionAttachCursiveDefinitioncoverages_entercoverages_exitpopindexCursivePosStatementrk   )&r   r   	fealookupr^   rl   idx1idx2pos1pos2
coverage_1
coverage_2r  r   glyphs1glyphs2record1record2abr   recordanchorsmarksr   markr%   r]   r  baser   r  r  enter_coverager   exit_coverager   r  r  s&                                         r   _gposLookupVoltToFea._gposLookupv  s>   ))
jjc4<<==.1oo.C.C.E*lt __TAX6
 __TAX6
 #
&3D%dDNN;;%)
 4 ..4..4**40**407|q(((7|q(((!!((
GQZZ# /F, T@@AA))1*))!,6{a'''!!**VAY,?+@"b%P	 * T::;;G$'OO y!D
 !%#Wy%896:))#.3 !0 "  MM$//)*DE	LLD $w.,.GDM$GDM9#DM00;	 !0 ) %4"  
4??*!%!6J#DMD #dood.C DI%*1j1n%=	u:	1!LL,!%$d(;D(AA%)]]4%8%>y%IFi!m,33VY4GH &> * t,4;;&33D%(CDT__,224?D33D%(CD!!$'/  0 TAABBN//$D $&--d3 !0 % 0 M..$D $%,,T2 !0 % / '-d+G4Q7=(==.v6q9D!%%m&9&9$&?@!!#"9"9%"MN ' &-}}T*6215!!#"9"9%t"LM &
 &c**r   c                 \   UR                   nUR                  (       a   eUR                  n[        U[        R
                  5      (       a  UR                  R                  5        H  u  u  pu  pU R                  UR                  U	S-
     5      nU R                  UR                  U
S-
     5      n[        U5      S:X  d   e[        U5      S:X  d   eUS   US   4nU(       a  [        R                  " X/U4/5      nOXf4n[        R                  " X/UU5      nUR                  U5        M     g [        U[        R                   5      (       a  [        R"                  " 5       /nUR$                   H+  u  nnU R                  U5      nUS   R'                  U5        M-     U(       a  [        R                  " X/U4/5      nO[        R                  " X/X6/5      nUR                  U5        g [        U[        R(                  5      (       a  [        R"                  " 5       /nUR*                   H)  u  nnUS   R'                  U R                  U5      5        M+     U(       a  [        R                  " X/U4/5      nO[        R                  " X/X6/5      nUR                  U5        g [-        U5      e)Nrv   r   )r^   reversalrl   r(   r)   r  r  r   r   r  r  r  r   IgnorePosStatementChainContextPosStatementr   r  r   r  r   r!  r"  rk   )r   r   prefixsuffixignorer.  targetlookupr^   rl   r/  r0  r1  r2  r5  r6  r   rq   r   r9  r:  r   r   rM   s                          r   _gposContextLookupVoltToFea._gposContextLookup  sI    ))
??""jjc4<<==.1oo.C.C.E*lt..)BC..)BC7|q(((7|q(((!!*gaj1 # 6 68P7Q RI+:G # < <!I !!), /F T@@AAnn&'F))1q)q	  ' * 22VV4L3MN	88FN	 i(T::;;nn&'F"!q	  !9:  / 22VV4L3MN	88FN	 i(%c**r   c           	      ^   UR                   nUR                  nUR                  R                  5        GH  u  pU	(       a  U
(       d/  UR                  u  pn[
        R                  U SU SU S35        MC  S nU R                  U	5      nU R                  U
5      nU(       a  X/U4n[        R                  " U/5      nGOZ[        U[        R                  5      (       a<  [        U5      S:X  d   e[        U5      S:X  d   e[        R                  " UUX#U5      nO[        U[        R                  5      (       a;  [        U5      S:X  d   e[        U5      S:X  d   e[        R                   " X#UU5      nO[        U[        R"                  5      (       a.  [        U5      S:X  d   e[        R$                  " X/S   UUU5      nOX[        U[        R&                  5      (       a.  [        U5      S:X  d   e[        R(                  " X/UUS   U5      nO[+        U5      eUR-                  U5        GM     g )N:z: Ignoring empty substitutionrv   r   )r^   rO   mappingr   locationr   r   r   r   IgnoreSubstStatementr(   r)   SubstitutionSingleDefinitionr  SingleSubstStatement+SubstitutionReverseChainingSingleDefinition ReverseChainSingleSubstStatementSubstitutionMultipleDefinitionMultipleSubstStatementSubstitutionLigatureDefinitionLigatureSubstStatementrk   r   )r   r   rH  rI  rJ  chainr.  r^   rO   r]   valpathlinecolumnrq   r   replacementschain_contexts                     r   _gsubLookupVoltToFea._gsubLookup  s   ))
jj))+HCc%(\\"FtfAdV1VH4QRSI^^C(F>>#.L!' 844m_E	C!B!BCC6{a'''<(A---44L&%	 C!Q!QRR6{a'''<(A---@@FL	 C!D!DEE6{a'''661Iv|U	 C!D!DEE<(A---66FLOU	 *#..i(G ,r   c           	      	   S nS nSnUR                   S:X  a  US-  nUR                  (       d  US-  nUR                  (       d  US-  nOc[        UR                  [        5      (       a  U R                  UR                  5      nO(UR                  b  U R                  UR                  5      nS nU(       d  Uc  Ub  [        R                  " XBU5      nSUR                  ;   Ga`  UR                  R                  S5      S   nUR                  5       U R                  ;  a  [        R                  " U R                  U5      5      nUb  UR                  R!                  U5        UR                  R!                  [        R"                  " SUR                  -   5      5        OU R                  UR                  5          nUR                  R!                  [        R$                  " 5       5        UR                  R!                  [        R"                  " SUR                  -   5      5        XpR                  UR                  5       '   Os[        R                  " U R                  UR                  5      5      nUb  UR                  R!                  U5        XpR                  UR                  R                  5       '   UR&                  b<  UR                  R!                  [        R"                  " SUR&                  -   5      5        / nUR(                  (       a  UR(                   H  n	U R+                  U	R,                  5      n
U R+                  U	R.                  5      nU	R0                  S:H  nUR!                  XUS	/5        U(       d  Me  [3        UR(                  5      S:X  d  M  UR!                  / / S	S
/5        M     OUR!                  / / S	S	/5        S nU GH  u  ppUR4                  b  U R7                  XXX5        UR8                  c  M6  U R:                  R=                  S5      (       a  S
Ul        U
(       d  U(       d  U(       d  U(       a  U(       du  Ucr  U R                  UR                  S-   5      n[        R                  " U5      n[A        US/ 5      Ul!        URB                  R!                  U5        U RE                  X5        U RG                  XXX}5        GM  U RE                  X5        GM     g )Nr   RTLrv         r   z# EXCEPT_CONTEXTFTCOMPILER_USEEXTENSIONLOOKUPSz targetr{   )$	directionprocess_baseprocess_marksr(   strr   mark_glyph_setr   LookupFlagStatementr%   r   r&   r?   LookupBlockrR   r^   r   r   SubtableStatementcommentsr   r   leftrightex_or_inr  rO   rb  rl   rE   r   use_extensionr   r{   rB  rL  )r   r   mark_attachementmark_filteringflagslookupflagsr%   r.  contextsr   rH  rI  rJ  rK  r[  
targetnames                   r   rm   VoltToFea._lookupDefinitionA  s   u$QJE""QJE ##QJE,,c22#v/C/CD"".!__V-B-BCN$0N4N11K 6;; ;;$$T*1-Dzz|4==0OOD,<,<T,BC	*((//<$$++CKKv{{8J,KL MM$**,7	$$++C,A,A,CD$$++CKKv{{8J,KL*3MM$**,'(8(8(EFI&$$++K81:MM&++++-.??&  ''D6??4J(KL>>!>>w||4w}}5 ))-== ?@ 6c&..1Q6OORUD$9: * OORUE23-5)FFzz%  Rzz%>>%%&DEE.2I+Vu!l&:%)%5%5fkkI6M%N
'*z'B,3Iy",M	)!))00>((>++	 $$V7% .6r   )rD   rG   r>   r8   r9   r<   r:   r;   r=   rB   rF   r?   rC   rA   rE   r$   )r   r   r   r   recompilerN   rU   r.   rR   rV   rr   r   r   r   r   r   r   r   ra   rc   ri   rg   r   r  re   rB  rL  rb  rm   r   r   r   r   r5   r5   X   s    **%67$78.('2B@D
>D9<; BH
 
O$l+\2+h')RQ8r   r5   c           
      4   SSK nSSKJn  SSKJn  UR                  S[        R                  S9nUR                  SSUS	S
9  UR                  SSUSS
9  UR                  SSS[        SSS9  UR                  SSSSS9  UR                  SSSS9  UR                  U 5      nU" UR                  (       a  SOSS9  UR                  nSn [        U5      nSU;   a(  [        US   R                  R!                  S5      5      nO["        R%                  S 5        g![)        Xg5      n UR+                  UR,                  5      n	[7        UR8                  S'5       nUR;                  U	5        SSS5        g! [&         a     Ndf = f! [.         a~  n
UR0                  (       a  e [3        U
R4                  S   S"S5      nS#U
 S$3nU(       a&  Uu  pn["        R%                  U S%U S%U S&U 35        O["        R%                  U5         Sn
A
g!Sn
A
ff = f! , (       d  f       g= f)(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   ro   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)levelTSIVzutf-8z6"TSIV" table is missing, font was not saved from VOLT?rv   rQ  "z" is not supportedrO  z: w)argparsepathlibr  	fontToolsr  ArgumentParsermain__doc__add_argumentr   
parse_argsquietr  r   r   datadecoder   errorr   r5   r   ro   rk   	tracebackr   argsopenr  write)r  r  r  r  parseroptionsrH   rI   	converterr   erQ  messager]  r^  r_  feafiles                    r   r  r    s,    &$$%4<< % F t2R   xd9N   I   i3P   l1K   %G7==f>==LDl#T>#DL$5$5$<$<W$EFLIINO ,-I/ 
g!!3	'7c 
(	'#    
166!9j$7aS*+!)DIIavQvhb	:;IIg
 
(	's=   8E.  E. "E> H	.
E;:E;>
HA4HH	
H__main__r$   )r  loggingr~  ior   fontTools.feaLibr   fontTools.ttLibr   r   fontTools.voltLibr)   fontTools.voltLib.parserr   r   	getLoggerr   r   r   r!   r5   r  r   sysr  r   r   r   <module>r     s   +Z  	    . ) 956	!#11  $z8 z8z?D zHHTV r   