
    ]Mh!                       d dl m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ZdZg dZd	 Z eg d
          Zd Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d  d!e          Z G d" d#e          Z G d$ d%e          Z G d& d'e          Z  G d( d)e          Z! G d* d+e          Z" G d, d-e          Z# G d. d/e          Z$ G d0 d1e          Z% G d2 d3e          Z& G d4 d5e          Z' G d6 d7e          Z( G d8 d9e          Z) G d: d;e          Z* G d< d=e          Z+ G d> d?e          Z, G d@ dAe          Z- G dB dCe          Z. G dD dEe          Z/ G dF dGe          Z0 G dH dIe          Z1 G dJ dKe          Z2 G dL dMe          Z3 G dN dOe          Z4 G dP dQe          Z5 G dR dSe          Z6 G dT dUe          Z7 G dV dWe          Z8 G dX dYe          Z9 G dZ d[e          Z: G d\ d]e          Z; G d^ d_e          Z< G d` dae          Z= G db dce          Z> G dd dee          Z? G df dge          Z@ G dh die          ZA G dj dke          ZB G dl dme          ZC G dn doe          ZD G dp dqe          ZEdr ZF G ds dte          ZG G du dveG          ZH G dw dxeG          ZI G dy dze          ZJ G d{ d|eG          ZK G d} d~e          ZL G d de          ZM G d de          ZN G d de          ZO G d de          ZP G d de          ZQ G d de          ZR G d de          ZS G d de          ZT G d de          ZU G d de          ZV G d de          ZWdS )    )FeatureLibError)FeatureLibLocation)getEncoding)byteordtobytes)OrderedDictNz    )BElementFeatureFileComment	GlyphName
GlyphClassGlyphClassNameMarkClassNameAnonymousBlockBlockFeatureBlockNestedBlockLookupBlockGlyphClassDefinitionGlyphClassDefStatement	MarkClassMarkClassDefinitionAlternateSubstStatementAnchorAnchorDefinitionAttachStatementAxisValueLocationStatementBaseAxisCVParametersNameStatementChainContextPosStatementChainContextSubstStatementCharacterStatementConditionsetStatementCursivePosStatementElidedFallbackNameElidedFallbackNameID
ExpressionFeatureNameStatementFeatureReferenceStatementFontRevisionStatement	HheaFieldIgnorePosStatementIgnoreSubstStatementIncludeStatementLanguageStatementLanguageSystemStatementLigatureCaretByIndexStatementLigatureCaretByPosStatementLigatureSubstStatementLookupFlagStatementLookupReferenceStatementMarkBasePosStatementMarkLigPosStatementMarkMarkPosStatementMultipleSubstStatement
NameRecordOS2FieldPairPosStatement ReverseChainSingleSubstStatementScriptStatementSinglePosStatementSingleSubstStatementSizeParameters	StatementSTATAxisValueStatementSTATDesignAxisStatementSTATNameStatementSubtableStatement
TableBlockValueRecordValueRecordDefinition	VheaFieldc                 N    | dS dd                     d | D                       z  S )Nz<device NULL>z<device %s>, c              3       K   | ]	}d |z  V  
dS )z%d %dN ).0ts     T/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/fontTools/feaLib/ast.py	<genexpr>z!deviceToString.<locals>.<genexpr>T   s&      (E(E1(E(E(E(E(E(E    )join)devices    rQ   deviceToStringrV   P   s2    ~tyy(E(Ef(E(E(EEEEErS   )4anchor	anchordefanon	anonymousbycontourcursiverU   enum	enumerateexcludedfltexclude_dfltfeaturefromignoreignorebaseglyphsignoreligaturesignoremarksincludeincludedfltinclude_dfltlanguagelanguagesystemlookup
lookupflagmarkmarkattachmenttype	markclassnameidnull
parameterspospositionrequiredrighttoleft
reversesubrsubscriptsub
substitutesubtabletableusemarkfilteringsetuseextensionvaluerecorddefbasegdefheadhheanamevheavmtxc                 :   t          | d          r|                                 S t          | t                    rAt	          |           dk    r.t          | d                   dz   t          | d                   z   S |                                 t          v rd| z   S | S )NasFea   r   z -    \)hasattrr   
isinstancetuplelenlowerfea_keywords)gs    rQ   r   r      s    q' wwyy	Au		 #a&&A++QqT{{U"U1Q4[[00	
l	"	"axrS   c                   .    e Zd ZdZddZd Zd	dZd ZdS )
r	   z8A base class representing "something" in a feature file.Nc                 T    |rt          |t                    s	t          | }|| _        d S N)r   r   locationselfr   s     rQ   __init__zElement.__init__   s1     	5Jx1CDD 	5)84H rS   c                     d S r   rN   r   builders     rQ   buildzElement.build   s    rS    c                     t           )zReturns this element as a string of feature code. For block-type
        elements (such as :class:`FeatureBlock`), the `indent` string is
        added to the start of each line in the output.)NotImplementedErrorr   indents     rQ   r   zElement.asFea   s
     "!rS   c                 *    |                                  S r   r   r   s    rQ   __str__zElement.__str__   s    zz||rS   r   r   )__name__
__module____qualname____doc__r   r   r   r   rN   rS   rQ   r	   r	      s`        BB! ! ! !  " " " "    rS   r	   c                       e Zd ZdS )rB   Nr   r   r   rN   rS   rQ   rB   rB              DrS   rB   c                       e Zd ZdS )r'   Nr   rN   rS   rQ   r'   r'      r   rS   r'   c                   ,     e Zd ZdZd fd	ZddZ xZS )r   zA comment in a feature file.Nc                 f    t          t          |                               |           || _        d S r   )superr   r   text)r   r   r   	__class__s      rQ   r   zComment.__init__   s,    gt%%h///			rS   r   c                     | j         S r   )r   r   s     rQ   r   zComment.asFea   s
    yrS   r   r   r   r   r   r   r   r   __classcell__r   s   @rQ   r   r      sW        &&     
       rS   r   c                   (    e Zd ZdZddZd ZddZdS )		NullGlyphz5The NULL glyph, used in glyph deletion substitutions.Nc                 <    t                               | |           d S r   )r'   r   r   s     rQ   r   zNullGlyph.__init__   s    D(+++++rS   c                     dS )BThe glyphs in this class as a tuple of :class:`GlyphName` objects.rN   rN   r   s    rQ   glyphSetzNullGlyph.glyphSet   s    rrS   r   c                     dS )NNULLrN   r   s     rQ   r   zNullGlyph.asFea   s    vrS   r   r   r   r   r   r   r   r   r   rN   rS   rQ   r   r      sQ        ??, , , ,       rS   r   c                   (    e Zd ZdZddZd ZddZdS )	r   z)A single glyph name, such as ``cedilla``.Nc                 J    t                               | |           || _        d S r   )r'   r   glyph)r   r   r   s      rQ   r   zGlyphName.__init__   s#    D(+++


rS   c                     | j         fS r   )r   r   s    rQ   r   zGlyphName.glyphSet   s    
}rS   r   c                 *    t          | j                  S r   )r   r   r   s     rQ   r   zGlyphName.asFea   s    TZ   rS   r   r   r   rN   rS   rQ   r   r      sQ        33   
  ! ! ! ! ! !rS   r   c                   F    e Zd ZdZddZd ZddZd Zd Zd	 Z	d
 Z
d ZdS )r   z1A glyph class, such as ``[acute cedilla grave]``.Nc                 n    t                               | |           ||ng | _        g | _        d| _        d S )Nr   )r'   r   glyphsoriginalcurr)r   r   r   s      rQ   r   zGlyphClass.__init__   s:    D(+++ & 2ff			rS   c                 *    t          | j                  S r   )r   r   r   s    rQ   r   zGlyphClass.glyphSet   s    T[!!!rS   r   c                    t          | j                  r| j        t          | j                  k     rE| j                            | j        | j        d                     t          | j                  | _        dd                    t          t          | j                            z   dz   S dd                    t          t          | j                            z   dz   S )N[ ])r   r   r   r   extendrT   mapr   r   s     rQ   r   zGlyphClass.asFea   s    t} 	Ay3t{++++$$T[%=>>>,,	#eT]";";<<<sBB#eT["9"9:::S@@rS   c                 :    | j                             |           dS )z6Add a list of :class:`GlyphName` objects to the class.N)r   r   )r   r   s     rQ   r   zGlyphClass.extend   s    6"""""rS   c                 :    | j                             |           dS )z4Add a single :class:`GlyphName` object to the class.N)r   append)r   r   s     rQ   r   zGlyphClass.append   s    5!!!!!rS   c                 6   | j         t          | j                  k     r,| j                            | j        | j         d                    | j                            ||f           | j                            |           t          | j                  | _         dS )a  Add a range (e.g. ``A-Z``) to the class. ``start`` and ``end``
        are either :class:`GlyphName` objects or strings representing the
        start and end glyphs in the class, and ``glyphs`` is the full list of
        :class:`GlyphName` objects in the range.N)r   r   r   r   r   r   r   startendr   s       rQ   	add_rangezGlyphClass.add_range  s    
 9s4;''''M  TY[[!9:::eS\***6"""$$			rS   c                    | j         t          | j                  k     r,| j                            | j        | j         d                    | j                            d                    |          d                    |          f           | j                            |           t          | j                  | _         dS )zAdd a range to the class by glyph ID. ``start`` and ``end`` are the
        initial and final IDs, and ``glyphs`` is the full list of
        :class:`GlyphName` objects in the range.Nz\{})r   r   r   r   r   r   formatr   s       rQ   add_cid_rangezGlyphClass.add_cid_range  s     9s4;''''M  TY[[!9:::fmmE22FMM#4F4FGHHH6"""$$			rS   c                 V   | j         t          | j                  k     r,| j                            | j        | j         d                    | j                            |           | j                            |                                           t          | j                  | _         dS )zNAdd glyphs from the given :class:`GlyphClassName` object to the
        class.N)r   r   r   r   r   r   r   )r   gcs     rQ   	add_classzGlyphClass.add_class  s     9s4;''''M  TY[[!9:::R   2;;==)))$$			rS   NNr   )r   r   r   r   r   r   r   r   r   r   r   r   rN   rS   rQ   r   r      s        ;;   " " "A A A A# # #" " "	% 	% 	%% % %% % % % %rS   r   c                   (    e Zd ZdZddZd ZddZdS )	r   zyA glyph class name, such as ``@FRENCH_MARKS``. This must be instantiated
    with a :class:`GlyphClassDefinition` object.Nc                 x    t                               | |           t          |t                    sJ || _        d S r   )r'   r   r   r   
glyphclass)r   r   r   s      rQ   r   zGlyphClassName.__init__'  s:    D(+++*&:;;;;;$rS   c                 N    t          | j                                                  S r   )r   r   r   r   s    rQ   r   zGlyphClassName.glyphSet,  s    T_--//000rS   r   c                      d| j         j        z   S N@)r   r   r   s     rQ   r   zGlyphClassName.asFea0  s    T_)))rS   r   r   r   rN   rS   rQ   r   r   #  sU        4 4% % % %
1 1 1* * * * * *rS   r   c                   (    e Zd ZdZddZd ZddZdS )	r   zA mark class name, such as ``@FRENCH_MARKS`` defined with ``markClass``.
    This must be instantiated with a :class:`MarkClass` object.Nc                 x    t                               | |           t          |t                    sJ || _        d S r   )r'   r   r   r   	markClass)r   r   r   s      rQ   r   zMarkClassName.__init__8  s9    D(+++)Y/////"rS   c                 4    | j                                         S r   )r   r   r   s    rQ   r   zMarkClassName.glyphSet=  s    ~&&(((rS   r   c                      d| j         j        z   S r   )r   r   r   s     rQ   r   zMarkClassName.asFeaA  s    T^(((rS   r   r   r   rN   rS   rQ   r   r   4  sW        C C# # # #
) ) )) ) ) ) ) )rS   r   c                   "    e Zd ZdZddZddZdS )r   zAn anonymous data block.Nc                 X    t                               | |           || _        || _        d S r   )rB   r   tagcontent)r   r   r   r   s       rQ   r   zAnonymousBlock.__init__H  s*    4***rS   r   c                     d                     | j                  }|| j        z  }|d                     | j                  z  }|S )Nzanon {} {{
z}} {};

)r   r   r   r   r   ress      rQ   r   zAnonymousBlock.asFeaM  sB    ##DH--t||""48,,,
rS   r   r   r   r   r   r   r   r   rN   rS   rQ   r   r   E  sB        ""   
     rS   r   c                   (    e Zd ZdZddZd ZddZdS )	r   z,A block of statements: feature, lookup, etc.Nc                 J    t                               | |           g | _        d S r   )rB   r   
statementsr   s     rQ   r   zBlock.__init__W  s#    4***rS   c                 D    | j         D ]}|                    |           dS )zWhen handed a 'builder' object of comparable interface to
        :class:`fontTools.feaLib.builder`, walks the statements in this
        block, calling the builder callbacks.N)r   r   )r   r   ss      rQ   r   zBlock.build[  s4      	 	AGGG	 	rS   r   c                 v    t           z  dz                       fd| j        D                       z   dz   S )N
c                 <    g | ]}|                                S r   r   rO   r   r   s     rQ   
<listcomp>zBlock.asFea.<locals>.<listcomp>f  s'    #T#T#TqAGG6G$:$:#T#T#TrS   )SHIFTrT   r   r   s    `rQ   r   zBlock.asFeab  sN    %f}""#T#T#T#TDO#T#T#TUUV	
rS   r   r   r   r   r   r   r   r   r   rN   rS   rQ   r   r   T  sQ        66     
 
 
 
 
 
