Ë
    £ehYo  ã                   ó   — 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j0                   e«       «       yy)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y)ÚMarkClassDefinitionc                 ót   — d}t        | dd«      s|dz  }|t        j                  j                  | |«      z  }|S )NÚ ÚusedFú#)Úgetattrr   r   ÚasFea)ÚselfÚindentÚress      úY/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/fontTools/voltLib/voltToFea.pyr   zMarkClassDefinition.asFea=   s>   € ØˆÜ�t˜V UÔ+Ø�3‰JˆCØŒs×&Ñ&×,Ñ,¨T°6Ó:Ñ:ˆØˆ
ó    N)r   )Ú__name__Ú
__module__Ú__qualname__r   © r   r   r   r   <   s   „ ôr   r   c                   ó   — e Zd Zd„ Zd„ Zy)ÚGroupc                 ó  — |j                   j                  «       | _         |j                  j                  D �cg c]7  }t        |t        j
                  «      sŒ|j                  j                  «       ‘Œ9 c}| _        y c c}w ©N)ÚnameÚlowerÚenumÚ
isinstanceÚVAstÚ	GroupNameÚgroupÚgroups)r   r&   Úxs      r   Ú__init__zGroup.__init__G   sQ   € Ø—J‘J×$Ñ$Ó&ˆŒ	à%*§Z¡Z§_¡_ö
Ø !¼
À1ÄdÇnÁnÕ8UˆA�G‰G�M‰M�Oò
ˆ�ùò 
s   ¸A=ÁA=c                 óÎ   — | j                   |j                  v ry|j                   | j                  v ry| j                  r|j                  sy| j                  s|j                  ryy y )NTF)r    r'   )r   Úothers     r   Ú__lt__zGroup.__lt__M   sO   € Ø�9‰9˜Ÿ™Ñ$ØØ�:‰:˜Ÿ™Ñ$ØØ�;Š;˜uŸ|š|ØØ�{Š{˜uŸ|š|Øð  ,ˆ{r   N)r   r   r   r)   r,   r   r   r   r   r   F   s   „ ò
ó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y)Ú	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 | _        y 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)   zVoltToFea.__init__\   ss   € Ø)ˆÔØˆŒ
àˆŒØ ˆÔàˆŒ
ØˆÔØˆŒØˆŒä“eˆŒØˆŒàˆÔØˆŒàˆŒàˆÔØˆÕr   c                 ó  — || j                   vri| j                  j                  d|«      }|| j                   j                  «       v r"|dz  }|| j                   j                  «       v rŒ"|| j                   |<   | j                   |   S ©NÚ_)r>   Ú_NOT_LOOKUP_NAME_REÚsubÚvalues©r   r    r   s      r   Ú_lookupNamezVoltToFea._lookupNames   s‚   € Ø�t×)Ñ)Ñ)Ø×*Ñ*×.Ñ.¨s°DÓ9ˆCØ˜×+Ñ+×2Ñ2Ó4Ñ4Ø�s‘
�ð ˜×+Ñ+×2Ñ2Ó4Ò4à'*ˆD×Ñ˜tÑ$Ø×!Ñ! $Ñ'Ð'r   c                 ó  — || j                   vri| j                  j                  d|«      }|| j                   j                  «       v r"|dz  }|| j                   j                  «       v rŒ"|| j                   |<   | j                   |   S rC   )r?   Ú_NOT_CLASS_NAME_RErF   rG   rH   s      r   Ú
_classNamezVoltToFea._className{   s‚   € Ø�t×(Ñ(Ñ(Ø×)Ñ)×-Ñ-¨c°4Ó8ˆCØ˜×*Ñ*×1Ñ1Ó3Ñ3Ø�s‘
�ð ˜×*Ñ*×1Ñ1Ó3Ò3à&)ˆD×Ñ˜dÑ#Ø× Ñ  Ñ&Ð&r   c                 óˆ  — |j                   D �cg c]  }t        |t        j                  «      sŒ|‘Œ! }}t	        |d„ ¬«      D ]  }| j                  |«       Œ |j                   D ]÷  }t        |t        j                  «      r| j                  |«       Œ/t        |t        j                  «      rd|v sŒN| j                  |«       Œ`t        |t        j                  «      r| j                  |«       ŒŒt        |t        j                  «      rŒ§t        |t        j                  «      r| j                  |«       ŒÓt        |t        j                  «      rŒît        |«      ‚ |j                   D ]P  }t        |t        j                  «      sŒ|j                   rd|vrŒ/|j"                  rd|vrŒ@| j%                  |«       ŒR y c c}w )Nc                 ó   — t        | «      S r   )r   )r(   s    r   ú<lambda>z.VoltToFea._collectStatements.<locals>.<lambda>ˆ   s
   € ´e¸A³h€ r   ©Úkeyr
   r	   )Ú
