
    (phŎ                     (   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  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
 rS r " S S\R,                  5      r " S S5      rSS jr\S:X  a  SSKr\R8                  " \" 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)TopologicalSorter)ast)TTFont
TTLibError)ParserzfontTools.voltLib.voltToFea)GDEFGSUBGPOSc                    / n[        U [        [        45      (       a%  U  H  nUR                  [	        U5      5        M     U$ [        U S5      (       a&  UR                  [	        U R                  5      5        U$ UR                  U 5        U$ )Nenum)
isinstancetuplelistextend_flatten_grouphasattrr   append)groupretitems      N/var/www/html/venv/lib/python3.13/site-packages/fontTools/voltLib/voltToFea.pyr   r   =   sx    
C%%''DJJ~d+,  J	 
		

>%**-. J 	

5J    c                    U  Vs0 s H  oR                   R                  5       U_M     nnU  VVs0 s Hq  nUR                   R                  5       [        U5       Vs/ s H>  n[        U[        R
                  5      (       d  M$  UR                  R                  5       PM@     sn_Ms     nnn[        U5      nUR                  5        Vs/ s H  obU   PM	     sn$ s  snf s  snf s  snnf s  snf N)	namelowerr   r   VAst	GroupNamer   r   static_order)groupsr   	group_mapxgraphsorterr   s          r   sort_groupsr&   L   s    8>?u!!#U*I?  E 	

#E*
*!T^^, AGGMMO*
 	

  
  u%F(.(;(;(=>(=dO(=>> @
 ?s(   $C,C##CC!C#C)C#c                   ,   ^  \ rS rSrSU 4S jjrSrU =r$ )LookupZ   c                 4   > [         TU ]  XU5        / U l        g r   )super__init__chained)selfr   use_extensionlocation	__class__s       r   r,   Lookup.__init__[   s    h7r   )r-   )FN)__name__
__module____qualname____firstlineno__r,   __static_attributes____classcell__)r1   s   @r   r(   r(   Z   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S jrS	 rSS
 jrS rS rS 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g) 	VoltToFea`   z[^A-Za-z_0-9.]z[^A-Za-z_0-9.\-]Nc                 R   [        U[        R                  5      (       a  US sU l        U l        OS UsU l        U 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   )r   r   VoltFile_doc_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__d   s    lDMM22,8$)DIt),0,)DIt)
 
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_)rM   _NOT_LOOKUP_NAME_REsubvaluesr.   r   ress      r   _lookupNameVoltToFea._lookupName~   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   $ rS   )rN   _NOT_CLASS_NAME_RErV   rW   rX   s      r   
_classNameVoltToFea._className   sz    ((())--c48C**1133s
 **1133&)d#  &&r   c                 ^   UR                    H5  n[        U[        R                  5      (       d  M$  U R	                  U5        M7     UR                    Vs/ s H&  n[        U[        R
                  5      (       d  M$  UPM(     nn[        U5       H  nU R                  U5        M     UR                    H  n[        U[        R                  5      (       a  SU;   a  U R                  U5        M;  M=  [        U[        R                  5      (       a  U R                  XC5        Mo  [        U[        R                  [        R
                  45      (       a  M  [        U[        R                  5      (       a  U R                  U5        M  [        U[        R                  5      (       a  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 )Nr   r
   )
statementsr   r   GlyphDefinition_glyphDefinitionGroupDefinitionr&   _groupDefinitionAnchorDefinition_anchorDefinitionSettingDefinition_settingDefinitionScriptDefinition_scriptDefinitionLookupDefinitionNotImplementedErrorposrV   _lookupDefinition)r.   doctablesignore_unsupported_settings	statementsr!   r   s           r   _collectStatementsVoltToFea._collectStatements   s   I)T%9%9::%%i0 ( !^^S^z!T=Q=Q/R!^S (E!!%( ) I)T%:%:;;V#**95 $It'='=>>''	OI(<(<d>R>R'STT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                  (       ar  UR	                  [         R
                  " S5      5        U R                  R                  5        H/  nUR                  UR                  5        UR	                  U5        M1     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a  UR	                  [         R
                  " S5      5        UR                  5        GH  u  pg[         R                   " U5      n[        US S9nUS:X  a)  [#        U5      S	:  a  [$        R'                  S
5        US S	 nU GH'  nUS:w  a/  UR                  R	                  [         R(                  " U5      5        [        Xx   S S9nUS:X  a)  [#        U5      S	:  a  [$        R'                  S5        US S	 nU H  n
US:w  aG  U
S:X  a  SOSnUR                  R	                  [         R*                  " U
R-                  S5      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     GM*     UR	                  U5        GM     U R0                  (       a  SU;   a  / nS H  nUU R0                  ;   ao  SUR                  5       -   n[         R2                  " UU R0                  U   5      nUR	                  U5        UR	                  [         R4                  " U5      5        M  UR	                  S 5        M     [         R6                  " S5      nUR                  R	                  [         R8                  " 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   N ).0cs     r   	<genexpr>.VoltToFea._buildFeatureFile.<locals>.<genexpr>   s     N,Mqd,Ms   z

# Lookupsz
# Featuresc                     U S:X  a  S$ S$ )NDFLTr   rz   r{   ks    r   <lambda>-VoltToFea._buildFeatureFile.<locals>.<lambda>   s    fA<SRS<Sr   )keyaaltrz   zvFEA syntax does not allow script statements in 'aalt' feature, so only lookups from the first script will be included.c                     U S:X  a  S$ S$ )Ndfltr   rz   r{   r   s    r   r   r      s    1;a&=A&=r   zzFEA syntax does not allow language statements in 'aalt' feature, so only lookups from the first language will be included.r   TF   )include_defaultr	   BASEMARKLIGATURE	COMPONENTGDEF_)r   FeatureFilera   rD   r   Commentr   rW   rJ   sorteditemsrF   r-   rE   copyr   FeatureBlocklenlogwarningScriptStatementLanguageStatementljustLookupReferenceStatementrC   GlyphClassDefinitionGlyphClassName
TableBlockGlyphClassDefStatement)r.   rq   rp   ra   lookupfeaturesfeature_tagscripts
script_taglangslanguage_tagltrt   ffeaturescript_tagslanguage_tagsr   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!!&..1!!&) 1
 >>&&(#K+G%
+$)L#(#6+#6a'')t}}:T#6+E' %* 9>&Ktqt&K# & 7>mmo$KodaTQTo$KH! $ &.^^%5;%5TQDAD%5;ckk,78(0(8$**;7$W2ST&(S-=-AKKR #.bq/K"-J"f,**11#2E2Ej2QR$*+=%M #f,]1Ca1GX )6bq(9(5&&06Bf6LdRWO#..55 # 5 5$0$6$6q$94C!" %,$7$ED%)]]4::<%@F(+(D(DV(LI#..55i@ %F )6 #.4 !!'*G )9J ::&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#
{+ 'L$K;s0   *!U
U
1U
U
%U6UU"*U"c                 T   U R                   c(  [        U R                  5      R                  5       U l         U R                   nUc  [        nU R
                  b  U R
                  R                  5       U l        U R                  X1U5        U R                  U5      nUR                  5       $ r   )r>   
VoltParserr?   parseTABLESr@   getGlyphOrderrB   ru   r   asFea)r.   rq   rr   rp   feas        r   convertVoltToFea.convert
  s    99"4#5#56<<>DIii>F::! $

 8 8 :D-HI$$V,yy{r   c                      UR                   n[        R                  " U R                  R                  X"5      5      $ ! [         a    Un N=f = fr   )glyphAttributeErrorr   	GlyphNamerA   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   rD   r   )r.   r   r   s      r   
_groupNameVoltToFea._groupName  sJ    	;;D !!$"4"4TZZ\"BCC  	D	s   ? AAc                     UR                  5        Vs/ s H;  n[        U[        [        R                  45      (       a  U R                  U5      OUPM=     sn$ s  snf r   )glyphSetr   strr   r   r   )r.   r   r#   s      r   	_glyphSetVoltToFea._glyphSet&  sR     ]]_
$ $.a#t~~1F#G#GT__QQN$
 	
 
s   AAc                    / 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                  SS9nU(       a  UR                  U5        M  UR                  [        R                  " U5      5        GM  [        U[        R                  5      (       aT  U R                  U5      nU(       a  UR                  U5        GML  UR                  [        R                  " U5      5        GMt  [        U5      e   U$ NTflatten)r   r   r   r   r   r   r   Enum	_coverager   r   r   
GlyphClassRanger   rm   )r.   coverager   r   r   s        r   r   VoltToFea._coverage,  s    D$//T__T23D$..11T__T23D$)),,~~dii~>LL&LL!56D$**--~~d+LL&LL!56)$//% & r   c                     / nU HO  nU R                  USS9n[        U5      S:  a  [        R                  " U5      nOUS   nUR	                  U5        MQ     U$ )NTr   rz   r   )r   r   r   r   r   )r.   contextoutr   r   s        r   _contextVoltToFea._contextC  sY    D~~dD~9H8}q >>(3#A;JJx   
r   c                 &   U R                  UR                  5      nU R                  UR                  R                  SS9n[        R
                  " U5      n[        R                  " X$5      nXPR                  UR                  R                  5       '   g r   )	r^   r   r   r   r   r   r   rD   r   )r.   r   r   glyphsr   classdefs         r   re   VoltToFea._groupDefinitionN  sg    uzz*

>^^F+
++D=19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   )rB   idrA   r   	TypeErrortyperC   r   r   r   r   r   rH   add
componentsrI   )r.   r   s     r   rc   VoltToFea._glyphDefinitionU  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splitrE   keys)	r.   scriptstaglangltagr   r   r   ftags	            r   rk   VoltToFea._scriptDefinitione  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 U(       d#  [        R                  SUR                    35        g g )N	COMPILER_zUnsupported setting ignored: )r   
startswithvaluerL   r   r   )r.   settingignore_unsupporteds      r   ri   VoltToFea._settingDefinitions  sM    <<"";//+2==DNN7<<(#KK7~FG $r   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._adjustmenty  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._anchor  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X0R                  ;  a  0 U R                  U'   UR                  S5      (       a  US S USS  R                  5       -   nOUR                  5       nX R                  U   ;  a  0 U R                  U   U'   X@R                  U   U   UR                  '   g )NMARK_   )r   
glyph_namer  rn   rK   r   r   	component)r.   	anchordef
anchorname	glyphnameanchors        r   rg   VoltToFea._anchorDefinition  s    ^^
((	imm,MM)')DMM)$  ))#BQ*QR.*>*>*@@J#))+J]]95535DMM)$Z0DJi ,Y-@-@Ar   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(     T R                  U	5      nT R                  U
5      nT R                  U5      nT 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T R                  U5      nT 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a  0 n[)        5       nUR*                   GHs  u  nnT R-                  U SUR.                   35      n[        R0                  " U5      nUR3                  5       n[)        5       nU H"  nUR5                  UR7                  5       5        M$     UR9                  U5      (       d  UR;                  U5        U(       d  M  UR5                  U5        U HU  nT R=                  U5      nT R>                  U   SU 3   S   n[        R@                  " UUU5      n U T RB                  UU4'   MW     URD                   HH  n!U!R7                  5        H1  n"U"U;  a  / UU"'   UU4UU"   ;  d  M  UU"   R                  UU45        M3     MJ     GMv     [G        U 4S jU 5       5      n#[G        U 4S	 jU 5       5      n$U GH5  n"Sn%U#(       a  T RH                  U"   n%[K        U%5       V&s/ s H  n&/ PM     nn&UU"    Hx  u  nn[        R0                  " U5      n[K        SU%S-   5       HI  n'U'T R>                  U"   U   ;   d  M  T R>                  U"   U   U'   nUU'S-
     R                  UU45        MK     Mz     T R=                  U"5      n!U$(       a  [        RL                  " U!US   5      nO9U#(       a  [        RN                  " U!U5      nO[        RP                  " U!US   5      nUR                  U5        GM8     g [        U[        RR                  5      (       Gav  / n(URT                   H4  nU H+  n!U!R7                  5        H  n"U(R                  U"5        M     M-     M6     / n)URV                   H4  nU H+  n!U!R7                  5        H  n"U)R                  U"5        M     M-     M6     U( H  n"T R=                  U"5      nT R>                  U"   S
   S   n*S n+U"U);   a5  T R>                  U"   S   S   n+U)RY                  U)R[                  U"5      5        UR                  [        R\                  " UU*U+5      5        M     U) HP  n"T R=                  U"5      nT R>                  U"   S   S   n+UR                  [        R\                  " US U+5      5        MR     g [_        U5      es  sn&f )Nrz   FTr   )
enumerated.r  c              3   @   >#    U  H  oTR                   ;   v   M     g 7fr   )rI   r|   nr.   s     r   r~   (VoltToFea._gposLookup.<locals>.<genexpr>  s     DGq4??2G   c              3   @   >#    U  H  oTR                   ;   v   M     g 7fr   )rH   r$  s     r   r~   r&    s     <Gqt{{*Gr'  entryexit)0ra   rn   r   r   PositionAdjustPairDefinitionadjust_pairr   coverages_1coverages_2r   r   r  r   r   r   PairPosStatementPositionAdjustSingleDefinitionadjust_singleSinglePosStatementPositionAttachDefinitionrG   coverage_tor^   r   	MarkClassr   updater   
isdisjointdifference_updater   rK   MarkClassDefinitionrJ   r   allrI   rangeMarkMarkPosStatementMarkLigPosStatementMarkBasePosStatementPositionAttachCursiveDefinitioncoverages_entercoverages_exitpopindexCursivePosStatementrm   ),r.   r   	fealookupra   rn   idx1idx2pos1pos2
coverage_1
coverage_2r!  r   glyphs1glyphs2record1record2abr   recordanchorsallmarksr   r  r   	markclassmarksmarkr  r   r  markdefbaser   is_ligatureis_markr   rT   r  enter_coverageexit_coverager)  r*  s,   `                                           r   _gposLookupVoltToFea._gposLookup  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uH(+$* !OOzl!FKK=,IJ	MM)4	 (--/
 $DLL1 %''11++H5  &!&I OOI6E!]]95j\6JKANF!55iOG@GD%%y)&<=	 "'  LLD $w.,.GDM&	2'$-G#DM00*i1HI	 !0 )C )8P DGDDK<G<<G
!%!6J%*:%67%6%67'.t}OD) #i 8I%*1j1n%=	$d(;D(AA%)]]4%8%>y%IF!)a-0778KL &> (5 t,33D%(CD 224?D33D%(CD!!$')  * 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**] 8s   %Zc                 *   UR                   n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[        R                  " X/X6U/5      nUR                  U5        M     g [        U[        R                  5      (       a  [        R                   " 5       /nUR"                   H(  u  nnUS   R%                  U R                  USS9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SS95        M*     U(       a  [        R                  " X/U4/5      nO[        R                  " X/X6/5      nUR                  U5        g [+        U5      e)Nrz   r   Tr   )ra   rn   r   r   r+  r,  r   r   r-  r.  r   r   IgnorePosStatementChainContextPosStatementr   r0  r   r1  r   r3  r4  rm   )r.   r   prefixsuffixignorerE  r-   ra   rn   rF  rG  rH  rI  rL  rM  r   rs   rP  rT   r   s                       r   _gposContextLookupVoltToFea._gposContextLookup+  s8   ))
jjc4<<==.1oo.C.C.E*lt..)BC..)BC7|q(((7|q(((!!*gaj1 # 6 68P7Q RI # < <'0B!I !!), /F T@@AAnn&'F))1q	  4!@A * 22VV4L3MN	88FI	 i(T::;;nn&'F"!q	  $!GH  / 22VV4L3MN	88FI	 i(%c**r   c                 	  ^ UR                   nUR                  n[        U[        R                  5      (       Gau  0 nUR
                  R                  5        H  u  pgU(       a  U(       d/  UR                  u  pn
[        R                  U SU	 SU
 S35        MB  U R                  U5      nU R                  U5      n[        U5      S:X  d   e[        US   R                  5       US   R                  5       5       HV  u  pUR                  [        U R!                  U5      5      / 5      R#                  [        U R!                  U5      5      5        MX     M     UR                  5        HC  u  p[$        R&                  " / U/ [$        R(                  " U5      5      nUR#                  U5        ME     g UR
                  R                  5        GH  u  pgU(       a  U(       d/  UR                  u  pn
[        R                  U SU	 SU
 S35        MC  U R                  U5      nU R                  U5      n[        U[        R*                  5      (       aL  [        U5      S:X  d   e[        U5      S:X  d   eUR#                  [$        R,                  " X/ / S5      5        M  [        U[        R.                  5      (       a  M  [        U[        R0                  5      (       a?  [        U5      S:X  d   eUR#                  [$        R2                  " / US   / U5      5        GMO  [        U[        R4                  5      (       Ga  [        U5      S:X  d   e[$        R6                  " / U/ US   S5      n[9        S U 5       5      mTS:  Ga1  [;        U4S jU 5       5      (       d   eU Vs/ s H  nUR                  5       PM     nnU Vs/ s H  n[        U5      S:X  a	  US   /T-  OUPM     nnUS   R                  5       n[        U5      S:X  a	  US   /T-  n[        U5      T:  d   eUR#                  [$        R<                  " SU 35      5        [        / UQUP76  HS  nU Vs/ s H  nU R!                  U5      PM     nnUR#                  [$        R6                  " / US S	 / US	   S5      5        MU     GM  UR#                  U5        GM  [?        U5      e   g s  snf s  snf s  snf )
N:: Ignoring empty substitutionrz   r   Fc              3   T   #    U  H  n[        UR                  5       5      v   M      g 7fr   r   r   )r|   r#   s     r   r~   (VoltToFea._gsubLookup.<locals>.<genexpr>  s     :6aAJJL))6s   &(c              3   `   >#    U  H#  n[        UR                  5       5      TS 4;   v   M%     g7fry   rl  )r|   r#   r%  s     r   r~   rm    s%     KFqs1::<0QF:Fs   +.# ) ra   rV   r   r   SubstitutionAlternateDefinitionmappingr   r0   r   r   r   r   zipr   
setdefaultr   r   r   r   AlternateSubstStatementr   SubstitutionSingleDefinitionSingleSubstStatement+SubstitutionReverseChainingSingleDefinitionSubstitutionMultipleDefinitionMultipleSubstStatementSubstitutionLigatureDefinitionLigatureSubstStatementmaxr:  r   rm   )r.   r   rE  ra   rV   
alternatesr   valpathlinecolumnr   replacements	src_glyph
repl_glyphr   rs   r#   replacementzippedr%  s                       @r   _gsubLookupVoltToFea._gsubLookupY  sE   ))
jj
 c4??@@JKK--/#),&DKK4&$q8U VW,#~~c26{a'''-01I&&(,q/*B*B*D.)I ))#dooi.H*I2NUUDOOJ78. 0 (2'7'7'9#77r3>>,#?	 !!),	 (:
 ))+HCc%(\\"FtfAdV1VH4QRS^^C(F>>#.L#t@@AA6{a'''<(A---!!,,V2r5Q C!Q!QRRC!D!DEE6{a'''!!..r6!9b,O C!D!DEE<(A---66LOU	 :6::q5KFKKKKK4:;FqajjlFF;JPQ&QSVq[!vza?&FQ #/q/":":"<K;'1,'21~&6&:{+q000 %%ckkByk2B&CD"%";v";{";>D!Ef$//!"4f!E"))66 "F3BKVBZ #< %%i0)#..{ ,F <Q  "Fs   S?$SSc           	         UR                   nUR                  n[        U[        R                  5      (       a  UR
                  R                  5        H  u  pU	(       a  U
(       d/  UR                  u  pn[        R                  U SU SU S35        MB  U R                  U	5      nU R                  U
5      nUR                  [        R                  " X#X5      5        M     / Ul        g [        U[        R                  [        R                   [        R"                  [        R$                  45      (       d  ['        [)        U5      5      e/ nUR
                  R                  5        Ha  u  pU	(       a  U
(       d/  UR                  u  pn[        R                  U SU SU S35        MB  UR+                  U R                  U	SS95        Mc     [-        U5      S:  a  [        R.                  " U5      /nU(       a)  UR                  [        R0                  " X.U4/5      5        g UR                  [        R2                  " X.X6/5      5        g )Nri  rj  Tr   rz   )ra   rV   r   r   rx  rr  r   r0   r   r   r   r   r    ReverseChainSingleSubstStatementr-   rv  ry  r{  rq  rm   r   r   r   r   IgnoreSubstStatementChainContextSubstStatement)r.   r   rc  rd  re  rE  r-   ra   rV   r   r  r  r  r  r   r  s                   r   _gsubContextLookupVoltToFea._gsubContextLookup  s   ))
jjc4KKLLKK--/#),&DKK4&$q8U VW,#~~c2!!88 0 !#I11333344	
 
 &d3i00))+HCc%(\\"FtfAdV1VH4QRSMM$..d.;< , v;?nnV,-Fc668P7QRS..vvyQ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nU R                  R                  S5      (       a  SnS	UR                  ;   GaT  UR                  R                  S	5      S   nUR                  5       U R                  ;  at  [        U R!                  U5      US
9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        XR                  UR                  5       '   Og[        U R!                  UR                  5      US
9nUb  UR"                  R%                  U5        XR                  UR                  R                  5       '   UR*                  b<  UR"                  R%                  [        R&                  " SUR*                  -   5      5        / n	UR,                   H  n
U R/                  U
R0                  5      nU R/                  U
R2                  5      nU
R4                  S:H  nU	R%                  XU/5        U(       d  Md  [7        UR,                  5      S:X  d  M  U	R%                  / / S/5        M     U	(       a  [        R8                  " U R!                  UR                  S-   5      US
9nUR:                  R%                  U5        UR<                  b  U R?                  X5        OUR@                  b  U RC                  X5        U	 HJ  u  pnUR<                  b  U RE                  XXX5        M(  UR@                  c  M7  U RG                  XXX5        ML     g UR<                  b  U R?                  X5        g UR@                  b  U RC                  X5        g g )Nr   RTLrz         FCOMPILER_USEEXTENSIONLOOKUPSTr   )r/   ro  EXCEPT_CONTEXTz chained)$	directionprocess_baseprocess_marksr   r   r   mark_glyph_setr   LookupFlagStatementrL   r   r   r   r   rF   r(   rZ   ra   r   r   SubtableStatementcommentsr   r   leftrightex_or_inr   LookupBlockr-   rV   r  rn   r^  r  rf  )r.   r   mark_attachementmark_filteringflagslookupflagsr/   r   rE  contextsr   rc  rd  re  r-   s                  r   ro   VoltToFea._lookupDefinition  s   u$QJE""QJE ##QJE,,c22#v/C/CD"".!__V-B-BCN$0N4N11K >><== M6;; ;;$$T*1-Dzz|4==0"$$T*"/	 *((//<$$++CKKv{{8J,KL MM$**,7	$$++C,A,A,CD$$++CKKv{{8J,KL*3MM$**,'  -+I &$$++K81:MM&++++-.??&  ''D6??4J(KL~~G]]7<<0F]]7==1F%%)99FOOVV45 v#fnn-2R0 & oo  z!9:+G $$W-zz%  1'  1*2&::)++	 ZZ+++	 +3 zz%  3'  3 (r   )rK   rN   r>   rE   r?   r@   rC   rA   rB   rD   rI   rM   rF   rJ   rH   rL   r   )F)NF) r3   r4   r5   r6   recompilerU   r]   r,   rZ   r^   ru   r   r   r   r   r   r   r   re   rc   rk   ri   r  r  rg   r^  rf  r  r  ro   r7   r{   r   r   r:   r:   `   s    **%67$784('"2HVp>D
.	:; BH
 
KC+J,+\]/~0d]4r   r:   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   rq   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?rz   r0   "z" is not supportedri  z: w)argparsepathlibr  	fontToolsr  ArgumentParsermain__doc__add_argumentr   
parse_argsquietr  r   r   datadecoder   errorr   r:   r   rq   rm   	tracebackgetattrargsopenr  write)r  r  r  r  parseroptionsrO   rP   	converterr   er0   messager  r  r  feafiles                    r   r  r  J  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   graphlibr   fontTools.feaLibr   fontTools.ttLibr   r   fontTools.voltLibr   fontTools.voltLib.parserr   r   	getLoggerr   r   r   r&   r  r(   r:   r  r3   sysr*  r{   r   r   <module>r     s   +Z  	  &   . ) 956	!	?S__ g4 g4T?D zHHTV r   