rS   r   c                        e Zd ZdZd ZddZdS )r
   zpThe top-level element of the syntax tree, containing the whole feature
    file in its ``statements`` attribute.c                 L    t                               | d            i | _        d S N)r   )r   r   markClassesr   s    rQ   r   zFeatureFile.__init__o  s&    td+++rS   r   c                 P    d                     fd| j        D                       S )Nr   c              3   D   K   | ]}|                                V  dS )r  Nr   r  s     rQ   rR   z$FeatureFile.asFea.<locals>.<genexpr>t  s1      IIA//IIIIIIrS   )rT   r   r   s    `rQ   r   zFeatureFile.asFeas  s,    yyIIIIIIIIIIrS   Nr   r   rN   rS   rQ   r
   r
   k  sG        - -  J J J J J JrS   r
   c                   (    e Zd ZdZddZd Zd	dZdS )
r   zA named feature block.FNc                 Z    t                               | |           ||c| _        | _        d S r   r   r   r   use_extensionr   r   r  r   s       rQ   r   zFeatureBlock.__init__z  -    tX&&&(,m%	4%%%rS   c                 j   |                     | j        | j        | j                   |j        }i |_        t
                              | |           |j                                        D ].\  }}|                    |g           	                    |           /||_        |
                                 dS )Call the ``start_feature`` callback on the builder object, visit
        all the statements in this feature, and then call ``end_feature``.N)start_featurer   r   r  	features_r   r   items
setdefaultr   end_feature)r   r   featureskeyvalues        rQ   r   zFeatureBlock.build~  s     	dmTY8JKKK $D'"""!+1133 	7 	7JCR((//6666$rS   r   c                     |d| j                                         z  z   }| j        r|dz  }|dz  }|t                              | |          z  }||d| j                                         z  z   z  }|S )Nzfeature %s useExtension {
r  } %s;
)r   stripr  r   r   r   s      rQ   r   zFeatureBlock.asFea  sz    }ty'8'888 	#?"Cuu{{4{///v	DIOO$5$5555
rS   FNr   r  rN   rS   rQ   r   r   w  sQ          < < < <       rS   r   c                   (    e Zd ZdZddZd ZddZdS )	r   zYA block inside another block, for example when found inside a
    ``cvParameters`` block.Nc                 X    t                               | |           || _        || _        d S r   )r   r   r   
block_name)r   r   r&  r   s       rQ   r   zNestedBlock.__init__  s(    tX&&&$rS   c                     t                               | |           | j        dk    r|                    | j                   d S d S )NParamUILabelNameID)r   r   r&  add_to_cv_num_named_paramsr   r   s     rQ   r   zNestedBlock.build  sH    D'"""?222..tx88888 32rS   r   c                     d                     || j                  }|t                              | |          z  }|d                     |          z  }|S )Nz{}{} {{
r  z{}}};
)r   r&  r   r   r   s      rQ   r   zNestedBlock.asFea  sP      99u{{4{///y'''
rS   r   r   r  rN   rS   rQ   r   r     sU         % % % %
9 9 9
     rS   r   c                   (    e Zd ZdZddZd Zd	dZdS )
r   z*A named lookup, containing ``statements``.FNc                 Z    t                               | |           ||c| _        | _        d S r   r  r  s       rQ   r   zLookupBlock.__init__  r  rS   c                     |                     | j        | j        | j                   t                              | |           |                                 d S r   )start_lookup_blockr   r   r  r   r   end_lookup_blockr   s     rQ   r   zLookupBlock.build  sM    ""4=$)T=OPPPD'"""  """""rS   r   c                     d                     | j                  }| j        r|dz  }|dz  }|t                              | |          z  }|d                     || j                  z  }|S )Nz
lookup {} r  r   r  z	{}}} {};
)r   r   r  r   r   r   s      rQ   r   zLookupBlock.asFea  sp    !!$),, 	#?"Cuu{{4{///|""649555
rS   r#  r   r  rN   rS   rQ   r   r     sQ        44< < < <# # #
     rS   r   c                   ,     e Zd ZdZddZd fd	Z xZS )rG   zA ``table ... { }`` block.Nc                 J    t                               | |           || _        d S r   )r   r   r   )r   r   r   s      rQ   r   zTableBlock.__init__  s!    tX&&&			rS   r   c                    d                     | j                                                  }|t          t          |                               |          z  }|d                     | j                                                  z  }|S )Nztable {} {{
r  z}} {};
)r   r   r"  r   rG   r   )r   r   r   r   s      rQ   r   zTableBlock.asFea  sp    $$TY__%6%677uZ&&,,F,;;;z  !2!2333
rS   r   r   r   r   s   @rQ   rG   rG     sW        $$            rS   rG   c                   (    e Zd ZdZddZd ZddZdS )	r   z!Example: ``@UPPERCASE = [A-Z];``.Nc                 X    t                               | |           || _        || _        d S r   )rB   r   r   r   )r   r   r   r   s       rQ   r   zGlyphClassDefinition.__init__  s*    4***	rS   c                 N    t          | j                                                  S r   )r   r   r   r   s    rQ   r   zGlyphClassDefinition.glyphSet  s    T[))++,,,rS   r   c                 V    d| j         z   dz   | j                                        z   dz   S )Nr   z = ;)r   r   r   r   s     rQ   r   zGlyphClassDefinition.asFea  s+    TY&):):)<)<<sBBrS   r   r   r   rN   rS   rQ   r   r     sW        ++   
- - -C C C C C CrS   r   c                   *    e Zd ZdZ	 ddZd ZddZdS )	r   zExample: ``GlyphClassDef @UPPERCASE, [B], [C], [D];``. The parameters
    must be either :class:`GlyphClass` or :class:`GlyphClassName` objects, or
    ``None``.Nc                 v    t                               | |           ||c| _        | _        || _        || _        d S r   )rB   r   
baseGlyphs
markGlyphsligatureGlyphscomponentGlyphs)r   r;  r<  r=  r>  r   s         rQ   r   zGlyphClassDefStatement.__init__  s@     	4***,6
(,.rS   c                    | j         r| j                                         nt                      }| j        r| j                                        nt                      }| j        r| j                                        nt                      }| j        r| j                                        nt                      }|                    | j        ||||           dS )z3Calls the builder's ``add_glyphClassDef`` callback.N)r;  r   r   r=  r<  r>  add_glyphClassDefr   )r   r   r   ligaro   comps         rQ   r   zGlyphClassDefStatement.build  s    -1_It'')))%''151DQt"++---%''-1_It'')))%''262FSt#,,...EGG!!$-tT4HHHHHrS   r   c                 2   d                     | j        r| j                                        nd| j        r| j                                        nd| j        r| j                                        nd| j        r| j                                        nd          S )NzGlyphClassDef {}, {}, {}, {};r   )r   r;  r   r=  r<  r>  r   s     rQ   r   zGlyphClassDefStatement.asFea  s    .55'+>DO!!###B+/+>FD%%'''B'+>DO!!###B,0,@HD &&(((b	
 
 	
rS   r   r   r  rN   rS   rQ   r   r     s_         
 QU/ / / /I I I
 
 
 
 
 
rS   r   c                   ,    e Zd ZdZd Zd Zd ZddZdS )	r   aB  One `or more` ``markClass`` statements for the same mark class.

    While glyph classes can be defined only once, the feature file format
    allows expanding mark classes with multiple definitions, each using
    different glyphs and anchors. The following are two ``MarkClassDefinitions``
    for the same ``MarkClass``::

        markClass [acute grave] <anchor 350 800> @FRENCH_ACCENTS;
        markClass [cedilla] <anchor 350 -200> @FRENCH_ACCENTS;

    The ``MarkClass`` object is therefore just a container for a list of
    :class:`MarkClassDefinition` statements.
    c                 H    || _         g | _        t                      | _        d S r   )r   definitionsr   r   )r   r   s     rQ   r   zMarkClass.__init__  s     	!mmrS   c                 *   t          |t                    sJ | j                            |           |                                D ]L}|| j        v r7| j        |         j        }|d}nd| }t          d|d||j                  || j        |<   MdS )z@Add a :class:`MarkClassDefinition` statement to this mark class.Nr   z at zGlyph z already defined)r   r   rF  r   r   r   r   r   )r   
definitionr   otherLocr   s        rQ   addDefinitionzMarkClass.addDefinition  s    *&9:::::
+++((** 
	, 
	,E##;u-6#CC+++C%o49EE33?AT   ",DK
	, 
	,rS   c                 N    t          | j                                                  S r   )r   r   keysr   s    rQ   r   zMarkClass.glyphSet!  s    T[%%''(((rS   r   c                 N    d                     d | j        D                       }|S )Nr   c              3   >   K   | ]}|                                 V  d S r   r   )rO   ds     rQ   rR   z"MarkClass.asFea.<locals>.<genexpr>&  s*      <<a		<<<<<<rS   )rT   rF  r   s      rQ   r   zMarkClass.asFea%  s*    ii<<4+;<<<<<
rS   Nr   )r   r   r   r   r   rJ  r   r   rN   rS   rQ   r   r     s_         $ $ $
, , , ) ) )     rS   r   c                   (    e Zd ZdZddZd ZddZdS )	r   a   A single ``markClass`` statement. The ``markClass`` should be a
    :class:`MarkClass` object, the ``anchor`` an :class:`Anchor` object,
    and the ``glyphs`` parameter should be a `glyph-containing object`_ .

    Example:

        .. code:: python

            mc = MarkClass("FRENCH_ACCENTS")
            mc.addDefinition( MarkClassDefinition(mc, Anchor(350, 800),
                GlyphClass([ GlyphName("acute"), GlyphName("grave") ])
            ) )
            mc.addDefinition( MarkClassDefinition(mc, Anchor(350, -200),
                GlyphClass([ GlyphName("cedilla") ])
            ) )

            mc.asFea()
            # markClass [acute grave] <anchor 350 800> @FRENCH_ACCENTS;
            # markClass [cedilla] <anchor 350 -200> @FRENCH_ACCENTS;

    Nc                     t                               | |           t          |t                    sJ t          |t                    rt          |t
                    sJ |||c| _        | _        | _        d S r   )	rB   r   r   r   r   r'   r   rW   r   )r   r   rW   r   r   s        rQ   r   zMarkClassDefinition.__init__A  sm    4***)Y/////&&))Lj.L.LLLL3<ff0T[[[rS   c                 4    | j                                         S r   )r   r   r   s    rQ   r   zMarkClassDefinition.glyphSetG  s    {##%%%rS   r   c                     d                     | j                                        | j                                        | j        j                  S )NzmarkClass {} {} @{};)r   r   r   rW   r   r   r   s     rQ   r   zMarkClassDefinition.asFeaK  sB    %,,K!2!2!4!4dn6I
 
 	
rS   r   r   r   rN   rS   rQ   r   r   *  sY         ,M M M M& & &
 
 
 
 
 
rS   r   c                   (    e Zd ZdZddZd ZddZdS )	r   zA ``sub ... from ...`` statement.

    ``glyph`` and ``replacement`` should be `glyph-containing objects`_.
    ``prefix`` and ``suffix`` should be lists of `glyph-containing objects`_.Nc                 v    t                               | |           |||c| _        | _        | _        || _        d S r   )rB   r   prefixr   suffixreplacement)r   rV  r   rW  rX  r   s         rQ   r   z AlternateSubstStatement.__init__W  s<    4***06v,TZ&rS   c                 N   | j                                         }t          |          dk    s
J |            t          |          d         }d | j        D             }d | j        D             }| j                                        }|                    | j        ||||           dS )z5Calls the builder's ``add_alternate_subst`` callback.r   r   c                 6    g | ]}|                                 S rN   r   rO   ps     rQ   r  z1AlternateSubstStatement.build.<locals>.<listcomp>a       4441!**,,444rS   c                 6    g | ]}|                                 S rN   r[  rO   r   s     rQ   r  z1AlternateSubstStatement.build.<locals>.<listcomp>b  r^  rS   N)	r   r   r   listrV  rW  rX  add_alternate_substr   )r   r   r   rV  rW  rX  s         rQ   r   zAlternateSubstStatement.build\  s    
##%%5zzQUA4444444444&//11##DM65&+VVVVVrS   r   c                    d}t          | j                  st          | j                  rt          | j                  r3|d                    t	          t
          | j                            dz   z  }|t          | j                  dz   z  }t          | j                  r3|dd                    t	          t
          | j                            z   z  }n|t          | j                  z  }|dz  }|t          | j                  z  }|dz  }|S )Nsub r   'z from r8  )r   rV  rW  rT   r   r   r   rX  r   s      rQ   r   zAlternateSubstStatement.asFeaf  s    t{ 	%s4;// 	%4; ?sxxE4; 7 7883>>5$$s**C4; ?sSXXc%&=&=>>>>5$$$CxuT%&&&s