statementsr#   r$   ÚGroupDefinitionÚsortedÚ_groupDefinitionÚGlyphDefinitionÚ_glyphDefinitionÚAnchorDefinitionÚ_anchorDefinitionÚSettingDefinitionÚ_settingDefinitionÚScriptDefinitionÚ_scriptDefinitionÚLookupDefinitionÚNotImplementedErrorÚposrF   Ú_lookupDefinition)r   ÚdocÚtablesÚsr'   Ú	statements         r   Ú_collectStatementszVoltToFea._collectStatementsƒ   sm  € ð !Ÿ^™^ÖS˜¬z¸!¼T×=QÑ=QÕ/R’!ÐSˆÐSÜ Ñ,>Ô?ò 	-ˆIØ×!Ñ! )Õ,ð	-ð Ÿ™ò 	5ˆIÜ˜)¤T×%9Ñ%9Ô:Ø×%Ñ% iÕ0Ü˜I¤t×'<Ñ'<Ô=Ø˜VÒ#Ø×*Ñ*¨9Õ5Ü˜I¤t×'=Ñ'=Ô>Ø×'Ñ'¨	Õ2Ü˜I¤t×';Ñ';Ô<ØÜ˜I¤t×'<Ñ'<Ô=Ø×&Ñ& yÕ1Ü 	¬4×+@Ñ+@ÕAÜ)¨)Ó4Ð4ð	5ð" Ÿ™ò 	2ˆIÜ˜)¤T×%:Ñ%:Õ;Ø—=’= V°6Ñ%9ØØ—=’= V°6Ñ%9ØØ×&Ñ& yÕ1ñ	2ùò+ Ts
   �F?¯F?c           	      óP	  — t        j                  «       }|j                  }| j                  rM|j	                  t        j
                  d«      «       |j                  | j                  j                  «       «       | j                  r]|j	                  t        j
                  d«      «       |j                  d„ t        | j                  j                  «       «      D «       «       | j                  rp|j	                  t        j
                  d«      «       | j                  j                  «       D ]/  }|j                  t        |dg «      «       |j	                  |«       Œ1 | j                  j                  «       }|D ]¡  }||   }|D ]k  }||   }	|	D ]5  }
|	|
   D �cg c]!  }|j                  «       | j                  v sŒ |‘Œ# c}|	|
<   Œ7 |	j                  «       D ��ci c]  \  }}|sŒ	||“Œ c}}||<   Œm |j                  «       D ��ci c]  \  }}|sŒ	||“Œ c}}||<   Œ£ |j                  «       D ��ci c]  \  }}|sŒ	||“Œ }}}|�rR|j	                  t        j
                  d«      «       |j                  «       D �]  \  }}t        j                   |«      }t        |d„ ¬«      }|D ]Û  }|j                  j	                  t        j"                  |«      «       t        ||   d	„ ¬«      }|D ]•  }
|
d
k(  rdnd}|j                  j	                  t        j$                  |
|¬«      «       ||   |
   D ]O  }| j                  |j                  «          }t        j&                  |«      }|j                  j	                  |«       ŒQ Œ— ŒÝ |j	                  |«       �Œ | j(                  réd|v råg }dD ]�  }|| j(                  v rld|j                  «       z   }t        j*                  || j(                  |   «      }|j	                  |«       |j	                  t        j,                  |«      «       Œ}|j	                  d «       Œ� t        j.                  d«      }|j                  j	                  t        j0                  |Ž «       |j	                  |«       |S c c}w c c}}w c c}}w c c}}w )Nz# Glyph classesz
# Mark classesc              3   ó&   K  — | ]	  }|d    –— Œ y­w)é   Nr   )Ú.0Úcs     r   ú	<genexpr>z.VoltToFea._buildFeatureFile.<locals>.<genexpr>®   s   è ø€ ÒN q˜a �dÑNùs   ‚z

# LookupsÚtargetsz
# Featuresc                 ó   — | dk(  rdS dS )NÚDFLTr   ri   r   ©Úks    r   rO   z-VoltToFea._buildFeatureFile.<locals>.<lambda>Æ   s   € ¸1Àº;°a€ ÈA€ r   rP   c                 ó   — | dk(  rdS dS )NÚdfltr   ri   r   rp   s    r   rO   z-VoltToFea._buildFeatureFile.<locals>.<lambda>É   s   € ÀQÈ&Â[À€ ÐVW€ r   rs   TF)Úinclude_defaultr   ©ÚBASEÚMARKÚLIGATUREÚ	COMPONENTÚGDEF_)r   ÚFeatureFilerR   r5   ÚappendÚCommentÚextendrG   r;   rT   Úitemsr7   r   r6   Úcopyr!   ÚFeatureBlockÚScriptStatementÚLanguageStatementÚLookupReferenceStatementr4   ÚGlyphClassDefinitionÚGlyphClassNameÚ
TableBlockÚGlyphClassDefStatement)r   rc   rb   rR   ÚlookupÚfeaturesÚftagÚscriptsÚstagÚlangsÚltagÚlÚtrd   ÚfÚfeatureÚstagsÚltagsrt   r    Ú	lookuprefÚclassesÚ	classnameÚ
glyphclassÚgdefs                            r   Ú_buildFeatureFilezVoltToFea._buildFeatureFile¤   s  € Ü�o‰oÓˆØ—^‘^ˆ
à×ÒØ×ÑœcŸk™kÐ*;Ó<Ô=Ø×Ñ˜d×0Ñ0×7Ñ7Ó9Ô:à×ÒØ×ÑœcŸk™kÐ*<Ó=Ô>Ø×ÑÑN¬F°4×3DÑ3D×3JÑ3JÓ3LÓ,MÔNÔNà�=Š=Ø×ÑœcŸk™k¨-Ó8Ô9ØŸ-™-×.Ñ.Ó0ò *�Ø×!Ñ!¤'¨&°)¸RÓ"@ÔAØ×!Ñ! &Õ)ð*ð
 —>‘>×&Ñ&Ó(ˆØò 	EˆDØ˜t‘nˆGØò F�Ø ™�Ø!ò Y�DØ.3°D©kÖ"X¨¸Q¿W¹W»YÈ$Ï-É-Ò=W¢1Ò"X�E˜$’KðYà27·+±+³-× E©$¨!¨QÂ1  A¡Ó E�˜’ð	Fð
 07¯}©}«×D¡t q¨!Â!˜a ™dÓDˆH�TŠNð	Eð &.§^¡^Ó%5×;™T˜Q º�A�q‘DÐ;ˆÑ;âØ×ÑœcŸk™k¨,Ó7Ô8Ø!)§¡Ó!1ó +‘��gÜ×*Ñ*¨4Ó0�Ü˜wÑ,MÔN�Ø!ò A�DØ×&Ñ&×-Ñ-¬c×.AÑ.AÀ$Ó.GÔHÜ" 7¨4¡=Ñ6WÔX�EØ %ò A˜Ø26¸&².©$Àe˜Ø×*Ñ*×1Ñ1Ü×1Ñ1°$ÈÔXôð %,¨D¡M°$Ñ$7ò A˜DØ%)§]¡]°4·:±:³<Ñ%@˜FÜ(+×(DÑ(DÀVÓ(L˜IØ#×.Ñ.×5Ñ5°iÕ@ñAñAðAð ×!Ñ! 'Ö*ð+ð" �:Š:˜& FÑ*ØˆGØAò )�Ø˜4Ÿ:™:Ñ%Ø '¨$¯*©*«,Ñ 6�IÜ!$×!9Ñ!9¸)ÀTÇZÁZÐPTÑEUÓ!V�JØ×%Ñ% jÔ1Ø—N‘N¤3×#5Ñ#5°jÓ#AÕBà—N‘N 4Õ(ð)ô —>‘> &Ó)ˆDØ�O‰O×"Ñ"¤3×#=Ñ#=¸wÐ#GÔHØ×Ñ˜dÔ#àˆ