rS   r   r   r  rN   rS   rQ   r   r   Q  sZ        Q Q
' ' ' '
W W W     rS   r   c                   ,    e Zd ZdZ	 	 	 	 	 ddZddZdS )r   zAn ``Anchor`` element, used inside a ``pos`` rule.

    If a ``name`` is given, this will be used in preference to the coordinates.
    Other values should be integer.
    Nc                     t                               | |           || _        |||c| _        | _        | _        ||c| _        | _        d S r   )r'   r   r   xycontourpointxDeviceTableyDeviceTable)r   rh  ri  r   rj  rk  rl  r   s           rQ   r   zAnchor.__init__}  sP     	D(+++	,-q,))/;\,4,,,rS   r   c                 f   | j         d                    | j                   S d                    | j        | j                  }| j        r|d                    | j                  z  }| j        s| j        r8|dz  }|t          | j                  z  }|dz  }|t          | j                  z  }|dz  }|S )Nz<anchor {}>z<anchor {} {} contourpoint {}r   >)r   r   rh  ri  rj  rk  rl  rV   r   s      rQ   r   zAnchor.asFea  s    9  ''	222$$TVTV44 	@%,,T->???C 	5 1 	53JC>$"3444C3JC>$"3444Cs

rS   )NNNNNr   r   rN   rS   rQ   r   r   v  s[          J J J J     rS   r   c                   "    e Zd ZdZddZddZdS )r   zCA named anchor definition. (2.e.viii). ``name`` should be a string.Nc                 z    t                               | |           ||||f\  | _        | _        | _        | _        d S r   )rB   r   r   rh  ri  rj  )r   r   rh  ri  rj  r   s         rQ   r   zAnchorDefinition.__init__  s>    4***7;Q<7O4	46464#4#4#4rS   r   c                     d                     | j        | j                  }| j        r|d                     | j                  z  }|d                     | j                  z  }|S )NzanchorDef {} {}rn  z {};)r   rh  ri  rj  r   r   s      rQ   r   zAnchorDefinition.asFea  s`    &&tvtv66 	@%,,T->???Cv}}TY'''
rS   r   r   r   rN   rS   rQ   r   r     sF        MMP P P P     rS   r   c                   (    e Zd ZdZddZd ZddZdS )	r   z&A ``GDEF`` table ``Attach`` statement.Nc                 X    t                               | |           || _        || _        d S r   )rB   r   r   contourPoints)r   r   ru  r   s       rQ   r   zAttachStatement.__init__  s-    4****rS   c                 z    | j                                         }|                    | j        || j                   dS )z3Calls the builder's ``add_attach_points`` callback.N)r   r   add_attach_pointsr   ru  r   r   r   s      rQ   r   zAttachStatement.build  s8    %%''!!$-9KLLLLLrS   r   c                     d                     | j                                        d                    d | j        D                                 S )NzAttach {} {};r   c              3   4   K   | ]}t          |          V  d S r   str)rO   cs     rQ   rR   z(AttachStatement.asFea.<locals>.<genexpr>  s(      )M)MQ#a&&)M)M)M)M)M)MrS   )r   r   r   rT   ru  r   s     rQ   r   zAttachStatement.asFea  sK    %%K)M)M$:L)M)M)M!M!M
 
 	
rS   r   r   r  rN   rS   rQ   r   r     sT        00+ + + +
M M M

 
 
 
 
 
rS   r   c                   (    e Zd ZdZddZd ZddZdS )	r    a@  A chained contextual positioning statement.

    ``prefix``, ``glyphs``, and ``suffix`` should be lists of
    `glyph-containing objects`_ .

    ``lookups`` should be a list of elements representing what lookups
    to apply at each glyph position. Each element should be a
    :class:`LookupBlock` to apply a single chaining lookup at the given
    position, a list of :class:`LookupBlock`\ s to apply multiple
    lookups, or ``None`` to apply no lookup. The length of the outer
    list should equal the length of ``glyphs``; the inner lists can be
    of variable length.Nc                    t                               | |           |||c| _        | _        | _        t          |          | _        t          |          D ]3\  }}|r,	 t          |           # t          $ r |g| j        |<   Y /w xY w4d S r   
rB   r   rV  r   rW  ra  lookupsr_   iter	TypeErrorr   rV  r   rW  r  r   irm   s           rQ   r   z!ChainContextPosStatement.__init__      4***06-T[$+G}}"7++ 	/ 	/IAv //LLLL  / / /'-hDLOOO//	/ 	/   A--BBc                     d | j         D             }d | j        D             }d | j        D             }|                    | j        |||| j                   dS )z7Calls the builder's ``add_chain_context_pos`` callback.c                 6    g | ]}|                                 S rN   r[  r\  s     rQ   r  z2ChainContextPosStatement.build.<locals>.<listcomp>  r^  rS   c                 6    g | ]}|                                 S rN   r[  rO   r   s     rQ   r  z2ChainContextPosStatement.build.<locals>.<listcomp>  r^  rS   c                 6    g | ]}|                                 S rN   r[  r`  s     rQ   r  z2ChainContextPosStatement.build.<locals>.<listcomp>  r^  rS   N)rV  r   rW  add_chain_context_posr   r  r   r   rV  r   rW  s        rQ   r   zChainContextPosStatement.build  sr    444444444444444%%M6664<	
 	
 	
 	
 	
rS   r   c                 
   d}t          | j                  s3t          | j                  st          d | j        D                       rt          | j                  r*|d                    d | j        D                       dz   z  }t          | j                  D ]i\  }}||                                dz   z  }| j        |         r| j        |         D ]}|d|j	        z   z  }|t          | j                  dz
  k     r|dz  }jt          | j                  r3|dd                    t          t          | j                            z   z  }n0|d                    t          t          | j                            z  }|dz  }|S )	Npos c                     g | ]}|d uS r   rN   rO   rh  s     rQ   r  z2ChainContextPosStatement.asFea.<locals>.<listcomp>      888aATM888rS   r   c              3   >   K   | ]}|                                 V  d S r   r   r  s     rQ   rR   z1ChainContextPosStatement.asFea.<locals>.<genexpr>  *      ??a		??????rS   re   lookup r   r8  r   rV  rW  anyr  rT   r_   r   r   r   r   r   r   r   r  r   lus         rQ   r   zChainContextPosStatement.asFea     	54;	5 884<88899	5
 4; Fsxx??4;?????#EE!$+..  1qwwyy3&<? 4"l1o 4 4zBG33s4;''!+++3JC4; ?sSXXc%&=&=>>>>388Ct{33444Cs

rS   r   r   r  rN   rS   rQ   r    r      U         	/ 	/ 	/ 	/
 
 
     rS   r    c                   (    e Zd ZdZddZd ZddZdS )	r!   aA  A chained contextual substitution statement.

    ``prefix``, ``glyphs``, and ``suffix`` should be lists of
    `glyph-containing objects`_ .

    ``lookups`` should be a list of elements representing what lookups
    to apply at each glyph position. Each element should be a
    :class:`LookupBlock` to apply a single chaining lookup at the given
    position, a list of :class:`LookupBlock`\ s to apply multiple
    lookups, or ``None`` to apply no lookup. The length of the outer
    list should equal the length of ``glyphs``; the inner lists can be
    of variable length.Nc                    t                               | |           |||c| _        | _        | _        t          |          | _        t          |          D ]3\  }}|r,	 t          |           # t          $ r |g| j        |<   Y /w xY w4d S r   r  r  s           rQ   r   z#ChainContextSubstStatement.__init__  r  r  c                     d | j         D             }d | j        D             }d | j        D             }|                    | j        |||| j                   dS )z9Calls the builder's ``add_chain_context_subst`` callback.c                 6    g | ]}|                                 S rN   r[  r\  s     rQ   r  z4ChainContextSubstStatement.build.<locals>.<listcomp>  r^  rS   c                 6    g | ]}|                                 S rN   r[  r  s     rQ   r  z4ChainContextSubstStatement.build.<locals>.<listcomp>  r^  rS   c                 6    g | ]}|                                 S rN   r[  r`  s     rQ   r  z4ChainContextSubstStatement.build.<locals>.<listcomp>  r^  rS   N)rV  r   rW  add_chain_context_substr   r  r  s        rQ   r   z ChainContextSubstStatement.build  sr    444444444444444''M6664<	
 	
 	
 	
 	
rS   r   c                 
   d}t          | j                  s3t          | j                  st          d | j        D                       rt          | j                  r*|d                    d | j        D                       dz   z  }t          | j                  D ]i\  }}||                                dz   z  }| j        |         r| j        |         D ]}|d|j	        z   z  }|t          | j                  dz
  k     r|dz  }jt          | j                  r3|dd                    t          t          | j                            z   z  }n0|d                    t          t          | j                            z  }|dz  }|S )	Nrd  c                     g | ]}|d uS r   rN   r  s     rQ   r  z4ChainContextSubstStatement.asFea.<locals>.<listcomp>  r  rS   r   c              3   >   K   | ]}|                                 V  d S r   r   r  s     rQ   rR   z3ChainContextSubstStatement.asFea.<locals>.<genexpr>!  r  rS   re  r  r   r8  r  r  s         rQ   r   z ChainContextSubstStatement.asFea  r  rS   r   r   r  rN   rS   rQ   r!   r!     r  rS   r!   c                   (    e Zd ZdZddZd ZddZdS )	r$   znA cursive positioning statement. Entry and exit anchors can either
    be :class:`Anchor` objects or ``None``.Nc                 h    t                               | |           || _        ||c| _        | _        d S r   )rB   r   r   entryAnchor