ùòO #YùÛ EùÛDùÛ;s0   Æ!R
Æ;R
Ç
R
Ç%R
È
RÈRÈ2
R"È=R"c                 ó  — t        | j                  «      j                  «       }|€t        }| j                  �| j                  j                  «       | _        | j                  ||«       | j                  |«      }|j                  «       S r   )
Ú
VoltParserr0   ÚparseÚTABLESr1   ÚgetGlyphOrderr3   rf   r›   r   )r   rc   rb   Úfeas       r   ÚconvertzVoltToFea.convertæ   sp   € Ü˜×+Ñ+Ó,×2Ñ2Ó4ˆàˆ>ÜˆFØ�:‰:Ð!Ø $§
¡
× 8Ñ 8Ó :ˆDÔà×Ñ  VÔ,Ø×$Ñ$ VÓ,ˆØ�y‰y‹{Ðr   c                 óœ   — 	 |j                   }t        j                  | j                  j                  ||«      «      S # t        $ r |}Y Œ<w xY wr   )ÚglyphÚAttributeErrorr   Ú	GlyphNamer2   Úget)r   r¤   r    s      r   Ú
_glyphNamezVoltToFea._glyphNameò   sH   € ð	Ø—;‘;ˆDô �}‰}˜TŸ_™_×0Ñ0°°tÓ<Ó=Ð=øô ò 	ØŠDð	ús   ‚= ½AÁ
Ac                 óž   — 	 |j                   }t        j                  | j                  |j                  «          «      S # t        $ r |}Y Œ=w xY wr   )r&   r¥   r   r†   r5   r!   )r   r&   r    s      r   Ú
_groupNamezVoltToFea._groupNameù   sJ   € ð	Ø—;‘;ˆDô ×!Ñ! $×"4Ñ"4°T·Z±Z³\Ñ"BÓCÐCøô ò 	ØŠDð	ús   ‚> ¾AÁAc                 ó  — g }|D ]ÿ  }t        |t        j                  «      r!|j                  | j	                  |«      «       Œ>t        |t        j
                  «      r!|j                  | j                  |«      «       Œyt        |t        j                  «      r!|j                  | j                  |«      «       Œ´t        |t        j                  «      r(|j                  |j                  |j                  f«       Œöt        |«      ‚ |S r   )r#   r$   r¦   r|   r¨   r%   rª   ÚEnumÚ_enumÚRangeÚstartÚendr_   )r   Úcoverager   Úitems       r   Ú	_coveragezVoltToFea._coverage   s¸   € ØˆØò 
	0ˆDÜ˜$¤§¡Ô/Ø—‘˜TŸ_™_¨TÓ2Õ3Ü˜D¤$§.¡.Ô1Ø—‘˜TŸ_™_¨TÓ2Õ3Ü˜D¤$§)¡)Ô,Ø—‘˜TŸZ™Z¨Ó-Õ.Ü˜D¤$§*¡*Ô-Ø—‘˜dŸj™j¨$¯(©(Ð3Õ4ä)¨$Ó/Ð/ð
	0ð ˆr   c                 ó^   — t        j                  | j                  |j                  «      «      S r   )r   Ú
GlyphClassr³   r"   )r   r"   s     r   r­   zVoltToFea._enum  s   € Ü�~‰~˜dŸn™n¨T¯Y©YÓ7Ó8Ð8r   c                 óŽ   — g }|D ]=  }| j                  |«      }t        |t        t        f«      s|g}|j	                  |«       Œ? |S r   )r³   r#   ÚtupleÚlistr~   )r   ÚcontextÚoutr²   r±   s        r   Ú_contextzVoltToFea._context  sL   € ØˆØò 	!ˆDØ—~‘~ dÓ+ˆHÜ˜h¬´¨Ô6Ø$˜:�Ø�J‰J�xÕ ð		!ð
 ˆ
r   c                 óê   — | j                  |j                  «      }| j                  |j                  «      }t	        j
                  ||«      }|| j                  |j                  j                  «       <   y r   )rL   r    r­   r"   r   r…   r5   r!   )r   r&   r    Úglyphsr™   s        r   rU   zVoltToFea._groupDefinition  sU   € Ø�‰˜uŸz™zÓ*ˆØ—‘˜EŸJ™JÓ'ˆÜ×-Ñ-¨d°FÓ;ˆ
à1;ˆ×Ñ˜5Ÿ:™:×+Ñ+Ó-Ò.r   c                 óŽ  — 	 | j                   |j                     | j                  |j                  <   |j
                  dv rŽ|j
                  | j                  vr+t        j                  «       | j                  |j
                  <   | j                  |j
                     j                  j                  | j                  |j                  «      «       |j
                  dk(  r&| j                  j                  |j                  «       y |j
                  dk(  r$|j                  | j                  |j                  <   y y # t        $ r Y �Œw xY w)Nru   rw   rx   )r3   Úidr2   r    Ú	TypeErrorÚtyper4   r   rµ   r½   r|   r¨   r9   ÚaddÚ
componentsr:   )r   r¤   s     r   rW   zVoltToFea._glyphDefinition"  së   € ð	Ø*.×*;Ñ*;¸E¿H¹HÑ*EˆD�O‰O˜EŸJ™JÑ'ð �:‰:ÐBÑBØ�z‰z §¡Ñ+Ü),¯©Ó)9�—
‘
˜5Ÿ:™:Ñ&Ø�J‰J�u—z‘zÑ"×)Ñ)×0Ñ0°·±ÀÇÁÓ1LÔMà�:‰:˜ÒØ�K‰K�O‰O˜EŸJ™JÕ'Ø�Z‰Z˜:Ò%Ø*/×*:Ñ*:ˆD�O‰O˜EŸJ™JÒ'ð &øô ò 	Úð	ús   ‚0D7 Ä7	EÅEc                 óä  — |j                   }|j                  D ]Ð  }|j                   }|j                  D ]³  }|j                  D �ci c]  }|j	                  d«      d   d“Œ }}|j                   }|| j
                  vri | j
                  |<   || j
                  |   vri | j
                  |   |<   || j
                  |   |   vsJ ‚|j                  «       | j
                  |   |   |<   Œµ ŒÒ y c c}w )Nú\r   T)ÚtagrŽ   rŠ   ÚlookupsÚsplitr6   Úkeys)	r   Úscriptr�   Úlangr�   r“   r�   rÇ   r‹   s	            r   r]   zVoltToFea._scriptDefinition2  sî   € Ø�z‰zˆØ—L‘Lò 
	BˆDØ—8‘8ˆDØŸ=™=ò B�Ø;B¿?¹?ÖK°a˜1Ÿ7™7 4›=¨Ñ+¨TÑ1ÐK�ÐKØ—{‘{�Ø˜tŸ~™~Ñ-Ø+-�D—N‘N 4Ñ(Ø˜tŸ~™~¨dÑ3Ñ3Ø13�D—N‘N 4Ñ(¨Ñ.Ø 4§>¡>°$Ñ#7¸Ñ#=Ñ=Ð=Ð=Ø3:·<±<³>�—‘˜tÑ$ TÑ*¨4Ò0ñBñ
	Bùò Ls   ÁC-c                 óÆ   — |j                   j                  d«      r$|j                  | j                  |j                   <   y t        j                  d|j                   › �«       y )NÚ	COMPILER_zUnsupported setting ignored: )r    Ú
startswithÚvaluer=   ÚlogÚwarning)r   Úsettings     r   r[   zVoltToFea._settingDefinition@  sB   € Ø�<‰<×"Ñ" ;Ô/Ø+2¯=©=ˆD�N‰N˜7Ÿ<™<Ò(ä�K‰KÐ7¸¿¹°~ÐFÕGr   c                 óÚ   — |\  }}}}}}|xr |j                  «       xs d }|xr |j                  «       xs d }	|xr |j                  «       xs 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ÒA¸Tˆ	Ø Ò9 \×%7Ñ%7Ó%9ÒA¸Tˆ	ä�‰ØØØØ Ø Ø!ô
ð 	
r   c                 óÎ   — |\  }}}}}}|rJ ‚|xr |j                  «       xs d }|xr |j                  «       xs d }	t        j                  |xs d|xs d|xs d |	xs 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ÒA¸Tˆ	Ø Ò9 \×%7Ñ%7Ó%9ÒA¸Tˆ	ä�z‰zØŠG�!ØŠG�!Ø"Ò* dØ"Ò* dô	
ð 	
r   c                 ó8  — |j                   }|j                  }| j                  |j                  «      }|j	                  d«      rwdj                  |j                  d«      dd  «      }t        j                  | j                  |«      «      }| j                  |«      }t        |||«      }|| j                  ||f<   y || j                  vri | j                  |<   || j                  |   vri | j                  |   |<   || j                  |   |   |j                  <   y )NÚMARK_rD   ri   )r    Ú
glyph_namerê   r`   rÎ   ÚjoinrÈ   r   Ú	MarkClassrL   r¨   r   r;   r<   Ú	component)	r   Ú	anchordefÚ
anchornameÚ	glyphnameÚanchorr    Ú	markclassr¤   Úmarkdefs	            r   rY   zVoltToFea._anchorDefinitiond  sú   € Ø—^‘^ˆ
Ø×(Ñ(ˆ	Ø—‘˜iŸm™mÓ,ˆà× Ñ  Ô)Ø—8‘8˜J×,Ñ,¨SÓ1°!°"Ð5Ó6ˆDÜŸ™ d§o¡o°dÓ&;Ó<ˆIØ—O‘O IÓ.ˆEÜ)¨)°V¸UÓCˆGØ9@ˆD×Ñ˜y¨*Ð5Ò6à §¡Ñ-Ø+-�—‘˜iÑ(Ø §¡¨yÑ!9Ñ9Ø79�—‘˜iÑ(¨Ñ4ØHNˆD�M‰M˜)Ñ$ ZÑ0°×1DÑ1DÒEr   c           
      ó  — |j                   }|j                  }t        |t        j                  «      �r	|j
                  j                  «       D ]ë  \  \  }}\  }}|j                  |dz
     }	|j                  |dz
     }
d}|	|
z   D ]  }t        |t        j                  «      rŒd}Œ! | j                  |	«      }| j                  |
«      }| j                  |«      }| j                  |«      }t        |«      dk(  sJ ‚t        |«      dk(  sJ ‚|j                  t        j                  |d   ||d   ||¬«      «       Œí y t        |t        j                   «      rt|j"                  D ]d  \  }}| j                  |«      }| j                  |«      }t        |«      dk(  sJ ‚|j                  t        j$                  |d   |fgg g d«      «       Œf y t        |t        j&                  «      �ri }|j(                  D ]«  \  }}|D ]2  }|j+                  «       D ]  }|d|z   f}d| j,                  |   _        Œ Œ4 t        j0                  | j3                  |«      «      }|j4                  D ]<  }|j+                  «       D ]'  }||vrg ||<   |||   vsŒ||   j                  |«       Œ) Œ> Œ­ |D �]Q  }d}|| j6                  v r| j6                  |   }g }||   D ]�  }t        j0                  | j3                  |«      «      }t9        d|dz   «      D ]e  }t        |«      |k  r|j                  g «       d }|| j:                  |   |   v r| j:                  |   |   |   }||dz
     j                  ||f«       Œg ŒŸ | j=                  |«      }|| j>                  v rt        j@                  ||d   «      }n>|| j6                  v rt        jB                  ||«      }nt        jD                  ||d   «      }|j                  |«       �ŒT y t        |t        jF                  «      �rbg } |jH                  D ]/  }!|!D ](  }|j+                  «       D ]  }| j                  |«       Œ Œ* Œ1 g }"|jJ                  D ]/  }!|!D ](  }|j+                  «       D ]  }|"j                  |«       Œ Œ* Œ1 | D ]‰  }| j=                  |«      }#| j:                  |   d   d   }$d }%||"v r5| j:                  |   d   d   }%|"jM                  |"jO                  |«      «       |j                  t        jP                  |#|$|%«      «       Œ‹ |"D ]N  }| j=                  |«      }#| j:                  |   d   d   }%|j                  t        jP                  |#d |%«      «       ŒP y tS        |«      ‚)	Nri   FTr   )Ú
enumeratedrì   ÚentryÚexit)*rR   r`   r#   r$   ÚPositionAdjustPairDefinitionÚadjust_pairr   Úcoverages_1Úcoverages_2r%   r³   rå   Úlenr|   r   ÚPairPosStatementÚPositionAdjustSingleDefinitionÚadjust_singleÚSinglePosStatementÚPositionAttachDefinitionÚcoverage_toÚglyphSetr;   r   rï   rL   r±   r:   Úranger<   r¨   r9   ÚMarkMarkPosStatementÚMarkLigPosStatementÚMarkBasePosStatementÚPositionAttachCursiveDefinitionÚcoverages_enterÚcoverages_exitÚpopÚindexÚCursivePosStatementr_   )&r   r‰   Ú	fealookuprR   r`   Úidx1Úidx2Úpos1Úpos2Ú
coverage_1Ú
coverage_2rø   r²   Úglyphs1Úglyphs2Úrecord1Úrecord2ÚaÚbr½   ÚrecordÚanchorsÚmarksr˜   Úmarkr    rQ   rõ   ÚbaserÃ   rð   rô   Úenter_coverager±   Úexit_coverager¤   rù   rú   s&                                         r   Ú_gposLookupzVoltToFea._gposLookupv  s�  € Ø×)Ñ)ˆ
à�j‰jˆÜ�cœ4×<Ñ<Õ=Ø.1¯o©o×.CÑ.CÓ.Eò Ñ*‘��t™l˜t TØ Ÿ_™_¨T°A©XÑ6�
Ø Ÿ_™_¨T°A©XÑ6�
ð #�
Ø&¨Ñ3ò *�DÜ% d¬D¯N©NÕ;Ø%)™
ð*ð Ÿ.™.¨Ó4�ØŸ.™.¨Ó4�Ø×*Ñ*¨4Ó0�Ø×*Ñ*¨4Ó0�Ü˜7“| qÒ(Ð(Ð(Ü˜7“| qÒ(Ð(Ð(Ø×!Ñ!Ü×(Ñ(Ø ™
 G¨W°Q©Z¸ÈZôõñ#ô, ˜œT×@Ñ@ÔAØ×)Ñ)ò ‘��1ØŸ™¨Ó*�Ø×)Ñ)¨!Ó,�Ü˜6“{ aÒ'Ð'Ð'Ø×!Ñ!Ü×*Ñ*¨V°A©Y¸Ð,?Ð+@À"ÀbÈ%ÓPõñ	ô ˜œT×:Ñ:Õ;ØˆGØ$'§O¡Oò <Ñ ��yØ!ò ;�Dð
 !%§¡£ò ;˜Ø# W¨yÑ%8Ð9˜Ø6:˜×)Ñ)¨#Ñ.Õ3ñ;ð;ô  ŸM™M¨$¯/©/¸)Ó*DÓE�	ØŸL™Lò <�DØ $§¡£ò <˜Ø wÑ.Ø,.˜G D™MØ$¨G°D©MÒ9Ø# D™M×0Ñ0°Õ;ñ	<ñ<ð<ð"  ó (�Ø�
Ø˜4Ÿ?™?Ñ*Ø!%§¡°Ñ!6�Jà�Ø# D™Mò I�DÜ #§¡¨d¯o©o¸dÓ.CÓ D�IÜ%*¨1¨j¸1©nÓ%=ò I˜	Ü˜u›:¨	Ò1Ø!ŸL™L¨Ô,Ø!%˜Ø$¨¯©°dÑ(;¸DÑ(AÑAØ%)§]¡]°4Ñ%8¸Ñ%>¸yÑ%I˜FØ˜i¨!™mÑ,×3Ñ3°V¸YÐ4GÕHñIðIð —‘ tÓ,�Ø˜4Ÿ;™;Ñ&Ü×3Ñ3°D¸%À¹(ÓC‘DØ˜TŸ_™_Ñ,Ü×2Ñ2°4¸Ó?‘Dä×3Ñ3°D¸%À¹(ÓC�DØ×!Ñ! $Ö'ñ/(ô0 ˜œT×AÑAÕBàˆNØ×/Ñ/ò 4�Ø$ò 4�DØ $§¡£ò 4˜Ø&×-Ñ-¨dÕ3ñ4ñ4ð4ð ˆMØ×.Ñ.ò 3�Ø$ò 3�DØ $§¡£ò 3˜Ø%×,Ñ,¨TÕ2ñ3ñ3ð3ð 'ò O�ØŸ™¨Ó-�ØŸ™ dÑ+¨GÑ4°QÑ7�Ø�Ø˜=Ñ(ØŸ=™=¨Ñ.¨vÑ6°qÑ9�DØ!×%Ñ% m×&9Ñ&9¸$Ó&?Ô@Ø×!Ñ!¤#×"9Ñ"9¸%ÀÈÓ"MÕNðOð &ò N�ØŸ™¨Ó-�Ø—}‘} TÑ*¨6Ñ2°1Ñ5�Ø×!Ñ!¤#×"9Ñ"9¸%ÀÀtÓ"LÕMñNô
 & cÓ*Ð*r   c                 ó  — |j                   }|j                  rJ ‚|j                  }t        |t        j
                  «      rÞ|j                  j                  «       D ]À  \  \  }	}
\  }}| j                  |j                  |	dz
     «      }| j                  |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                  ||||«      }|j                  |«       ŒÂ y t        |t        j                   «      r•t        j"                  «       g}|j$                  D ]*  \  }}| j                  |«      }|d   j'                  |«       Œ, |rt        j                  |||fg«      }nt        j                  ||||g«      }|j                  |«       y t        |t        j(                  «      r“t        j"                  «       g}|j*                  D ](  \  }}|d   j'                  | j                  |«      «       Œ* |rt        j                  |||fg«      }nt        j                  ||||g«      }|j                  |«       y t-        |«      ‚)Nri   r   )rR   Úreversalr`   r#   r$   rû   rü   r   r³   rý   rþ   rÿ   r   ÚIgnorePosStatementÚChainContextPosStatementr|   r  rµ   r  r~   r  r  r_   )r   r‰   ÚprefixÚsuffixÚignorer  ÚtargetlookuprR   r`   r  r  r  r  r  r  r½   re   rÇ   r  r  r¤   r±   rD   s                          r   Ú_gposContextLookupzVoltToFea._gposContextLookupä  sd  € ð ×)Ñ)ˆ