exitAnchor)r   r   r  r  r   s        rQ   r   zCursivePosStatement.__init__5  s4    4***$,7)$///rS   c                     |                     | j        | j                                        | j        | j                   dS )z8Calls the builder object's ``add_cursive_pos`` callback.N)add_cursive_posr   r   r   r  r  r   s     rQ   r   zCursivePosStatement.build:  sB    M4?3355t7G	
 	
 	
 	
 	
rS   r   c                     | j         r| j                                         nd}| j        r| j                                        nd}d                    | j                                        ||          S )N<anchor NULL>zpos cursive {} {} {};)r  r   r  r   r   )r   r   entryexits       rQ   r   zCursivePosStatement.asFea@  sh    ,0,<Q &&(((/*./Nt$$&&&&--do.C.C.E.EudSSSrS   r   r   r  rN   rS   rQ   r$   r$   1  s_        / /D D D D

 
 
T T T T T TrS   r$   c                   (    e Zd ZdZddZd ZddZdS )	r)   zExample: ``feature salt;``Nc                 Z    t                               | |           ||c| _        | _        d S r   )rB   r   r   featureName)r   r  r   s      rQ   r   z"FeatureReferenceStatement.__init__I  s/    4***+3['t'''rS   c                 F    |                     | j        | j                   dS )z>Calls the builder object's ``add_feature_reference`` callback.N)add_feature_referencer   r  r   s     rQ   r   zFeatureReferenceStatement.buildM  s#    %%dmT5EFFFFFrS   r   c                 6    d                     | j                  S )Nzfeature {};)r   r  r   s     rQ   r   zFeatureReferenceStatement.asFeaQ  s    ##D$4555rS   r   r   r  rN   rS   rQ   r)   r)   F  sX        $$B B B BG G G6 6 6 6 6 6rS   r)   c                   (    e Zd ZdZddZd ZddZdS )	r,   zAn ``ignore pos`` statement, containing `one or more` contexts to ignore.

    ``chainContexts`` should be a list of ``(prefix, glyphs, suffix)`` tuples,
    with each of ``prefix``, ``glyphs`` and ``suffix`` being
    `glyph-containing objects`_ .Nc                 J    t                               | |           || _        d S r   rB   r   chainContextsr   r  r   s      rQ   r   zIgnorePosStatement.__init__\  &    4****rS   c                     | j         D ]H\  }}}d |D             }d |D             }d |D             }|                    | j        |||g            IdS )z[Calls the builder object's ``add_chain_context_pos`` callback on each
        rule context.c                 6    g | ]}|                                 S rN   r[  r\  s     rQ   r  z,IgnorePosStatement.build.<locals>.<listcomp>d       333qajjll333rS   c                 6    g | ]}|                                 S rN   r[  r  s     rQ   r  z,IgnorePosStatement.build.<locals>.<listcomp>e  r  rS   c                 6    g | ]}|                                 S rN   r[  r`  s     rQ   r  z,IgnorePosStatement.build.<locals>.<listcomp>f  r  rS   N)r  r  r   r  s        rQ   r   zIgnorePosStatement.build`  s     '+&8 	U 	U"FFF33F333F33F333F33F333F))$-QSTTTT		U 	UrS   r   c           	      V   g }| j         D ]\  }}}d}t          |          st          |          rt          |          r.|d                    t          t          |                    dz   z  }|d                    d |D                       z  }t          |          r.|dd                    t          t          |                    z   z  }n+|d                    t          t          |                    z  }|                    |           dd                    |          z   dz   S )Nr   r   c              3   D   K   | ]}|                                 d z   V  dS re  Nr   r  s     rQ   rR   z+IgnorePosStatement.asFea.<locals>.<genexpr>p  s.      @@A		C@@@@@@rS   zignore pos rL   r8  r  r   rT   r   r   r   r   r   contextsrV  r   rW  r   s          rQ   r   zIgnorePosStatement.asFeai  s   &*&8 
	! 
	!"FFFC6{{ 4c&kk 4v;; >388Cv$6$677#==Csxx@@@@@@@@v;; >3#eV*<*<!=!===CsxxE6 2 2333OOC    tyy222S88rS   r   r   r  rN   rS   rQ   r,   r,   U  sX        % %+ + + +U U U9 9 9 9 9 9rS   r,   c                   (    e Zd ZdZddZd ZddZdS )	r-   zAn ``ignore sub`` statement, containing `one or more` contexts to ignore.

    ``chainContexts`` should be a list of ``(prefix, glyphs, suffix)`` tuples,
    with each of ``prefix``, ``glyphs`` and ``suffix`` being
    `glyph-containing objects`_ .Nc                 J    t                               | |           || _        d S r   r  r  s      rQ   r   zIgnoreSubstStatement.__init__  r  rS   c                     | j         D ]H\  }}}d |D             }d |D             }d |D             }|                    | j        |||g            IdS )z]Calls the builder object's ``add_chain_context_subst`` callback on
        each rule context.c                 6    g | ]}|                                 S rN   r[  r\  s     rQ   r  z.IgnoreSubstStatement.build.<locals>.<listcomp>  r  rS   c                 6    g | ]}|                                 S rN   r[  r  s     rQ   r  z.IgnoreSubstStatement.build.<locals>.<listcomp>  r  rS   c                 6    g | ]}|                                 S rN   r[  r`  s     rQ   r  z.IgnoreSubstStatement.build.<locals>.<listcomp>  r  rS   N)r  r  r   r  s        rQ   r   zIgnoreSubstStatement.build  s     '+&8 	W 	W"FFF33F333F33F333F33F333F++DM666SUVVVV		W 	WrS   r   c           	         g }| j         D ]\  }}}d}t          |          r.|d                    t          t          |                    dz   z  }|d                    d |D                       z  }t          |          r.|dd                    t          t          |                    z   z  }|                    |           dd                    |          z   dz   S )Nr   r   c              3   D   K   | ]}|                                 d z   V  dS r  r   r  s     rQ   rR   z-IgnoreSubstStatement.asFea.<locals>.<genexpr>  s.      <<AGGIIO<<<<<<rS   zignore sub rL   r8  r  r  s          rQ   r   zIgnoreSubstStatement.asFea  s    &*&8 	! 	!"FFFC6{{ :sxxE6 2 233c99388<<V<<<<<<C6{{ :sSXXc%&8&89999OOC    tyy222S88rS   r   r   r  rN   rS   rQ   r-   r-   y  sX        % %+ + + +W W W
9 
9 
9 
9 
9 
9rS   r-   c                   2     e Zd ZdZd fd	Zd ZddZ xZS )	r.   zAn ``include()`` statement.Nc                 f    t          t          |                               |           || _        d S r   )r   r.   r   filename)r   r  r   r   s      rQ   r   zIncludeStatement.__init__  s-    %%..x888 rS   c                 ,    t          d| j                  )NzqBuilding an include statement is not implemented yet. Instead, use Parser(..., followIncludes=True) for building.)r   r   r   s    rQ   r   zIncludeStatement.build  s    JM
 
 	
rS   r   c                     |d| j         z  z   S )Nzinclude(%s);)r  r   s     rQ   r   zIncludeStatement.asFea  s    666rS   r   r   )r   r   r   r   r   r   r   r   r   s   @rQ   r.   r.     sf        %%! ! ! ! ! !
 
 
7 7 7 7 7 7 7 7rS   r.   c                   (    e Zd ZdZd	dZd Zd
dZdS )r/   z*A ``language`` statement within a feature.TFNc                     t                               | |           t          |          dk    sJ || _        || _        || _        d S )N   )rB   r   r   rk   include_defaultrw   )r   rk   r  rw   r   s        rQ   r   zLanguageStatement.__init__  sI    4***8}}!!!! . rS   c                 `    |                     | j        | j        | j        | j                   dS )z4Call the builder object's ``set_language`` callback.)r   rk   r  rw   N)set_languager   rk   r  rw   r   s     rQ   r   zLanguageStatement.build  s>    ]] 0]	 	 	
 	
 	
 	
 	
rS   r   c                     d                     | j                                                  }| j        s|dz  }| j        r|dz  }|dz  }|S )Nzlanguage {}z exclude_dfltz	 requiredr8  )r   rk   r"  r  rw   r   s      rQ   r   zLanguageStatement.asFea  sZ    ""4=#6#6#8#899# 	#?"C= 	;Cs

rS   )TFNr   r  rN   rS   rQ   r/   r/     sQ        44! ! ! !
 
 
     rS   r/   c                   (    e Zd ZdZddZd ZddZdS )	r0   z)A top-level ``languagesystem`` statement.Nc                 Z    t                               | |           ||c| _        | _        d S r   )rB   r   r{   rk   )r   r{   rk   r   s       rQ   r   z LanguageSystemStatement.__init__  s,    4***&,h"T]]]rS   c                 R    |                     | j        | j        | j                   dS )z<Calls the builder object's ``add_language_system`` callback.N)add_language_systemr   r{   rk   r   s     rQ   r   zLanguageSystemStatement.build  s&    ##DM4;NNNNNrS   r   c                 f    d                     | j        | j                                                  S )Nzlanguagesystem {} {};)r   r{   rk   r"  r   s     rQ   r   zLanguageSystemStatement.asFea  s(    &--dk4=;N;N;P;PQQQrS   r   r   r  rN   rS   rQ   r0   r0     sZ        338 8 8 8O O OR R R R R RrS   r0   c                   (    e Zd ZdZddZd ZddZdS )	r*   zA ``head`` table ``FontRevision`` statement. ``revision`` should be a
    number, and will be formatted to three significant decimal places.Nc                 J    t                               | |           || _        d S r   )rB   r   revision)r   r  r   s      rQ   r   zFontRevisionStatement.__init__  s#    4*** rS   c                 F    |                     | j        | j                   d S r   )set_font_revisionr   r  r   s     rQ   r   zFontRevisionStatement.build  s"    !!$-?????rS   r   c                 6    d                     | j                  S )NzFontRevision {:.3f};)r   r  r   s     rQ   r   zFontRevisionStatement.asFea  s    %,,T];;;rS   r   r   r  rN   rS   rQ   r*   r*     sZ        J J! ! ! !@ @ @< < < < < <rS   r*   c                   (    e Zd ZdZddZd ZddZdS )	r1   zA ``GDEF`` table ``LigatureCaretByIndex`` statement. ``glyphs`` should be
    a `glyph-containing object`_, and ``carets`` should be a list of integers.Nc                 Z    t                               | |           ||c| _        | _        d S r   rB   r   r   caretsr   r   r  r   s       rQ   r   z&LigatureCaretByIndexStatement.__init__  ,    4***$*F T[[[rS   c                     | j                                         }|                    | j        |t	          | j                             dS )zBCalls the builder object's ``add_ligatureCaretByIndex_`` callback.N)r   r   add_ligatureCaretByIndex_r   setr  rx  s      rQ   r   z#LigatureCaretByIndexStatement.build  s?    %%''))$-T[AQAQRRRRRrS   r   c                     d                     | j                                        d                    d | j        D                                 S )NzLigatureCaretByIndex {} {};r   c              3   4   K   | ]}t          |          V  d S r   r{  r  s     rQ   rR   z6LigatureCaretByIndexStatement.asFea.<locals>.<genexpr>  (      )F)FQ#a&&)F)F)F)F)F)FrS   r   r   r   rT   r  r   s     rQ   r   z#LigatureCaretByIndexStatement.asFea  sJ    ,33K)F)F$+)F)F)F!F!F
 
 	
rS   r   r   r  rN   rS   rQ   r1   r1     sZ        R R4 4 4 4S S S

 
 
 
 
 
rS   r1   c                   (    e Zd ZdZddZd ZddZdS )	r2   zA ``GDEF`` table ``LigatureCaretByPos`` statement. ``glyphs`` should be
    a `glyph-containing object`_, and ``carets`` should be a list of integers.Nc                 Z    t                               | |           ||c| _        | _        d S r   r  r  s       rQ   r   z$LigatureCaretByPosStatement.__init__  r  rS   c                     | j                                         }|                    | j        |t	          | j                             dS )z@Calls the builder object's ``add_ligatureCaretByPos_`` callback.N)r   r   add_ligatureCaretByPos_r   r  r  rx  s      rQ   r   z!LigatureCaretByPosStatement.build  s?    %%''''vs4;?O?OPPPPPrS   r   c                     d                     | j                                        d                    d | j        D                                 S )NzLigatureCaretByPos {} {};r   c              3   4   K   | ]}t          |          V  d S r   r{  r  s     rQ   rR   z4LigatureCaretByPosStatement.asFea.<locals>.<genexpr>
  r  rS   r  r   s     rQ   r   z!LigatureCaretByPosStatement.asFea  sJ    *11K)F)F$+)F)F)F!F!F
 
 	
rS   r   r   r  rN   rS   rQ   r2   r2     sZ        R R4 4 4 4Q Q Q

 
 
 
 
 
rS   r2   c                   (    e Zd ZdZddZd ZddZdS )	r3   aS  A chained contextual substitution statement.

    ``prefix``, ``glyphs``, and ``suffix`` should be lists of
    `glyph-containing objects`_; ``replacement`` should be a single
    `glyph-containing object`_.

    If ``forceChain`` is True, this is expressed as a chaining rule
    (e.g. ``sub f' i' by f_i``) even when no context is given.Nc                     t                               | |           |||c| _        | _        | _        ||c| _        | _        d S r   )rB   r   rV  r   rW  rX  
forceChain)r   rV  r   rW  rX  r  r   s          rQ   r   zLigatureSubstStatement.__init__  sC    4***17-T[$+,7)$///rS   c                     d | j         D             }d | j        D             }d | j        D             }|                    | j        |||| j        | j                   d S )Nc                 6    g | ]}|                                 S rN   r[  r\  s     rQ   r  z0LigatureSubstStatement.build.<locals>.<listcomp>  r^  rS   c                 6    g | ]}|                                 S rN   r[  r  s     rQ   r  z0LigatureSubstStatement.build.<locals>.<listcomp>  r^  rS   c                 6    g | ]}|                                 S rN   r[  r`  s     rQ   r  z0LigatureSubstStatement.build.<locals>.<listcomp>   r^  rS   )rV  r   rW  add_ligature_substr   rX  r  r  s        rQ   r   zLigatureSubstStatement.build  sw    444444444444444""M66643CT_	
 	
 	
 	
 	
rS   r   c                 @   d}t          | j                  st          | j                  s| j        rt          | j                  r*|d                    d | j        D                       dz   z  }|d                    d | j        D                       z  }t          | j                  r*|dd                    d | j        D                       z   z  }n'|d                    d | j        D                       z  }|dz  }|t          | j                  z  }|dz  }|S )	Nrd  r   c              3   >   K   | ]}|                                 V  d S r   r   r  s     rQ   rR   z/LigatureSubstStatement.asFea.<locals>.<genexpr>)  r  rS   c              3   D   K   | ]}|                                 d z   V  dS r  r   r  s     rQ   rR   z/LigatureSubstStatement.asFea.<locals>.<genexpr>*  s.      AAAGGIIOAAAAAArS   c              3   >   K   | ]}|                                 V  d S r   r   r  s     rQ   rR   z/LigatureSubstStatement.asFea.<locals>.<genexpr>,  s*      %E%EAaggii%E%E%E%E%E%ErS   c              3   >   K   | ]}|                                 V  d S r   r   r  s     rQ   rR   z/LigatureSubstStatement.asFea.<locals>.<genexpr>.  s*      ;;!AGGII;;;;;;rS    by r8  )r   rV  rW  r  rT   r   r   rX  r   s      rQ   r   zLigatureSubstStatement.asFea%  s,   t{ 	<s4;// 	<4? 	<4; Fsxx??4;?????#EE388AAT[AAAAAAC4; FsSXX%E%E%E%E%EEEEE388;;t{;;;;;;CvuT%&&&s

rS   r   r   r  rN   rS   rQ   r3   r3     s[        B BD D D D

 
 
     rS   r3   c                   *    e Zd ZdZ	 ddZd Zd	dZdS )
r4   zA ``lookupflag`` statement. The ``value`` should be an integer value
    representing the flags in use, but not including the ``markAttachment``
    class and ``markFilteringSet`` values, which must be specified as
    glyph-containing objects.r   Nc                 f    t                               | |           || _        || _        || _        d S r   )rB   r   r  markAttachmentmarkFilteringSet)r   r  r
  r  r   s        rQ   r   zLookupFlagStatement.__init__;  s7     	4***
, 0rS   c                     d}| j         | j                                         }d}| j        | j                                        }|                    | j        | j        ||           dS )z8Calls the builder object's ``set_lookup_flag`` callback.N)r
  r   r  set_lookup_flagr   r  )r   r   
markAttach
markFilters       rQ   r   zLookupFlagStatement.buildC  sj    
*,5577J
 ,.7799Jtz:zRRRRRrS   r   c                    g }g d}d}t          t          |                    D ]0}| j        |z  dk    r|                    ||                    |dz  }1| j        ?|                    d                    | j                                                             | j        ?|                    d                    | j                                                             |sdg}d                    d                    |                    S )	N)RightToLeftIgnoreBaseGlyphsIgnoreLigaturesIgnoreMarksr   r   zMarkAttachmentType {}zUseMarkFilteringSet {}0zlookupflag {};r   )	ranger   r  r   r
  r   r   r  rT   )r   r   r   flagsr   r  s         rQ   r   zLookupFlagStatement.asFeaM  s   UUUs5zz"" 	 	AzD A%%

58$$$19DD*JJ.55d6I6O6O6Q6QRRSSS ,JJ/66t7L7R7R7T7TUUVVV 	%C&&sxx}}555rS   )r   NNNr   r  rN   rS   rQ   r4   r4   5  s_        ! ! MQ1 1 1 1S S S6 6 6 6 6 6rS   r4   c                   (    e Zd ZdZddZd ZddZdS )	r5   zRepresents a ``lookup ...;`` statement to include a lookup in a feature.

    The ``lookup`` should be a :class:`LookupBlock` object.Nc                 Z    t                               | |           ||c| _        | _        d S r   )rB   r   r   rm   )r   rm   r   s      rQ   r   z!LookupReferenceStatement.__init__c  s,    4***&."t{{{rS   c                 D    |                     | j        j                   dS )z8Calls the builder object's ``add_lookup_call`` callback.N)add_lookup_callrm   r   r   s     rQ   r   zLookupReferenceStatement.buildg  s!     011111rS   r   c                 @    d                     | j        j                  S )Nz
lookup {};)r   rm   r   r   s     rQ   r   zLookupReferenceStatement.asFeak  s    ""4;#3444rS   r   r   r  rN   rS   rQ   r5   r5   ^  sU        ? ?8 8 8 82 2 25 5 5 5 5 5rS   r5   c                   (    e Zd ZdZddZd ZddZdS )	r6   zA mark-to-base positioning rule. The ``base`` should be a
    `glyph-containing object`_. The ``marks`` should be a list of
    (:class:`Anchor`, :class:`MarkClass`) tuples.Nc                 Z    t                               | |           ||c| _        | _        d S r   )rB   r   r   marks)r   r   r  r   s       rQ   r   zMarkBasePosStatement.__init__t  s,    4*** $e	4:::rS   c                 v    |                     | j        | j                                        | j                   dS )z:Calls the builder object's ``add_mark_base_pos`` callback.N)add_mark_base_posr   r   r   r  r   s     rQ   r   zMarkBasePosStatement.buildx  s2    !!$-1C1C1E1EtzRRRRRrS   r   c                     d                     | j                                                  }| j        D ]C\  }}|d|z   t          z   d                     |                                |j                  z   z  }D|dz  }|S )Nzpos base {}r   {} mark @{}r8  )r   r   r   r  r  r   r   r   r   ams        rQ   r   zMarkBasePosStatement.asFea|  sz    ""49??#4#455J 	S 	SDAq4&=5(=+?+?		16+R+RRRCCs

rS   r   r   r  rN   rS   rQ   r6   r6   o  sX        5 5, , , ,S S S     rS   r6   c                   (    e Zd ZdZddZd ZddZdS )	r7   a  A mark-to-ligature positioning rule. The ``ligatures`` must be a
    `glyph-containing object`_. The ``marks`` should be a list of lists: each
    element in the top-level list represents a component glyph, and is made
    up of a list of (:class:`Anchor`, :class:`MarkClass`) tuples representing
    mark attachment points for that position.

    Example::

        m1 = MarkClass("TOP_MARKS")
        m2 = MarkClass("BOTTOM_MARKS")
        # ... add definitions to mark classes...

        glyph = GlyphName("lam_meem_jeem")
        marks = [
            [ (Anchor(625,1800), m1) ], # Attachments on 1st component (lam)
            [ (Anchor(376,-378), m2) ], # Attachments on 2nd component (meem)
            [ ]                         # No attachments on the jeem
        ]
        mlp = MarkLigPosStatement(glyph, marks)

        mlp.asFea()
        # pos ligature lam_meem_jeem <anchor 625 1800> mark @TOP_MARKS
        # ligComponent <anchor 376 -378> mark @BOTTOM_MARKS;

    Nc                 Z    t                               | |           ||c| _        | _        d S r   )rB   r   	ligaturesr  )r   r)  r  r   s       rQ   r   zMarkLigPosStatement.__init__  ,    4***%."


rS   c                 v    |                     | j        | j                                        | j                   dS )z9Calls the builder object's ``add_mark_lig_pos`` callback.N)add_mark_lig_posr   r)  r   r  r   s     rQ   r   zMarkLigPosStatement.build  s2      0G0G0I0I4:VVVVVrS   r   c                    d                     | j                                                  }g }| j        D ]}d}|t	          |          sd|z   t
          dz  z   dz   }nI|D ]F\  }}|d|z   t
          dz  z   d                     |                                |j                  z   z  }G|                    |           |d|z   t
          z   dz                       |          z  }|dz  }|S )	Nzpos ligature {}r   r   r   r  r#  ligComponentr8  )	r   r)  r   r  r   r  r   r   rT   )r   r   r   ligsltempr%  r&  s           rQ   r   zMarkLigPosStatement.asFea  s   &&t~';';'='=>> 	 	ADyAyf}uqy0?B  DAq !!)$ (..qwwyy!&AABDD KKv%6<<TBBBs

rS   r   r   r  rN   rS   rQ   r7   r7     sX         46 6 6 6W W W     rS   r7   c                   (    e Zd ZdZddZd ZddZdS )	r8   zA mark-to-mark positioning rule. The ``baseMarks`` must be a
    `glyph-containing object`_. The ``marks`` should be a list of
    (:class:`Anchor`, :class:`MarkClass`) tuples.Nc                 Z    t                               | |           ||c| _        | _        d S r   )rB   r   	baseMarksr  )r   r4  r  r   s       rQ   r   zMarkMarkPosStatement.__init__  r*  rS   c                 v    |                     | j        | j                                        | j                   dS )z:Calls the builder object's ``add_mark_mark_pos`` callback.N)add_mark_mark_posr   r4  r   r  r   s     rQ   r   zMarkMarkPosStatement.build  s2    !!$-1H1H1J1JDJWWWWWrS   r   c                     d                     | j                                                  }| j        D ]C\  }}|d|z   t          z   d                     |                                |j                  z   z  }D|dz  }|S )Nzpos mark {}r   r#  r8  )r   r4  r   r  r  r   r$  s        rQ   r   zMarkMarkPosStatement.asFea  s|    ""4>#7#7#9#9::J 	S 	SDAq4&=5(=+?+?		16+R+RRRCCs

rS   r   r   r  rN   rS   rQ   r8   r8     sX        5 56 6 6 6X X X     rS   r8   c                   *    e Zd ZdZ	 ddZd Zd	dZdS )
r9   a  A multiple substitution statement.

    Args:
        prefix: a list of `glyph-containing objects`_.
        glyph: a single glyph-containing object.
        suffix: a list of glyph-containing objects.
        replacement: a list of glyph-containing objects.
        forceChain: If true, the statement is expressed as a chaining rule
            (e.g. ``sub f' i' by f_i``) even when no context is given.
    FNc                     t                               | |           |||c| _        | _        | _        || _        || _        d S r   )rB   r   rV  r   rW  rX  r  )r   rV  r   rW  rX  r  r   s          rQ   r   zMultipleSubstStatement.__init__  sC     	4***/5uf,TZ&$rS   c           	         d | j         D             }d | j        D             }t          | j        d          r| j                                        }n| j        g}t          |          }g }| j        D ]j}t          |d          r|                                }n|g}t          |          dk    rt          |          |k    r||z  }|                    |           kt          t          |           }t                      }	t          |          D ]L\  }
}||	vrC|	                    |           |                    | j        ||||r||
         pd| j                   MdS )z;Calls the builder object's ``add_multiple_subst`` callback.c                 6    g | ]}|                                 S rN   r[  r\  s     rQ   r  z0MultipleSubstStatement.build.<locals>.<listcomp>  r^  rS   c                 6    g | ]}|                                 S rN   r[  r`  s     rQ   r  z0MultipleSubstStatement.build.<locals>.<listcomp>  r^  rS   r   r   rN   N)rV  rW  r   r   r   r   rX  r   ra  zipr  r_   addadd_multiple_substr   r  )r   r   rV  rW  	originalscountreplacesrreplaceseen_originalsr  r   s               rQ   r   zMultipleSubstStatement.build  s   44444444444:z** 	%