à—?’?Ð"Ð"à�j‰jˆÜ�cœ4×<Ñ<Ô=Ø.1¯o©o×.CÑ.CÓ.Eò -Ñ*‘��t™l˜t TØŸ.™.¨¯©¸À¹Ñ)BÓC�ØŸ.™.¨¯©¸À¹Ñ)BÓC�Ü˜7“| qÒ(Ð(Ð(Ü˜7“| qÒ(Ð(Ð(Ø! !™* g¨a¡jÐ1�áÜ #× 6Ñ 6¸ÀÈÐ8PÐ7QÓ R‘Ià+¨\Ð:�GÜ #× <Ñ <Ø ¨°ó!�Ið ×!Ñ! )Õ,ñ-ô ˜œT×@Ñ@ÔAÜ—n‘nÓ&Ð'ˆFØ×)Ñ)ò (‘��1ØŸ™ qÓ)�Ø�q‘	× Ñ  Õ'ð(ñ Ü×2Ñ2°V¸VÀVÐ4LÐ3MÓN‘	ä×8Ñ8Ø˜F F¨\¨Nó�	ð ×Ñ˜iÕ(Ü˜œT×:Ñ:Ô;Ü—n‘nÓ&Ð'ˆFØ"Ÿ™ò ;‘�˜!Ø�q‘	× Ñ  §¡°Ó!9Õ:ð;ñ Ü×2Ñ2°V¸VÀVÐ4LÐ3MÓN‘	ä×8Ñ8Ø˜F F¨\¨Nó�	ð ×Ñ˜iÕ(ä% cÓ*Ð*r   c           	      ó
  — |j                   }|j                  }|j                  j                  «       D �]Í  \  }	}
|	r|
s/|j                  \  }}}t
        j                  |› d|› d|› d�«       Œ:d }| j                  |	«      }| j                  |