++--IIII! 	% 	%Aq*%% **,,#7||q  S\\U%:%:!E/OOG$$$$X''$Y// 
	 
	KAx~--""8,,,**M,!2O  
	 
	rS   r   c                 ~   d}t          | j                  st          | j                  s| j        rt          | j                  r3|d                    t          t          | j                            dz   z  }|t          | j                  dz   z  }t          | j                  r3|dd                    t          t          | j                            z   z  }n|t          | j                  z  }| j        pt                      g}|dz  }|d                    t          t          |                    z  }|dz  }|S )Nrd  r   re  r  r8  )
r   rV  rW  r  rT   r   r   r   rX  r   )r   r   r   rX  s       rQ   r   zMultipleSubstStatement.asFea  s   t{ 	%s4;// 	%4? 	%4; ?sxxE4; 7 7883>>5$$s**C4; ?sSXXc%&=&=>>>>5$$$C&79;;-vsxxE;//000s

rS   r#  r   r  rN   rS   rQ   r9   r9     s]        	 	 NR% % % %  B     rS   r9   c                   ,    e Zd ZdZ	 	 ddZd Zd	dZdS )
r<   a  A pair positioning statement.

    ``glyphs1`` and ``glyphs2`` should be `glyph-containing objects`_.
    ``valuerecord1`` should be a :class:`ValueRecord` object;
    ``valuerecord2`` should be either a :class:`ValueRecord` object or ``None``.
    If ``enumerated`` is true, then this is expressed as an
    `enumerated pair <https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#6.b.ii>`_.
    FNc                     t                               | |           || _        ||c| _        | _        ||c| _        | _        d S r   )rB   r   
enumeratedglyphs1valuerecord1glyphs2valuerecord2)r   rJ  rK  rL  rM  rI  r   s          rQ   r   zPairPosStatement.__init__!  sI     	4***$*1<'d'*1<'d'''rS   c                    | j         r| j                                        | j                                        g}d}t	          j        | D ]/\  }}d}|                    | j        || j        || j	                   0|st          d| j                  dS t          | j        t                    ot          | j        t                    }|r>|                    | j        | j        j        | j        | j        j        | j	                   dS |                    | j        | j                                        | j        | j                                        | j	                   dS )aM  Calls a callback on the builder object:

        * If the rule is enumerated, calls ``add_specific_pair_pos`` on each
          combination of first and second glyphs.
        * If the glyphs are both single :class:`GlyphName` objects, calls
          ``add_specific_pair_pos``.
        * Else, calls ``add_class_pair_pos``.
        FTz%Empty glyph class in positioning ruleN)rI  rJ  r   rL  	itertoolsproductadd_specific_pair_posr   rK  rM  r   r   r   r   add_class_pair_pos)r   r   r   	seen_pairglyph1glyph2is_specifics          rQ   r   zPairPosStatement.build/  s    ? 	&&(($,*?*?*A*ABAI"+"3Q"7   	--M64+<fdFW     %;T]   F y99 
jL)?
 ?
  	))"!"!     &&%%''!%%''!    rS   r   c                    | j         rdnd}| j        rx|d                    | j                                        | j                                        | j                                        | j                                                  z  }n_|d                    | j                                        | j                                        | j                                                  z  }|S )Nzenum r   zpos {} {} {} {};zpos {} {} {};)rI  rM  r   rJ  r   rK  rL  r   s      rQ   r   zPairPosStatement.asFeaZ  s    0ggb 
	%,,""$$!''))""$$!''))	  CC ?))""$$dl&8&8&:&:D<M<S<S<U<U  C 
rS   r#  r   r  rN   rS   rQ   r<   r<     sb          @ @ @ @) ) )V     rS   r<   c                   (    e Zd ZdZddZd ZddZdS )	r=   aP  A reverse chaining substitution statement. You don't see those every day.

    Note the unusual argument order: ``suffix`` comes `before` ``glyphs``.
    ``old_prefix``, ``old_suffix``, ``glyphs`` and ``replacements`` should be
    lists of `glyph-containing objects`_. ``glyphs`` and ``replacements`` should
    be one-item lists.
    Nc                 v    t                               | |           ||c| _        | _        || _        || _        d S r   )rB   r   
old_prefix
old_suffixr   replacements)r   rZ  r[  r   r\  r   s         rQ   r   z)ReverseChainSingleSubstStatement.__init__s  s=    4***+5z((rS   c                    d | j         D             }d | j        D             }| j        d                                         }| j        d                                         }t          |          dk    r|t          |          z  }|                    | j        ||t          t          ||                               d S )Nc                 6    g | ]}|                                 S rN   r[  r\  s     rQ   r  z:ReverseChainSingleSubstStatement.build.<locals>.<listcomp>z       8881!**,,888rS   c                 6    g | ]}|                                 S rN   r[  r`  s     rQ   r  z:ReverseChainSingleSubstStatement.build.<locals>.<listcomp>{  r_  rS   r   r   )
rZ  r[  r   r   r\  r   add_reverse_chain_single_substr   dictr=  r   r   rV  rW  r@  rB  s         rQ   r   z&ReverseChainSingleSubstStatement.buildy  s    8888888888KN++--	$Q'0022x==A#i..0H..M664Ix0H0H+I+I	
 	
 	
 	
 	
rS   r   c                 v   d}t          | j                  st          | j                  rt          | j                  r*|d                    d | j        D                       dz   z  }|d                    d | j        D                       z  }t          | j                  r*|dd                    d | j        D                       z   z  }n0|d                    t          t          | j                            z  }|d                    d                    d | j        D                                 z  }|S )Nzrsub r   c              3   4   K   | ]}t          |          V  d S r   r   r  s     rQ   rR   z9ReverseChainSingleSubstStatement.asFea.<locals>.<genexpr>  s(      BBQaBBBBBBrS   c              3   :   K   | ]}t          |          d z   V  dS r  r   r  s     rQ   rR   z9ReverseChainSingleSubstStatement.asFea.<locals>.<genexpr>  ,      @@qE!HHsN@@@@@@rS   c              3   4   K   | ]}t          |          V  d S r   r   r  s     rQ   rR   z9ReverseChainSingleSubstStatement.asFea.<locals>.<genexpr>  s(      %H%H1eAhh%H%H%H%H%H%HrS    by {};c              3   4   K   | ]}t          |          V  d S r   r   r  s     rQ   rR   z9ReverseChainSingleSubstStatement.asFea.<locals>.<genexpr>  (      (M(Maq(M(M(M(M(M(MrS   )	r   rZ  r[  rT   r   r   r   r   r\  r   s      rQ   r   z&ReverseChainSingleSubstStatement.asFea  s-   t 	53t#7#7 	54?## IsxxBB$/BBBBBSHH388@@DK@@@@@@C4?## IsSXX%H%H%H%H%HHHHH388Ct{33444Cy(M(M4;L(M(M(M M MNNN
rS   r   r   r  rN   rS   rQ   r=   r=   j  sU         ) ) ) )	
 	
 	
     rS   r=   c                   (    e Zd ZdZddZd ZddZdS )	r@   a.  A single substitution statement.

    Note the unusual argument order: ``prefix`` and suffix come `after`
    the replacement ``glyphs``. ``prefix``, ``suffix``, ``glyphs`` and
    ``replace`` should be lists of `glyph-containing objects`_. ``glyphs`` and
    ``replace`` should be one-item lists.
    Nc                     t                               | |           ||c| _        | _        || _        || _        || _        d S r   )rB   r   rV  rW  r  r   r\  )r   r   rD  rV  rW  r  r   s          rQ   r   zSingleSubstStatement.__init__  sD    4***#)6 T[$#rS   c                    d | j         D             }d | j        D             }| j        d                                         }| j        d                                         }t          |          dk    r|t          |          z  }|                    | j        ||t          t          ||                    | j
                   dS )z9Calls the builder object's ``add_single_subst`` callback.c                 6    g | ]}|                                 S rN   r[  r\  s     rQ   r  z.SingleSubstStatement.build.<locals>.<listcomp>  r^  rS   c                 6    g | ]}|                                 S rN   r[  r`  s     rQ   r  z.SingleSubstStatement.build.<locals>.<listcomp>  r^  rS   r   r   N)rV  rW  r   r   r\  r   add_single_substr   r   r=  r  rc  s         rQ   r   zSingleSubstStatement.build  s    4444444444KN++--	$Q'0022x==A#i..0H  MIx0011O	
 	
 	
 	
 	
rS   r   c                 r   d}t          | j                  st          | j                  s| j        rt          | j                  r*|d                    d | j        D                       dz   z  }|d                    d | j        D                       z  }t          | j                  r*|dd                    d | j        D                       z   z  }n'|d                    d | j        D                       z  }|d                    d                    d | j        D                                 z  }|S )	Nrd  r   c              3   4   K   | ]}t          |          V  d S r   r   r  s     rQ   rR   z-SingleSubstStatement.asFea.<locals>.<genexpr>  s(      >>Qa>>>>>>rS   c              3   :   K   | ]}t          |          d z   V  dS r  r   r  s     rQ   rR   z-SingleSubstStatement.asFea.<locals>.<genexpr>  rg  rS   c              3   4   K   | ]}t          |          V  d S r   r   r  s     rQ   rR   z-SingleSubstStatement.asFea.<locals>.<genexpr>  s(      %D%D1eAhh%D%D%D%D%D%DrS   c              3   4   K   | ]}t          |          V  d S r   r   r  s     rQ   rR   z-SingleSubstStatement.asFea.<locals>.<genexpr>  s(      ::E!HH::::::rS   ri  c              3   4   K   | ]}t          |          V  d S r   r   r  s     rQ   rR   z-SingleSubstStatement.asFea.<locals>.<genexpr>  rk  rS   )r   rV  rW  r  rT   r   r   r\  r   s      rQ   r   zSingleSubstStatement.asFea  s;   t{ 	;s4;// 	;4? 	;4; Esxx>>$+>>>>>DD388@@DK@@@@@@C4; EsSXX%D%D%D%D%DDDDD388::dk::::::Cy(M(M4;L(M(M(M M MNNN
rS   r   r   r  rN   rS   rQ   r@   r@     sU         $ $ $ $
 
 
      rS   r@   c                   (    e Zd ZdZddZd ZddZdS )	r>   zA ``script`` statement.Nc                 J    t                               | |           || _        d S r   )rB   r   r{   )r   r{   r   s      rQ   r   zScriptStatement.__init__  s#    4***rS   c                 F    |                     | j        | j                   dS )z,Calls the builder's ``set_script`` callback.N)
set_scriptr   r{   r   s     rQ   r   zScriptStatement.build  s"    4=$+66666rS   r   c                 Z    d                     | j                                                  S )Nz
script {};)r   r{   r"  r   s     rQ   r   zScriptStatement.asFea  s$    ""4;#4#4#6#6777rS   r   r   r  rN   rS   rQ   r>   r>     sQ        !!   7 7 78 8 8 8 8 8rS   r>   c                   (    e Zd ZdZddZd ZddZdS )	r?   zA single position statement. ``prefix`` and ``suffix`` should be
    lists of `glyph-containing objects`_.

    ``pos`` should be a one-element list containing a (`glyph-containing object`_,
    :class:`ValueRecord`) tuple.Nc                 v    t                               | |           |||c| _        | _        | _        || _        d S r   )rB   r   ru   rV  rW  r  )r   ru   rV  rW  r  r   s         rQ   r   zSinglePosStatement.__init__  s9    4***-0&&*$+t{$rS   c                     d | j         D             }d | j        D             }d | j        D             }|                    | j        |||| j                   dS )z7Calls the builder object's ``add_single_pos`` callback.c                 6    g | ]}|                                 S rN   r[  r\  s     rQ   r  z,SinglePosStatement.build.<locals>.<listcomp>  r^  rS   c                 6    g | ]}|                                 S rN   r[  r`  s     rQ   r  z,SinglePosStatement.build.<locals>.<listcomp>  r^  rS   c                 @    g | ]\  }}|                                 |fS rN   r[  )rO   r   r  s      rQ   r  z,SinglePosStatement.build.<locals>.<listcomp>  s)    >>>E

e$>>>rS   N)rV  rW  ru   add_single_posr   r  )r   r   rV  rW  ru   s        rQ   r   zSinglePosStatement.build  sg    4444444444>>TX>>>t}ffc4?SSSSSrS   r   c                 ,   d}t          | j                  st          | j                  s| j        rt          | j                  r3|d                    t          t          | j                            dz   z  }|d                    d | j        D                       z  }t          | j                  r3|dd                    t          t          | j                            z   z  }n'|d                    d | j        D                       z  }|dz  }|S )Nr  r   c                     g | ]B}t          |d                    dz   |d         d|d                                          z   ndz   CS )r   re  r   Nr   r   r   r  s     rQ   r  z,SinglePosStatement.asFea.<locals>.<listcomp>  sd         !A$KK/0t/?adjjll**RI  rS   c                     g | ]?}t          |d                    dz   |d         |d                                          ndz   @S )r   r   r   Nr   r   r  s     rQ   r  z,SinglePosStatement.asFea.<locals>.<listcomp>  sU        !A$KK#%19I1rR  rS   r8  )r   rV  rW  r  rT   r   r   ru   r   s      rQ   r   zSinglePosStatement.asFea  s*   t{ 	s4;// 	4? 	4; ?sxxE4; 7 7883>>388  "X	    C 4; ?sSXXc%&=&=>>>>388 !X    C 	s

rS   r   r   r  rN   rS   rQ   r?   r?     sX        $ $% % % %
T T T     rS   r?   c                   (    e Zd ZdZddZd ZddZdS )	rF   zRepresents a subtable break.Nc                 <    t                               | |           d S r   )rB   r   r   s     rQ   r   zSubtableStatement.__init__  s    4*****rS   c                 :    |                     | j                   dS )z<Calls the builder objects's ``add_subtable_break`` callback.N)add_subtable_breakr   r   s     rQ   r   zSubtableStatement.build  s    ""4=11111rS   r   c                     dS )Nz	subtable;rN   r   s     rQ   r   zSubtableStatement.asFea  s    {rS   r   r   r  rN   rS   rQ   rF   rF     sQ        &&+ + + +2 2 2     rS   rF   c                   R    e Zd ZdZ	 	 	 	 	 	 	 	 	 	 ddZd Zd Zd Zdd	Zd
 Z	e	Z
dS )rH   zRepresents a value record.NFc                     t                               | |
           ||c| _        | _        ||c| _        | _        ||c| _        | _        ||c| _        | _	        |	| _
        d S r   )r'   r   