«      }|r|||f}t        j                  |g«      }�n@t        |t        j                  «      r:t        |«      dk(  sJ ‚t        |«      dk(  sJ ‚t        j                  |||||«      }nìt        |t        j                  «      r9t        |«      dk(  sJ ‚t        |«      dk(  sJ ‚t        j                   ||||«      }n™t        |t        j"                  «      r-t        |«      dk(  sJ ‚t        j$                  ||d   |||«      }nRt        |t        j&                  «      r-t        |«      dk(  sJ ‚t        j(                  ||||d   |«      }nt+        |«      ‚|j-                  |«       �ŒÐ y )Nú:z: Ignoring empty substitutionri   r   )rR   rF   Úmappingr   ÚlocationrÐ   rÑ   r³   r   ÚIgnoreSubstStatementr#   r$   ÚSubstitutionSingleDefinitionrÿ   ÚSingleSubstStatementÚ+SubstitutionReverseChainingSingleDefinitionÚ ReverseChainSingleSubstStatementÚSubstitutionMultipleDefinitionÚMultipleSubstStatementÚSubstitutionLigatureDefinitionÚLigatureSubstStatementr_   r|   )r   r‰   r*  r+  r,  Úchainr  rR   rF   rQ   ÚvalÚpathÚlineÚcolumnre   r½   ÚreplacementsÚchain_contexts                     r   Ú_gsubLookupzVoltToFea._gsubLookup  só  € Ø×)Ñ)ˆ
à�j‰jˆØŸ™×)Ñ)Ó+ó #	)‰HˆC�Ù™cØ%(§\¡\Ñ"��d˜FÜ—‘˜t˜f A d V¨1¨V¨HÐ4QÐRÔSØØˆIØ—^‘^ CÓ(ˆFØŸ>™>¨#Ó.ˆLÙØ!'¨°Ð 8�Ü×4Ñ4°m°_ÓE’	Ü˜C¤×!BÑ!BÔCÜ˜6“{ aÒ'Ð'Ð'Ü˜<Ó(¨AÒ-Ð-Ð-Ü×4Ñ4Ø˜L¨&°&¸%ó‘	ô ˜C¤×!QÑ!QÔRÜ˜6“{ aÒ'Ð'Ð'Ü˜<Ó(¨AÒ-Ð-Ð-Ü×@Ñ@Ø˜F F¨Ló‘	ô ˜C¤×!DÑ!DÔEÜ˜6“{ aÒ'Ð'Ð'Ü×6Ñ6Ø˜F 1™I v¨|¸Uó‘	ô ˜C¤×!DÑ!DÔEÜ˜<Ó(¨AÒ-Ð-Ð-Ü×6Ñ6Ø˜F F¨L¸©O¸Uó‘	ô *¨#Ó.Ð.Ø×Ñ˜iÖ(ñG#	)r   c           	      óJ	  — d }d }d}|j                   dk(  r|dz  }|j                  s|dz  }|j                  s|dz  }n]t        |j                  t        «      r| j                  |j                  «      }n'|j                  �| j                  |j                  «      }d }|s|€|�t        j                  |||«      }d|j                  v �rZ|j                  j                  d«      d   }|j                  «       | j                  vr}t        j                  | j                  |«      «      }|�|j                  j!                  |«       |j                  j!                  t        j"                  d|j                  z   «      «       n…| j                  |j                  «          }|j                  j!                  t        j$                  «       «       |j                  j!                  t        j"                  d|j                  z   «      «       || j                  |j                  «       <   nrt        j                  | j                  |j                  «      «      }|�|j                  j!                  |«       || j                  |j                  j                  «       <   |j&                  �;|j                  j!                  t        j"                  d|j&                  z   «      «       g }|j(                  r�|j(                  D ]�  }	| j+                  |	j,                  «      }
| j+                  |	j.                  «      }|	j0                  dk(  }|j!                  |
||d	g«       |sŒ`t3        |j(                  «      dk(  sŒy|j!                  g g d	d
g«       Œ� n|j!                  g g d	d	g«       d }|D �]   \  }
}}}|j4                  �| j7                  ||
||||«       |j8                  €Œ8| j:                  j=                  d«      rd
|_        |
s|s|s|r�|st|€r| j                  |j                  dz   «      }t        j                  |«      }tA        |dg «      |_!        |jB                  j!                  |«       | jE                  ||«       | jG                  ||
||||«       Œï| jE                  ||«       �Œ y )Nr   ÚRTLri   é   é   rÅ   z# ÚEXCEPT_CONTEXTFTÚCOMPILER_USEEXTENSIONLOOKUPSz targetrm   )$Ú	directionÚprocess_baseÚprocess_marksr#   Ústrrª   Úmark_glyph_setr   ÚLookupFlagStatementr    rÈ   r!   r7   ÚLookupBlockrI   rR   r|   r}   ÚSubtableStatementÚcommentsr¹   r»   ÚleftÚrightÚex_or_inrÿ   rF   rC  r`   r=   r§   Úuse_extensionr   rm   r%  r.  )r   r‰   Úmark_attachementÚmark_filteringÚflagsÚlookupflagsr    r  Úcontextsr¹   r*  r+  r,  r-  r<  Ú
targetnames                   r   ra   zVoltToFea._lookupDefinitionA  sè  € ØÐØˆàˆØ×Ñ˜uÒ$Ø�Q‰JˆEØ×"Ò"Ø�Q‰JˆEð ×#Ò#Ø�Q‰J‰EÜ˜×,Ñ,¬cÔ2Ø#Ÿ™¨v×/CÑ/CÓDÑØ×"Ñ"Ð.Ø!Ÿ_™_¨V×-BÑ-BÓCˆNàˆÙÐ$Ð0°NÐ4NÜ×1Ñ1ØÐ'¨óˆKð �6—;‘;Òð —;‘;×$Ñ$ TÓ*¨1Ñ-ˆDØ�z‰z‹| 4§=¡=Ñ0ÜŸO™O¨D×,<Ñ,<¸TÓ,BÓC�	ØÐ*Ø×(Ñ(×/Ñ/°Ô<Ø×$Ñ$×+Ñ+¬C¯K©K¸¸v¿{¹{Ñ8JÓ,KÕLà ŸM™M¨$¯*©*«,Ñ7�	Ø×$Ñ$×+Ñ+¬C×,AÑ,AÓ,CÔDØ×$Ñ$×+Ñ+¬C¯K©K¸¸v¿{¹{Ñ8JÓ,KÔLØ*3ˆD�M‰M˜$Ÿ*™*›,Ò'äŸ™¨×(8Ñ(8¸¿¹Ó(EÓFˆIØÐ&Ø×$Ñ$×+Ñ+¨KÔ8Ø1:ˆD�M‰M˜&Ÿ+™+×+Ñ+Ó-Ñ.à�?‰?Ð&Ø× Ñ ×'Ñ'¬¯©°D¸6¿?¹?Ñ4JÓ(KÔLàˆØ�>Š>Ø!Ÿ>™>ò ;�ØŸ™ w§|¡|Ó4�ØŸ™ w§}¡}Ó5�Ø ×)Ñ)Ð-=Ñ=�Ø—‘ ¨°¸Ð ?Ô@ò œc &§.¡.Ó1°QÓ6Ø—O‘O R¨¨U°DÐ$9Õ:ñ;ð �O‰O˜R  U¨EÐ2Ô3àˆØ-5ó 	8Ñ)ˆF�F˜F EØ�z‰zÐ%Ø× Ñ  ¨°¸ÀÈ	ÔRà�z‰zÑ%Ø—>‘>×%Ñ%Ð&DÔEØ.2�IÔ+Ù™V¡u±Ù! lÐ&:Ø%)×%5Ñ%5°f·k±kÀIÑ6MÓ%N˜
Ü'*§¡°zÓ'B˜Ü,3°I¸yÈ"Ó,M˜	Ô)Ø!×)Ñ)×0Ñ0°Ô>Ø×(Ñ(¨°Ô>Ø×+Ñ+Ø ¨°¸	À<õð ×$Ñ$ V¨YÖ7ñ%	8r   r   )r   r   r   ÚreÚcompilerE   rK   r)   rI   rL   rf   r›   r¢   r¨   rª   r³   r­   r»   rU   rW   r]   r[   rå   rê   rY   r%  r.  rC  ra   r   r   r   r.   r.   X   s    „ Ø$˜"Ÿ*™*Ð%6Ó7ÐØ#˜Ÿ™Ð$7Ó8Ðóò.(ò'ò2òB@óD
ò>òDòò9òò<ò;ò BòHò
ò 
òOò$l+ò\2+òh')óRQ8r   r.   c           
      ó4  — ddl }ddlm} ddlm} |j                  dt        j                  ¬«      }|j                  dd|d	¬