xPlacement
yPlacementxAdvanceyAdvance
xPlaDevice
yPlaDevice
xAdvDevice
yAdvDevicevertical)r   r  r  r  r  r  r  r  r  r  r   s              rQ   r   zValueRecord.__init__  se     	D(+++,6
((0($t},6
(,6
( rS   c                     | j         |j         k    oO| j        |j        k    o?| j        |j        k    o/| j        |j        k    o| j        |j        k    o| j        |j        k    S r   )r  r  r  r  r  r  r   others     rQ   __eq__zValueRecord.__eq__!  sr    Ou// 45#334/4 /4 5#33	4
 5#33	
rS   c                 .    |                      |           S r   )r  r  s     rQ   __ne__zValueRecord.__ne__+  s    ;;u%%%%rS   c                 P   t          | j                  t          | j                  z  t          | j                  z  t          | j                  z  t          | j                  z  t          | j                  z  t          | j                  z  t          | j                  z  S r   )	hashr  r  r  r  r  r  r  r  r   s    rQ   __hash__zValueRecord.__hash__.  s    !!4?##$4=!!" 4=!!" 4?##	$
 4?##$ 4?##$ 4?##$		
rS   r   c                    | sdS | j         | j        }}| j        | j        }}| j        | j        }}| j        | j        }	}| j        }
|(|&||
rt          |          S ||
st          |          S |pd}|pd}|pd}|pd}||||	d|d|d|d|d	S d|d|d|d|dt          |          dt          |          dt          |          dt          |	          dS )Nz<NULL>r   <r   ro  )r  r  r  r  r  r  r  r  r  r|  rV   )r   r   rh  ri  r  r  r  r  r  r  r  s              rQ   r   zValueRecord.asFea:  sR    	81!]DM(!%$/J
!%$/J
= 9H8}}$!(!8}}$ FF=q=q """"&'aaHHHhhh?? AAAAHHHH:&&&&:&&&&:&&&&:&&&&	
 		
rS   c                 :     t           fddD                       S )Nc              3   <   K   | ]}t          |          d uV  d S r   )getattr)rO   vr   s     rQ   rR   z'ValueRecord.__bool__.<locals>.<genexpr>g  sF       
 
 D!D(
 
 
 
 
 
rS   )r  r  r  r  r  r  r  r  )r  r   s   `rQ   __bool__zValueRecord.__bool__f  s=     
 
 
 
	
 
 
 
 
 	
rS   )
NNNNNNNNFNr   )r   r   r   r   r   r  r  r  r   r  __nonzero__rN   rS   rQ   rH   rH   
  s        $$ ! ! ! !(
 
 
& & &

 

 

*
 *
 *
 *
X
 
 
 KKKrS   rH   c                   "    e Zd ZdZddZddZdS )rI   z+Represents a named value record definition.Nc                 X    t                               | |           || _        || _        d S r   )rB   r   r   r  )r   r   r  r   s       rQ   r   zValueRecordDefinition.__init__{  s*    4***	


rS   r   c                 f    d                     | j                                        | j                  S )NzvalueRecordDef {} {};)r   r  r   r   r   s     rQ   r   zValueRecordDefinition.asFea  s(    &--dj.>.>.@.@$)LLLrS   r   r   r   rN   rS   rQ   rI   rI   x  sH        55   
M M M M M MrS   rI   c                     | dk    r|dk    r|dk    rdS | dk    r|dk    r|dk    rdS d                     | ||          S )N   r   i	  r   r   1{} {} {}r   )pideidlids      rQ   simplify_name_attributesr    sV    
axxC1HHr	cQhh3!88s  c3///rS   c                   (    e Zd ZdZddZd ZddZdS )	r:   zRepresents a name record. (`Section 9.e. <https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#9.e>`_)Nc                     t                               | |           || _        || _        || _        || _        || _        d S r   )rB   r   nameID
platformID	platEncIDlangIDstring)r   r  r  r  r  r  r   s          rQ   r   zNameRecord.__init__  s?    4***$"rS   c                 v    |                     | j        | j        | j        | j        | j        | j                   dS )z8Calls the builder object's ``add_name_record`` callback.N)add_name_recordr   r  r  r  r  r  r   s     rQ   r   zNameRecord.build  sB    MKONKK	
 	
 	
 	
 	
rS   r   c           	          d t          | j        | j        | j                  }|t	          d| j                  t          | j        |          |dk    r?d                    fdt          dt                    d          D                       }n!d                    fd	D                       }t          | j        | j        | j                  }|dk    r|d
z  }d                    | j        ||          S )Nc                 J    | dk    r| dk    r| dvrt          |           S || z  S )N    ~   )"   \   )chr)r}  escape_patterns     rQ   escapez NameRecord.asFea.<locals>.escape  s3    DyyQ$YY1L+@+@1vv%))rS   zUnsupported encoding)encoding	utf_16_ber   c           
          g | ]=} t          |                   d z  t          |dz                      z   d          >S )   r   z\%04xr   )rO   r  r  r   s     rQ   r  z$NameRecord.asFea.<locals>.<listcomp>  sY        F71Q4==3.1q51B1BBHMM  rS   r   r   c                 B    g | ]} t          |          d           S )z\%02xr  )rO   br  s     rQ   r  z$NameRecord.asFea.<locals>.<listcomp>  s+    %N%N%NqffWQZZ&B&B%N%N%NrS   r   znameid {} {}"{}";)r   r  r  r  r   r   r   r  rT   r  r   r  r   r  )r   r   r  escaped_stringplatr  r   s        @@rQ   r   zNameRecord.asFea  s!   	* 	* 	* tLL!"8$-HHHDK(333{""WW    "1c!ffa00   NN  WW%N%N%N%NA%N%N%NOON'UU2::CKD"))$+t^LLLrS   r   r   r  rN   rS   rQ   r:   r:     s]         K  K   	
 	
 	
M M M M M MrS   r:   c                        e Zd ZdZd ZddZdS )r(   z4Represents a ``sizemenuname`` or ``name`` statement.c                 p    t                               | |           |                    | j                   dS )z8Calls the builder object's ``add_featureName`` callback.N)r:   r   add_featureNamer  r   s     rQ   r   zFeatureNameStatement.build  s4    w''',,,,,rS   r   c                     | j         dk    rd}nd}t          | j        | j        | j                  }|dk    r|dz  }d                    ||| j                  S )Nsizesizemenunamer   r   r   z
{} {}"{}";)r  r  r  r  r  r   r  )r   r   r   r  s       rQ   r   zFeatureNameStatement.asFea  s^    ;&   CCC'UU2::CKD""3dk:::rS   Nr   )r   r   r   r   r   r   rN   rS   rQ   r(   r(     s=        >>- - -
; ; ; ; ; ;rS   r(   c                       e Zd ZdZddZdS )rE   z+Represents a STAT table ``name`` statement.r   c                     t          | j        | j        | j                  }|dk    r|dz  }d                    || j                  S Nr   r   zname {}"{}";r  r  r  r  r   r  r   r   r  s      rQ   r   zSTATNameStatement.asFea  C    'UU2::CKD$$T4;777rS   Nr   )r   r   r   r   r   rN   rS   rQ   rE   rE     s.        558 8 8 8 8 8rS   rE   c                   (    e Zd ZdZddZd ZddZdS )	rA   zA ``parameters`` statement.Nc                 t    t                               | |           || _        || _        || _        || _        d S r   )rB   r   
DesignSizeSubfamilyID
RangeStartRangeEnd)r   r  r  r  r  r   s         rQ   r   zSizeParameters.__init__  s9    4***$&$ rS   c                 j    |                     | j        | j        | j        | j        | j                   dS )z<Calls the builder object's ``set_size_parameters`` callback.N)set_size_parametersr   r  r  r  r  r   s     rQ   r   zSizeParameters.build  s>    ##MOOM	
 	
 	
 	
 	
rS   r   c                     d                     | j        | j                  }| j        dk    s| j        dk    rC|d                     t          | j        dz            t          | j        dz                      z  }|dz   S )Nzparameters {:.1f} {}r   z {} {}
   r8  )r   r  r  r  r  intr   s      rQ   r   zSizeParameters.asFea  sv    $++DOT=MNN?a4=A#5#58??3t';#<#<c$-RTBT>U>UVVVCSyrS   r   r   r  rN   rS   rQ   rA   rA     sQ        %%! ! ! !
 
 
     rS   rA   c                   *    e Zd ZdZ	 ddZd ZddZdS )	r   z;Represent a name statement inside a ``cvParameters`` block.Nc           	      V    t                               | ||||||           || _        d S r
  )r:   r   r&  )r   r  r  r  r  r  r&  r   s           rQ   r   z"CVParametersNameStatement.__init__  s=     	&*i( 	 	
 	
 	
 %rS   c                    d}| j         dk    r3d                    |j                            | j        d                    }|                    | j                   | j        | j         |z   f| _        t                              | |           dS )z9Calls the builder object's ``add_cv_parameter`` callback.r   r(  z_{}r   N)r&  r   cv_num_named_params_getr  add_cv_parameterr:   r   )r   r   items      rQ   r   zCVParametersNameStatement.build  s    ?222<< < @ @a P PQQD  ---{DOd$:;w'''''rS   r   c                     t          | j        | j        | j                  }|dk    r|dz  }d                    || j                  S r  r  r  s      rQ   r   zCVParametersNameStatement.asFea
  r  rS   r   r   r  rN   rS   rQ   r   r     sX        EE SW% % % %( ( (8 8 8 8 8 8rS   r   c                   (    e Zd ZdZddZd ZddZdS )	r"   a  
    Statement used in cvParameters blocks of Character Variant features (cvXX).
    The Unicode value may be written with either decimal or hexadecimal
    notation. The value must be preceded by '0x' if it is a hexadecimal value.
    The largest Unicode value allowed is 0xFFFFFF.
    Nc                 X    t                               | |           || _        || _        d S r   )rB   r   	characterr   )r   r  r   r   s       rQ   r   zCharacterStatement.__init__  s*    4***"rS   c                 F    |                     | j        | j                   dS )z9Calls the builder object's ``add_cv_character`` callback.N)add_cv_characterr  r   r   s     rQ   r   zCharacterStatement.build  s"      :::::rS   r   c                 6    d                     | j                  S )NzCharacter {:#x};)r   r  r   s     rQ   r   zCharacterStatement.asFea"  s    !((888rS   r   r   r  rN   rS   rQ   r"   r"     sU            
; ; ;9 9 9 9 9 9rS   r"   c                   (    e Zd ZdZddZd ZddZdS )	r   zAn axis definition, being either a ``VertAxis.BaseTagList/BaseScriptList``
    pair or a ``HorizAxis.BaseTagList/BaseScriptList`` pair.Nc                 t    t                               | |           || _        || _        || _        g | _        d S r   )rB   r   basesscriptsr  minmax)r   r  r  r  r  r   s         rQ   r   zBaseAxis.__init__*  s8    4***
 rS   c                 ^    |                     | j        | j        | j        | j                   dS )z6Calls the builder object's ``set_base_axis`` callback.N)set_base_axisr  r  r  r  r   s     rQ   r   zBaseAxis.build1  s*    dj$,t{SSSSSrS   r   c           	         | j         rdndd | j        D             }fd| j        D             }d                    d                    | j                  |d                    |                    d                    |          z   S )	NVertHorizc                     g | ]Q}d                      |d         |d         d                    t          t          |d                                       RS )r  r   r   r   r   )r   rT   r   r|  )rO   r%  s     rQ   r  z"BaseAxis.asFea.<locals>.<listcomp>7  sZ     
 
 
 adAaD#((3sAaD>>*B*BCC
 
 
rS   c           
      r    g | ]3}d                      |d         |d         |d         |d                   4S )z
{}Axis.MinMax {} {} {}, {};r   r   r   r  r  )rO   r%  	directions     rQ   r  z"BaseAxis.asFea.<locals>.<listcomp>;  sR     
 
 
 ,229adAaD!A$PQRSPTUU
 
 
rS   z2{}Axis.BaseTagList {};
{}{}Axis.BaseScriptList {};r   rL   r   )r  r  r  r   rT   r  )r   r   r  minmaxesr   s       @rQ   r   zBaseAxis.asFea5  s    "m8FF	
 
\
 
 

 
 
 
[
 
 
 EKKsxx
++VY		'@R@R
 
IIh  	 rS   r   r   r  rN   rS   rQ   r   r   &  sZ        @ @   T T T           rS   r   c                   (    e Zd ZdZddZd ZddZdS )	r;   zAn entry in the ``OS/2`` table. Most ``values`` should be numbers or
    strings, apart from when the key is ``UnicodeRange``, ``CodePageRange``
    or ``Panose``, in which case it should be an array of integers.Nc                 X    t                               | |           || _        || _        d S r   rB   r   r  r  r   r  r  r   s       rQ   r   zOS2Field.__init__I  *    4***


rS   c                 F    |                     | j        | j                   dS )z6Calls the builder object's ``add_os2_field`` callback.N)add_os2_fieldr  r  r   s     rQ   r   zOS2Field.buildN  s"    dh
33333rS   r   c                 F   d d}d}t          d |D                       }|                    fd|D                        dg|d<   dd	 g|d
<   | j        |v rFd                    || j                 d          || j                 d         | j                            S dS )Nc                 R    d                     t          t          |                     S )Nr   )rT   r   r|  )rh  s    rQ   
intarr2strz"OS2Field.asFea.<locals>.intarr2strS  s    88CQKK(((rS   )FSTypeTypoAscenderTypoDescenderTypoLineGap	winAscent
winDescentXHeight	CapHeightWeightClass
WidthClassLowerOpSizeUpperOpSize)UnicodeRangeCodePageRangec                 H    g | ]}|                                 |t          gf S rN   )r   r|  r  s     rQ   r  z"OS2Field.asFea.<locals>.<listcomp>e  s)    @@@1!''))aX.@@@rS   c                 @    g | ]}|                                 |gfS rN   r   )rO   rh  r  s     rQ   r  z"OS2Field.asFea.<locals>.<listcomp>f  s*    FFF!!''))a_5FFFrS   PanosepanoseVendorc                 ,    d                     |           S )Nz"{}"r  )ri  s    rQ   <lambda>z OS2Field.asFea.<locals>.<lambda>h  s    &--2B2B rS   vendor{} {};r   r   r   )rb  updater  r   r  )r   r   numbersrangeskeywordsr  s        @rQ   r   zOS2Field.asFeaR  s    	) 	) 	)
 3@@@@@AAFFFFvFFFGGG&
3&(B(BC8x??"1%'<x'9!'<TZ'H'H   rrS   r   r   r  rN   rS   rQ   r;   r;   D  sW        G G   
4 4 4     rS   r;   c                   (    e Zd ZdZddZd ZddZdS )	r+   zAn entry in the ``hhea`` table.Nc                 X    t                               | |           || _        || _        d S r   r  r  s       rQ   r   zHheaField.__init__s  r  rS   c                 F    |                     | j        | j                   dS )z7Calls the builder object's ``add_hhea_field`` callback.N)add_hhea_fieldr  r  r   s     rQ   r   zHheaField.buildx  "    tx44444rS   r   c                     d}t          d |D                       }d                    || j                 | j                  S )N)CaretOffsetAscender	DescenderLineGapc                 :    g | ]}|                                 |fS rN   r  r  s     rQ   r  z#HheaField.asFea.<locals>.<listcomp>~  $    888A!''))Q888rS   r#  rb  r   r  r  r   r   fieldsr'  s       rQ   r   zHheaField.asFea|  s@    D8888899x14:>>>rS   r   r   r  rN   rS   rQ   r+   r+   p  Q        ))   
5 5 5? ? ? ? ? ?rS   r+   c                   (    e Zd ZdZddZd ZddZdS )	rJ   zAn entry in the ``vhea`` table.Nc                 X    t                               | |           || _        || _        d S r   r  r  s       rQ   r   zVheaField.__init__  r  rS   c                 F    |                     | j        | j                   dS )z7Calls the builder object's ``add_vhea_field`` callback.N)add_vhea_fieldr  r  r   s     rQ   r   zVheaField.build  r,  rS   r   c                     d}t          d |D                       }d                    || j                 | j                  S )N)VertTypoAscenderVertTypoDescenderVertTypoLineGapc                 :    g | ]}|                                 |fS rN   r  r  s     rQ   r  z#VheaField.asFea.<locals>.<listcomp>  r3  rS   r#  r4  r5  s       rQ   r   zVheaField.asFea  s@    M8888899x14:>>>rS   r   r   r  rN   rS   rQ   rJ   rJ     r7  rS   rJ   c                   (    e Zd ZdZddZd ZddZdS )	rD   zA STAT table Design Axis

    Args:
        tag (str): a 4 letter axis tag
        axisOrder (int): an int
        names (list): a list of :class:`STATNameStatement` objects
    Nc                 t    t                               | |           || _        || _        || _        || _        d S r   )rB   r   r   	axisOrdernamesr   )r   r   rC  rD  r   s        rQ   r   z STATDesignAxisStatement.__init__  s8    4***"
 rS   c                 <    |                     | | j                   d S r   )addDesignAxisr   r   s     rQ   r   zSTATDesignAxisStatement.build  s     dDM22222rS   r   c                     t           z  d| j         d| j         d}|dz                       fd| j        D                       dz   z  }|dz  }|S )NzDesignAxis r   z { 
r   c                 <    g | ]}|                                S r  r   r  s     rQ   r  z1STATDesignAxisStatement.asFea.<locals>.<listcomp>  '    $P$P$PQWWFW%;%;$P$P$PrS   };)r  r   rC  rT   rD  r   s    ` rQ   r   zSTATDesignAxisStatement.asFea  so    %=DH==t~===v##$P$P$P$PTZ$P$P$PQQTXXXt
rS   r   r   r  rN   rS   rQ   rD   rD     sU         ! ! ! !3 3 3     rS   rD   c                   (    e Zd ZdZddZd ZddZdS )	r%   ziSTAT table ElidedFallbackName

    Args:
        names: a list of :class:`STATNameStatement` objects
    Nc                 X    t                               | |           || _        || _        d S r   )rB   r   rD  r   )r   rD  r   s      rQ   r   zElidedFallbackName.__init__  *    4***
 rS   c                 F    |                     | j        | j                   d S r   )setElidedFallbackNamerD  r   r   s     rQ   r   zElidedFallbackName.build  "    %%dj$-@@@@@rS   r   c                     t           z  d}|dz                       fd| j        D                       dz   z  }|dz  }|S )NzElidedFallbackName { 
r   c                 <    g | ]}|                                S r  r   r  s     rQ   r  z,ElidedFallbackName.asFea.<locals>.<listcomp>  rI  rS   rJ  )r  rT   rD  r   s    ` rQ   r   zElidedFallbackName.asFea  sX    %'v##$P$P$P$PTZ$P$P$PQQTXXXt
rS   r   r   r  rN   rS   rQ   r%   r%     sX         ! ! ! !
A A A     rS   r%   c                   (    e Zd ZdZddZd ZddZdS )	r&   zpSTAT table ElidedFallbackNameID

    Args:
        value: an int pointing to an existing name table name ID
    Nc                 X    t                               | |           || _        || _        d S r   )rB   r   r  r   )r   r  r   s      rQ   r   zElidedFallbackNameID.__init__  rM  rS   c                 F    |                     | j        | j                   d S r   )rO  r  r   r   s     rQ   r   zElidedFallbackNameID.build  rP  rS   r   c                     d| j          dS )NzElidedFallbackNameID r8  )r  r   s     rQ   r   zElidedFallbackNameID.asFea  s    4tz4444rS   r   r   r  rN   rS   rQ   r&   r&     sX         ! ! ! !
A A A5 5 5 5 5 5rS   r&   c                   (    e Zd ZdZddZd ZddZdS )	rC   zA STAT table Axis Value Record

    Args:
        names (list): a list of :class:`STATNameStatement` objects
        locations (list): a list of :class:`AxisValueLocationStatement` objects
        flags (int): an int
    Nc                 f    t                               | |           || _        || _        || _        d S r   )rB   r   rD  	locationsr  )r   rD  rY  r  r   s        rQ   r   zSTATAxisValueStatement.__init__  s1    4***
"


rS   c                 <    |                     | | j                   d S r   )addAxisValueRecordr   r   s     rQ   r   zSTATAxisValueStatement.build  s     ""477777rS   r   c                    d}| j         D ]}||                                z  }| j        D ]}||                                z  }|dz  }| j        rqddg}g }d}t	          t          |                    D ]0}| j        |z  dk    r|                    ||                    |dz  }1|dd                    |           d	z  }|d
z  }|S )NzAxisValue {
r   OlderSiblingFontAttributeElidableAxisValueNamer   r   zflag r   ;
rJ  )rY  r   rD  r  r  r   r   rT   )	r   r   r   r   
nameRecordr  flagStringsr   r  s	            rQ   r   zSTATAxisValueStatement.asFea  s    	$ 	$H8>>###CC* 	 	J:##%%%C4KCC: 	602IJEKD3u::&& ! !:$))&&uQx000qy5388K005555Ct
rS   r   r   r  rN   rS   rQ   rC   rC     sU            8 8 8     rS   rC   c                   "    e Zd ZdZddZddZdS )r   z
    A STAT table Axis Value Location

    Args:
        tag (str): a 4 letter axis tag
        values (list): a list of ints and/or floats
    Nc                 X    t                               | |           || _        || _        d S r   )rB   r   r   values)r   r   rd  r   s       rQ   r   z#AxisValueLocationStatement.__init__
  s*    4***rS   r   c                 v    |d| j          dz  }|d                    d | j        D                        dz  }|S )Nz	location r   c              3   4   K   | ]}t          |          V  d S r   r{  )rO   r  s     rQ   rR   z3AxisValueLocationStatement.asFea.<locals>.<genexpr>  s(      77a3q66777777rS   r_  )r   rT   rd  )r   r   s     rQ   r   z AxisValueLocationStatement.asFea  sO    &48&&&&#((774;77777<<<<
rS   r   r   r   rN   rS   rQ   r   r     sF            
     rS   r   c                   (    e Zd ZdZddZd ZddZdS )	r#   z
    A variable layout conditionset

    Args:
        name (str): the name of this conditionset
        conditions (dict): a dictionary mapping axis tags to a
            tuple of (min,max) userspace coordinates.
    Nc                 X    t                               | |           || _        || _        d S r   )rB   r   r   
conditions)r   r   ri  r   s       rQ   r   zConditionsetStatement.__init__  s*    4***	$rS   c                 R    |                     | j        | j        | j                   d S r   )add_conditionsetr   r   ri  r   s     rQ   r   zConditionsetStatement.build$  s&      	4?KKKKKrS   r   c           	          ||d| j          dz   dz   z  }| j                                        D ]!\  }\  }}||t          z   | d| d| dz   z  }"||dz   d| j          dz   z  }|S )Nzconditionset r   r   r_  })r   ri  r  r  )r   r   r   r   minvaluemaxvalues         rQ   r   zConditionsetStatement.asFea'  s    v4	4444u<<)-)>)>)@)@ 	F 	F%C%(H6E>s$E$EX$E$E$E$E$EEECCv|0$)00000
rS   r   )r   r   r  rN   rS   rQ   r#   r#     sX         % % % %
L L L     rS   r#   c                   (    e Zd ZdZddZd Zd	dZdS )
VariationBlockzCA variation feature block, applicable in a given set of conditions.FNc                 h    t                               | |           |||c| _        | _        | _        d S r   )r   r   r   conditionsetr  )r   r   rs  r  r   s        rQ   r   zVariationBlock.__init__2  s8    tX&&& 	9	4$d&8&8&8rS   c                 (   |                     | j        | j        | j                   | j        dk    r+| j        |j        vrt          d| j         | j                  |j        }i |_        t          	                    | |           |j        
                                D ]W\  }}|j                            |i                               | j        g           }|                    |           ||vrg ||<   X||_        |                                 dS )r  r   z,variation block used undefined conditionset N)r  r   r   r  rs  conditionsets_r   r  r   r   r  feature_variations_r  r   r  )r   r   r  r  r  r  s         rQ   r   zVariationBlock.build:  s(    	dmTY8JKKK''!)???!Rt?PRR   $D'"""!+1133 	# 	#JC/::3CCNN!2 E LL("" "$rS   r   c                    |d| j                                         z  z   }|| j        dz   z  }| j        r|dz  }|dz  }|t                              | |          z  }||d| j                                         z  z   z  }|S )Nzvariation %s r   r  r   r  r!  )r   r"  rs  r  r   r   r   s      rQ   r   zVariationBlock.asFeaV  s    ):):::t 3&& 	#?"Cuu{{4{///v	DIOO$5$5555
rS   r#  r   r  rN   rS   rQ   rq  rq  /  sQ        MM
 
 
 
  8     rS   rq  )XfontTools.feaLib.errorr   fontTools.feaLib.locationr   fontTools.misc.encodingToolsr   fontTools.misc.textToolsr   r   collectionsr   rO  r  __all__rV   r  r   r   objectr	   rB   r'   r   r   r   r   r   r   r   r   r
   r   r   r   rG   r   r   r   r   r   r   r   r   r    r!   r$   r)   r,   r-   r.   r/   r0   r*   r1   r2   r3   r4   r5   r6   r7   r8   r9   r<   r=   r@   r>   r?   rF   rH   rI   r  r:   r(   rE   rA   r   r"   r   r;   r+   rJ   rD   r%   r&   rC   r   r#   rq  rN   rS   rQ   <module>r     sm   2 2 2 2 2 2 8 8 8 8 8 8 4 4 4 4 4 4 5 5 5 5 5 5 5 5 # # # # # #    C C CLF F F s5 5 57 7t      f   ,	 	 	 	 	 	 	 		 	 	 	 	 	 	 		 	 	 	 	g 	 	 	    
   ! ! ! ! !
 ! ! ! ;% ;% ;% ;% ;% ;% ;% ;%|* * * * *Z * * *") ) ) ) )J ) ) )"    Y   
 
 
 
 
I 
 
 
.	J 	J 	J 	J 	J% 	J 	J 	J    5   >    %   *    %   ,       C C C C C9 C C C 
 
 
 
 
Y 
 
 
<* * * * * * * *Z$
 $
 $
 $
 $
) $
 $
 $
N" " " " "i " " "J" " " " "Z " " "J    y   
 
 
 
 
i 
 
 
&7 7 7 7 7y 7 7 7t7 7 7 7 7 7 7 7tT T T T T) T T T*6 6 6 6 6	 6 6 6!9 !9 !9 !9 !9 !9 !9 !9H9 9 9 9 99 9 9 9B7 7 7 7 7y 7 7 7&    	   :R R R R Ri R R R< < < < <I < < <
 
 
 
 
I 
 
 
&
 
 
 
 
) 
 
 
&$ $ $ $ $Y $ $ $N&6 &6 &6 &6 &6) &6 &6 &6R5 5 5 5 5y 5 5 5"    9   *5 5 5 5 5) 5 5 5p    9   *C C C C CY C C CLP P P P Py P P Pf% % % % %y % % %P+ + + + +9 + + +\8 8 8 8 8i 8 8 8* * * * * * * *Z    	   k k k k k* k k k\	M 	M 	M 	M 	MI 	M 	M 	M0 0 0.M .M .M .M .M .M .M .Mb; ; ; ; ;: ; ; ;&8 8 8 8 8
 8 8 8    Y   68 8 8 8 8
 8 8 869 9 9 9 9 9 9 9*         y      <) ) ) ) )y ) ) )X? ? ? ? ?	 ? ? ?$? ? ? ? ?	 ? ? ?$    i   6       .5 5 5 5 59 5 5 5&% % % % %Y % % %P       (    I   4/ / / / /U / / / / /rS   