«       |j                  dd|d¬
«       |j                  dddt        dd¬«       |j                  dddd¬«       |j                  ddd¬«       |j                  | «      } ||j                  rdnd¬«       |j                  }d}	 t        |«      }d|v r(t        |d   j                  j!                  d«      «      }nt"        j%                  d «       y!	 t)        ||«      }	 |j+                  |j,                  «      }	t7        |j8                  d'«      5 }|j;                  |	«       ddd«       y# t&        $ r Y Œdw xY w# t.        $ ru}
|j0                  r‚ t3        |
j4                  d   d"d«      }d#|
› d$�}|r'|\  }}}t"        j%                  |› d%|› d%|› d&|› �«       nt"        j%                  |«       Y d}
~
y!d}
~
ww xY w# 1 sw Y   yxY w)(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|   rc   z:List of tables to write, by default all tables are written)ÚactionÚchoicesÚdestrf  z-qz--quietÚ
store_truezSuppress non-error messages)ri  rf  z--tracebacku   Donâ€™t catch exceptionsÚERRORÚINFO)ÚlevelÚTSIVzutf-8z6"TSIV" table is missing, font was not saved from VOLT?ri   r2  ú"z" is not supportedr0  z: Úw)ÚargparseÚpathlibr`  Ú	fontToolsra  ÚArgumentParserÚmainÚ__doc__Úadd_argumentrŸ   Ú
parse_argsÚquietrc  r   r   ÚdataÚdecoderÐ   Úerrorr   r.   r¢   rc   r_   Ú	tracebackr   ÚargsÚopenrg  Úwrite)r€  rs  r`  ra  ÚparserÚoptionsr@   rA   Ú	converterr¡   Úer2  Úmessager>  r?  r@  Úfeafiles                    r   rw  rw  •  s>  € ó Ýå&à×$Ñ$Ø%´4·<±<ð %ó €Fð ×ÑØ˜ tÐ2Rð ô ð ×ÑØ˜x¨dÐ9Nð ô ð ×ÑØØØÜØØIð ô ð ×ÑØˆi Ð3Pð ô ð ×ÑØ˜lÐ1Kð ô ð ×Ñ Ó%€Gá 7§=¢=™°fÕ>à—=‘=€LØ€DðÜ�lÓ#ˆØ�T‰>Ü# D¨¡L×$5Ñ$5×$<Ñ$<¸WÓ$EÓF‰Lä�I‰IÐNÔOØð ô ˜,¨Ó-€IðØ×Ñ §¡Ó/ˆô 
ˆg×!Ñ! 3Ó	'ð ¨7Ø�‰�cÔ÷ð øô# ò Ùðûô ò 
Ø×ÒØÜ˜1Ÿ6™6 !™9 j°$Ó7ˆØ�a�SÐ*Ð+ˆÙØ!)ÑˆD�$˜Ü�I‰I˜˜˜a ˜v Q v h¨b°°	Ð:Õ;ä�I‰I�gÔÜûð
ú÷ð ús8   ÃAE> Ä2F Å#HÅ>	F
Æ	F
Æ	HÆA+HÈHÈHÚ__main__r   )rx  Úloggingr]  Úior   ÚfontTools.feaLibr   ÚfontTools.ttLibr   r   ÚfontTools.voltLibr$   ÚfontTools.voltLib.parserr   r�   Ú	getLoggerrÐ   rŸ   r   r   r.   rw  r   Úsysrú   r   r   r   ú<module>r’     s‹   ðñ+óZ Û 	Ý å  ß .Ý )Ý 9à€g×ÑÐ5Ó6€â	!€ô˜#×1Ñ1ô ÷ñ ÷$z8ñ z8óz?ðD ˆzÒÛà€C‡H�H‰T‹VÕð r   