a
    èÝEbW ã                   @   sŠ  d dl mZ d dlmZmZmZmZ d dlmZ d dl	m
Z
mZmZ d dlmZ d dlmZ 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mZ d dlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:Z:d dl;m<Z< d dl=Z=d dl>Z>d dl?Z?e= @eA¡ZBddd„ZCddd„ZDG dd„ deEƒZFdS )é    )Ússtruct)ÚTagÚtostrÚ
binary2numÚsafeEval)ÚFeatureLibError)ÚLookupDebugInfoÚLOOKUP_DEBUG_INFO_KEYÚLOOKUP_DEBUG_ENV_VAR)ÚParser)ÚFeatureFile)ÚVariableScalar)Úbuilder)Ú
maxCtxFont)ÚnewTableÚgetTableModule)ÚotBaseÚotTables)ÚAlternateSubstBuilderÚChainContextPosBuilderÚChainContextSubstBuilderÚLigatureSubstBuilderÚMultipleSubstBuilderÚCursivePosBuilderÚMarkBasePosBuilderÚMarkLigPosBuilderÚMarkMarkPosBuilderÚReverseChainSingleSubstBuilderÚSingleSubstBuilderÚClassPairPosSubtableBuilderÚPairPosBuilderÚSinglePosBuilderÚChainContextualRule)ÚOpenTypeLibError)ÚOnlineVarStoreBuilder)ÚbuildVarDevTable)ÚaddFeatureVariationsRaw©ÚnormalizeValue)ÚdefaultdictN)ÚStringIOFc                 C   s   t | |ƒ}|j||d� dS )aô  Add features from a file to a font. Note that this replaces any features
    currently present.

    Args:
        font (feaLib.ttLib.TTFont): The font object.
        featurefile: Either a path or file object (in which case we
            parse it into an AST), or a pre-parsed AST instance.
        tables: If passed, restrict the set of affected tables to those in the
            list.
        debug: Whether to add source debugging information to the font in the
            ``Debg`` table

    ©ÚtablesÚdebugN)ÚBuilderÚbuild)ÚfontÚfeaturefiler,   r-   r   © r2   úX/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/fontTools/feaLib/builder.pyÚaddOpenTypeFeatures1   s    
r4   c                 C   s*   t t|ƒƒ}|r||_t| |||d� dS )ae  Add features from a string to a font. Note that this replaces any
    features currently present.

    Args:
        font (feaLib.ttLib.TTFont): The font object.
        features: A string containing feature code.
        filename: The directory containing ``filename`` is used as the root of
            relative ``include()`` paths; if ``None`` is provided, the current
            directory is assumed.
        tables: If passed, restrict the set of affected tables to those in the
            list.
        debug: Whether to add source debugging information to the font in the
            ``Debg`` table

    r+   N)r*   r   Únamer4   )r0   ÚfeaturesÚfilenamer,   r-   r1   r2   r2   r3   ÚaddOpenTypeFeaturesFromStringC   s    r8   c                   @   sº  e Zd Zedd„ dD ƒƒZdd„ Zdªdd	„Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Z d>d?„ Z!d@dA„ Z"dBdC„ Z#dDdE„ Z$dFdG„ Z%dHdI„ Z&dJdK„ Z'dLdM„ Z(dNdO„ Z)dPdQ„ Z*dRdS„ Z+dTdU„ Z,dVdW„ Z-dXdY„ Z.dZd[„ Z/d\d]„ Z0d^d_„ Z1d`da„ Z2dbdc„ Z3ddde„ Z4dfdg„ Z5dhdi„ Z6djdk„ Z7dldm„ Z8dndo„ Z9d«dpdq„Z:drds„ Z;dtdu„ Z<dvdw„ Z=dxdy„ Z>dzd{„ Z?d|d}„ Z@d~d„ ZAd€d�„ ZBd‚dƒ„ ZCd„d…„ ZDd†d‡„ ZEdˆd‰„ ZFdŠd‹„ ZGdŒd�„ ZHdŽd�„ ZId�d‘„ ZJd’d“„ ZKd”d•„ ZLd–d—„ ZMd˜d™„ ZNdšd›„ ZOdœd�„ ZPdždŸ„ ZQd d¡„ ZRd¢d£„ ZSd¤d¥„ ZTd¦d§„ eUjVD ƒZWd¨d©„ ZXdS )¬r.   c                 c   s   | ]}t |ƒV  qd S ©N)r   ©Ú.0Útagr2   r2   r3   Ú	<genexpr>^   s   ÿzBuilder.<genexpr>)
ÚBASEÚGDEFÚGPOSÚGSUBúOS/2ÚheadÚhhear5   ÚvheaÚSTATc                 C   st  || _ t|tƒr |d  | _| _nd | | _| _| ¡ | _d | _d|v rh|d j| _t	dd„ | jD ƒƒ| _t
ƒ | _d | _d| _d | _t
ƒ | _d| _i | _d | _d | _d | _g | _i i dœ| _i | _i | _i | _g | _d | _i | _t
ƒ | _i | _t
ƒ | _i | _ i | _!t"t#ƒ| _$d | _%d | _&g | _'d | _(d | _)i | _*i | _+i | _,i | _-i | _.i | _/i | _0i | _1i | _2i | _3i | _4i | _5d S )NÚfvarc                 S   s   g | ]
}|j ‘qS r2   )ÚaxisTag)r;   Úaxr2   r2   r3   Ú
<listcomp>{   ó    z$Builder.__init__.<locals>.<listcomp>r   F)rA   r@   )6r0   Ú
isinstancer   Ú	parseTreeÚfileZgetReverseGlyphMapÚglyphMapÚvarstorebuilderÚaxesr$   ÚsetÚdefault_language_systems_Úscript_Úlookupflag_Úlookupflag_markFilterSet_Úlanguage_systemsÚseen_non_DFLT_script_Únamed_lookups_Úcur_lookup_Úcur_lookup_name_Úcur_feature_name_Úlookups_Úlookup_locationsÚ	features_Úrequired_features_Úfeature_variations_Úaalt_features_Úaalt_location_Úaalt_alternates_ÚfeatureNames_ÚfeatureNames_ids_Úcv_parameters_Úcv_parameters_ids_Úcv_num_named_params_r)   ÚlistÚcv_characters_Úsize_parameters_ÚfontRevision_Únames_Úbase_horiz_axis_Úbase_vert_axis_ÚattachPoints_ÚligCaretCoords_ÚligCaretPoints_ÚglyphClassDefs_ÚmarkAttach_ÚmarkAttachClassID_ÚmarkFilterSets_Úos2_Úhhea_Úvhea_Ústat_Úconditionsets_)Úselfr0   r1   r2   r2   r3   Ú__init__n   sh    

ÿ
zBuilder.__init__NFc           
         s>  ˆ j d u rtˆ jˆ jƒ ¡ ˆ _ ˆ j  ˆ ¡ |d u r:ˆ j}n4t|ƒ}|ˆ j }|rnd t	|ƒ¡}t
d|› d�ƒ‚d|v r~ˆ  ¡  d|v rŽˆ  ¡  d|v ržˆ  ¡  d|v r®ˆ  ¡  d|v r¾ˆ  ¡  d	|v rÎˆ  ¡  d
|v rÞˆ  ¡  dD ]‚}||vrðqâˆ  |¡}ˆ j�rˆ  ||¡ |jjdk�s8|jjdk�s8|jjdk�rRt|ƒ }ˆ j|< ||_qâ|ˆ jv râˆ j|= qât‡ fdd„dD ƒƒ�rœd	ˆ jv �rœtˆ jƒˆ jd	 _ d|v �rÖˆ  !¡ }|�rÀ|ˆ jd< ndˆ jv �ræˆ jd= nˆ j"�ræt#dƒ‚d|v �rˆ  $¡ }	|	�r
|	ˆ jd< ndˆ jv �rˆ jd= |�s2t%j& 't(¡�r:ˆ  )¡  d S )Nz, z9The following tables were requested but are unsupported: Ú.rA   rC   rD   rE   r5   rB   rF   ©r@   rA   r   c                 3   s   | ]}|ˆ j v V  qd S r9   )r0   r:   ©r}   r2   r3   r=   á   rK   z Builder.build.<locals>.<genexpr>r?   z-Must save GDEF when compiling a variable fontr>   )*rM   r   rN   rO   Úparser/   ÚsupportedTablesÚ	frozensetÚjoinÚsortedÚNotImplementedErrorÚbuild_feature_aalt_Ú
build_headÚ
build_hheaÚ
build_vheaÚ
build_nameÚ
build_OS_2Ú
build_STATÚ	makeTablera   ÚmakeFeatureVariationsÚ
ScriptListÚScriptCountÚFeatureListÚFeatureCountÚ
LookupListÚLookupCountr   r0   ÚtableÚanyr   ÚusMaxContextÚ	buildGDEFrP   r   Ú	buildBASEÚosÚenvironÚgetr
   Ú	buildDebg)
r}   r,   r-   ÚunsupportedZunsupported_stringr<   r—   Z	fontTableÚgdefÚbaser2   r�   r3   r/   ´   s|    

ÿÿ

ÿ
þ
ý

$


zBuilder.buildc                 C   s,   || j |ƒ}| j|_| j|_| j |¡ |S r9   )r0   rU   Ú
lookupflagrV   ÚmarkFilterSetr]   Úappend)r}   ÚlocationÚbuilder_classÚresultr2   r2   r3   Úget_chained_lookup_ô   s
    zBuilder.get_chained_lookup_c                 C   s2   | j D ]&\}}|||f}| j |g ¡ |¡ qd S r9   )rW   r_   Ú
setdefaultr¥   )r}   ÚlookupZfeature_nameÚscriptÚlangÚkeyr2   r2   r3   Úadd_lookup_to_feature_û   s    
zBuilder.add_lookup_to_feature_c                 C   s¬   | j r6t| j ƒ|kr6| j j| jkr6| j j| jkr6| j S | jrL| j rLtd|ƒ‚|| j|ƒ| _ | j| j _| j| j _| j	 
| j ¡ | jr�| j | j| j< | jr¦|  | j | j¡ | j S )NzOWithin a named lookup block, all rules must be of the same lookup type and flag)rZ   Útyper£   rU   r¤   rV   r[   r   r0   r]   r¥   rY   r\   r¯   )r}   r¦   r§   r2   r2   r3   Úget_lookup_   s.    ÿþýüý

zBuilder.get_lookup_c              	      s|  ˆj sˆjsd S dd„ ˆj ¡ D ƒ}ˆj dg D ]š\}‰ ‡ fdd„ˆj ¡ D ƒ}|sjˆ dkrjtdˆ  |ƒ‚|D ]Z\}}}}|D ]H}t|tƒs’|g}|D ].}| ¡  ¡ D ]\}	}
| |	t	ƒ ¡ 
|
¡ q¦q–q~qnq0dd„ | ¡ D ƒ}‡fd	d„| ¡ D ƒ}|�s|�sd S d
d„ ˆj ¡ D ƒˆ_ˆj}g ˆ_ˆ ˆjd¡ |�rLˆ |t¡}||_|�rdˆ |t¡}||_ˆ ¡  ˆj |¡ d S )Nc                 S   s   i | ]\}}|t |ƒ“qS r2   )rR   )r;   ÚgÚar2   r2   r3   Ú
<dictcomp>  rK   z/Builder.build_feature_aalt_.<locals>.<dictcomp>)NÚaaltc                    s*   g | ]"\\}}}}|ˆ kr||||f‘qS r2   r2   ©r;   r¬   r­   ÚfeatureÚlookups)r5   r2   r3   rJ      s   þz/Builder.build_feature_aalt_.<locals>.<listcomp>rµ   zFeature %s has not been definedc                 S   s*   i | ]"\}}t |ƒd kr|t|ƒd “qS )é   r   )Úlenrj   ©r;   ÚglyphÚreplr2   r2   r3   r´   1  s   c                    s.   i | ]&\}}t |ƒd kr|t|ˆ jjd�“qS )r¹   ©r®   )rº   r†   r0   Z
getGlyphIDr»   r�   r2   r3   r´   6  s   þc                 S   s*   i | ]"\\}}}}|d kr|||f|“qS )rµ   r2   r¶   r2   r2   r3   r´   =  s   þ)rb   rd   Úitemsr_   r   rL   rj   ZgetAlternateGlyphsrª   rR   Úupdater]   Ústart_featurerc   r±   r   Úmappingr   Ú
alternatesÚend_featureÚextend)r}   rÃ   r¦   r·   r¬   r­   r¸   Ú
lookuplistr«   r¼   ÚaltsÚsingleZmultiZold_lookupsZsingle_lookupZmulti_lookupr2   )r5   r}   r3   rˆ     sP    
þÿ
ÿ
þþzBuilder.build_feature_aalt_c                 C   sX   | j s
d S | j d¡}|sLtdƒ }| jd< | d| j¡ d|_d |_|_| j |_d S )NrC   s6                                                         g      ð?l   ùe )	rm   r0   rž   r   Ú	decompileÚtableVersionÚcreatedÚmodifiedZfontRevision©r}   r—   r2   r2   r3   r‰   N  s    zBuilder.build_headc                 C   sœ   | j s
d S | j d¡}|s@tdƒ }| jd< | d| j¡ d|_d| j v rV| j d |_d| j v rl| j d |_d| j v r‚| j d |_d| j v r˜| j d |_	d S )NrD   ó$                                       é   ZcaretoffsetZascenderZ	descenderZlinegap)
ry   r0   rž   r   rÉ   rÊ   ZcaretOffsetÚascentÚdescentÚlineGaprÍ   r2   r2   r3   rŠ   Y  s    



zBuilder.build_hheac                 C   s†   | j s
d S | j d¡}|s@tdƒ }| jd< | d| j¡ d|_d| j v rV| j d |_d| j v rl| j d |_d| j v r‚| j d |_d S )NrE   rÎ   i  ZverttypoascenderZverttypodescenderZverttypolinegap)	rz   r0   rž   r   rÉ   rÊ   rÐ   rÑ   rÒ   rÍ   r2   r2   r3   r‹   j  s    


zBuilder.build_vheac                 C   s4   dd„ |j D ƒ}tddƒD ]}||vr|  S qd S )Nc                 S   s   g | ]
}|j ‘qS r2   )ÚnameID)r;   r5   r2   r2   r3   rJ   {  rK   z,Builder.get_user_name_id.<locals>.<listcomp>é   iÿ  )ÚnamesÚrange)r}   r—   ZnameIDsZuser_name_idr2   r2   r3   Úget_user_name_idy  s    zBuilder.get_user_name_idc                 C   s   d }|dkrJt  ¡ }| j\|_|_|_|_|| jv rB| j| |_nd|_nÒ|| j	v r†| js\n(|| jv sjJ ‚t  
¡ }d|_| j| |_n–|| jv �rt  ¡ }d|_| j |dfd¡|_| j |dfd¡|_| j |dfd¡|_| j |d¡|_| j |dfd¡|_t| j| ƒ|_| j| |_|S )NÚsizer   ÚFeatUILabelNameIDÚFeatUITooltipTextNameIDÚSampleTextNameIDZParamUILabelNameID_0)r   ZFeatureParamsSizerl   Ú
DesignSizeÚSubfamilyIDÚ
RangeStartÚRangeEndrf   ZSubfamilyNameIDre   ZFeatureParamsStylisticSetÚVersionZUINameIDrg   ZFeatureParamsCharacterVariantsÚFormatrh   rž   rÙ   rÚ   rÛ   ri   ZNumNamedParametersZFirstParamUILabelNameIDrº   rk   Z	CharCountZ	Character)r}   r<   Úparamsr2   r2   r3   ÚbuildFeatureParams€  sL    û

ÿÿÿÿzBuilder.buildFeatureParamsc           	      C   sö   | j s
d S | j d¡}|s2tdƒ }| jd< g |_| j D ]¸}|\}}}}}t|tƒsÞ|}|| jv rš|| jvrŽ|  	|¡| j|< | j| d usŽJ ‚| j| }nD|d | j
v rÞ|| jvrÔ|  	|¡| j|< | j| d usÔJ ‚| j| }| |||||¡ q8d S )Nr5   r   )rn   r0   rž   r   rÕ   rL   Úintre   rf   r×   rg   rh   ÚsetName)	r}   r—   r5   rÓ   Ú
platformIDÚ	platEncIDÚlangIDÚstringr<   r2   r2   r3   rŒ   «  s*    





zBuilder.build_namec                 C   sŠ  | j s
d S | j d¡}|sNtdƒ }| jd< dt tdƒj¡ }| || j¡ d}d| j v rh| j d |_	d| j v r¶tdƒ 
¡ }| j d \
|_|_|_|_|_|_|_|_|_|_||_d| j v rÌ| j d |_d| j v râ| j d |_d| j v rø| j d |_d	| j v �r| j d	 |_d
| j v �r(| j d
 |_d| j v �rLtd| j d  d ƒ|_d| j v �rd| j d |_d| j v �r|| j d |_d| j v �r˜| | j d ¡ d| j v �rÄ|   | j d ¡}|\|_!|_"d}d| j v �rà| j d |_#d}d| j v �rü| j d |_$d}d| j v �r| j d |_%d}d| j v �r4| j d |_&d}dd„ }t'||j(ƒ|_(|dk�r^||dƒ |dk�rr||dƒ |dk�r†||dƒ d S )NrB   ó    r   ZfstypeÚpanoseZtypoascenderZtypodescenderZtypolinegapZ	winascentZ
windescentÚvendorz'''ZweightclassZ
widthclassZunicoderangeZcodepageranger¹   Zxheighté   Z	capheightZloweropsizeé   Zupperopsizec                 S   s$   |D ]}t | |ƒst| |dƒ qd S ©Nr   )ÚhasattrÚsetattr)r—   ÚattrsÚattrr2   r2   r3   Ú	checkattr  s    
z%Builder.build_OS_2.<locals>.checkattr)ÚulCodePageRange1ÚulCodePageRange2)ÚsxHeightÚ
sCapHeightZusDefaultCharZusBreakCharr™   )ÚusLowerOpticalPointSizeÚusUpperOpticalPointSize))rx   r0   rž   r   r   Úcalcsizer   ZOS2_format_0rÉ   ZfsTypeZPanoseZbFamilyTypeZbSerifStyleZbWeightZbProportionZ	bContrastZbStrokeVariationZ	bArmStyleZbLetterFormZbMidlineZbXHeightrë   ZsTypoAscenderZsTypoDescenderZsTypoLineGapZusWinAscentZusWinDescentr   Z	achVendIDZusWeightClassZusWidthClassZsetUnicodeRangesÚbuild_codepages_rõ   rö   r÷   rø   rù   rú   ÚmaxÚversion)r}   r—   Údatarþ   rë   Úpagesrô   r2   r2   r3   r�   Ä  sŒ    

õ





þ

zBuilder.build_OS_2c                 C   s\   dD ]}|| j v rt|› d�|ƒ‚qt|tƒr:|| j d< nt|tƒrP|| j d< nt|ƒ‚d S )N)ÚElidedFallbackNameÚElidedFallbackNameIDz is already set.r  r  )r{   r   rL   rä   rj   ÚAssertionError)r}   Úvaluer¦   Útokenr2   r2   r3   ÚsetElidedFallbackName  s    
þ

zBuilder.setElidedFallbackNamec                 C   s„   d| j vrg | j d< |jdd„ | j d D ƒv rBtd|j› d�|ƒ‚|jdd„ | j d D ƒv rptd|j› d�|ƒ‚| j d  |¡ d S )	NÚ
DesignAxesc                 s   s   | ]}|j V  qd S r9   )r<   ©r;   Úrr2   r2   r3   r=   +  rK   z(Builder.addDesignAxis.<locals>.<genexpr>z$DesignAxis already defined for tag "z".c                 s   s   | ]}|j V  qd S r9   )Ú	axisOrderr  r2   r2   r3   r=   0  rK   z+DesignAxis already defined for axis number r   )r{   r<   r   r
  r¥   )r}   Z
designAxisr¦   r2   r2   r3   ÚaddDesignAxis(  s    

þþzBuilder.addDesignAxisc                 C   sŽ   d| j vrg | j d< | j d D ]Z}dd„ |jD ƒdd„ |jD ƒkrdd„ |jD ƒdd„ |jD ƒkr|j|jkrtd|ƒ‚q| j d  |¡ d S )NÚAxisValueRecordsc                 S   s   h | ]}|  ¡ ’qS r2   ©ZasFea©r;   Únr2   r2   r3   Ú	<setcomp>=  rK   z-Builder.addAxisValueRecord.<locals>.<setcomp>c                 S   s   h | ]}|  ¡ ’qS r2   r  r  r2   r2   r3   r  >  rK   c                 S   s   h | ]}|  ¡ ’qS r2   r  r  r2   r2   r3   r  ?  rK   c                 S   s   h | ]}|  ¡ ’qS r2   r  r  r2   r2   r3   r  @  rK   z8An AxisValueRecord with these values is already defined.)r{   rÕ   Ú	locationsÚflagsr   r¥   )r}   ZaxisValueRecordr¦   Zrecord_r2   r2   r3   ÚaddAxisValueRecord7  s$    

ÿÿÿý
ûþzBuilder.addAxisValueRecordc                    sî  | j s
d S | j  d¡}|s$tdd ƒ‚| j  d¡}i ‰ g }|D ]}g ˆ |j< q<|d u�rJ|D ]î}i }|jdkrv|j|d< t|jƒdk�r |jd }|j}t|ƒdkr¸| |d |j	dœ¡ t|ƒdkrà| |d |d |j	d	œ¡ t|ƒd
k�r|\}	}
}| |	|
||j	dœ¡ ˆ |j  
|¡ qZ| dd„ |jD ƒ|j	dœ¡ | 
|¡ qZ‡ fdd„|D ƒ}| j d¡}|�s†tdƒ }| jd< g |_	d| j v �rÀ| j d }| |¡}|�sÖtd|› d�d ƒ‚nd| j v �rÖ| j d }tj| j|||d� d S )Nr  zDesignAxes not definedr  r   r  r¹   )r  r5   rí   )r  ZlinkedValuer5   é   )ZnominalValueZrangeMinValueZrangeMaxValuer5   c                 S   s   i | ]}|j |jd  “qS )r   )r<   Úvalues©r;   Úir2   r2   r3   r´   u  rK   z&Builder.build_STAT.<locals>.<dictcomp>)r¦   r5   c                    s&   g | ]}|j |j|jˆ |j d œ‘qS ))Zorderingr<   r5   r  )r
  r<   rÕ   )r;   r³   ©Z
axisValuesr2   r3   rJ   {  s   ûüz&Builder.build_STAT.<locals>.<listcomp>r5   r  zElidedFallbackNameID z; points to a nameID that does not exist in the "name" tabler  )r  ZelidedFallbackName)r{   rž   r   r<   r  rº   r  r  rÀ   rÕ   r¥   r0   r   ZgetDebugNameÚotlZbuildStatTable)r}   rQ   ZaxisValueRecordsZformat4_locationsr<   ZavrZ
valuesDictr¦   r  ZnominalZminValZmaxValZ
designAxesZ	nameTablerÓ   r5   r2   r  r3   rŽ   I  s„    




ýÿ
üÿþÿ
ù



ü
üzBuilder.build_STATc                     sÆ   ddddddddd	d
dddddddddddddddddddddd œ‰ ‡ fd!d"„|D ƒ}g }t dƒD ]T}| d#¡ t |d$ |d d$ ƒD ].}||v r¤||  d%7  < q†||  d&7  < q†qbd'd"„ |D ƒS )(Nr   r¹   rí   r  é   rî   é   é   é   é   é   é   é   é   é   é0   é1   é2   é3   é4   é5   é6   é7   é8   é9   é:   é;   é<   é=   é>   é?   )iä  iâ  iã  iå  iæ  iç  iè  ié  iê  ij  i¤  i¨  iµ  i¶  iQ  ie  ib  ia  i`  i_  i^  i]  i\  iY  iW  iT  i  iá  iÄ  iR  iµ  c                    s   g | ]}|ˆ v rˆ | ‘qS r2   r2   ©r;   Úp©Z
pages2bitsr2   r3   rJ   À  rK   z,Builder.build_codepages_.<locals>.<listcomp>Ú é    Ú1Ú0c                 S   s   g | ]}t |d d d… ƒ‘qS )Néÿÿÿÿ)r   r4  r2   r2   r3   rJ   É  rK   )rÖ   r¥   )r}   r   Úbitsr  Újr2   r6  r3   rü   ž  sR    á!
zBuilder.build_codepages_c                 C   sL   | j s| jsd S t ¡ }d|_|  | j ¡|_|  | j¡|_tdƒ}||_	|S )NrÏ   r>   )
ro   rp   r   r>   rà   ÚbuildBASEAxisZ	HorizAxisZVertAxisr   r—   )r}   r¢   r¨   r2   r2   r3   r›   Ë  s    zBuilder.buildBASEc                 C   s  |sd S |\}}t  ¡ }t  ¡ |_||j_t|ƒ|j_t  ¡ |_g |j_t|ƒ|j_t	|ƒD ]¤}t  ¡ }|d |_
t  ¡ |_d|j_t  ¡ |j_| |d ¡|jj_g |jj_t|d ƒ|jj_|d D ](}t  ¡ }d|_||_|jjj |¡ qÈ|jj |¡ q\|S )Nr   r¹   rí   )r   ZAxisZBaseTagListZBaselineTagrº   ZBaseTagCountZBaseScriptListZBaseScriptRecordZBaseScriptCountr†   ZBaseScriptTagZ
BaseScriptZBaseLangSysCountZ
BaseValuesÚindexZDefaultIndexZ	BaseCoordZBaseCoordCountrá   Z
Coordinater¥   )r}   ÚaxisÚbasesÚscriptsr¬   ÚrecordÚcZcoordr2   r2   r3   r>  ×  s4    




zBuilder.buildBASEAxisc                 C   sî   t  ¡ }|  ¡ |_t | j| j¡|_t 	| j
| j| j¡|_|  ¡ |_|  ¡ |_|jrXdnd|_| jr®| j ¡ }|jr®d|_||_| ¡ }| |¡ d| jv r®| jd j |¡ t|j|j|j|j|jfƒsÔt|dƒrætdƒ}||_|S d S d S )Ni  rÏ   i  r@   ÚVarStorer?   )r   r?   ÚbuildGDEFGlyphClassDef_ÚGlyphClassDefr  ZbuildAttachListrq   rO   Z
AttachListZbuildLigCaretListrr   rs   ZLigCaretListÚbuildGDEFMarkAttachClassDef_ÚMarkAttachClassDefÚbuildGDEFMarkGlyphSetsDef_ZMarkGlyphSetsDefrà   rP   ÚfinishZVarDatarE  ÚoptimizeZremap_device_varidxesr0   r—   r˜   rð   r   )r}   r¡   ÚstoreZ
varidx_mapr¨   r2   r2   r3   rš   ó  s@    
ÿ




ûÿø	zBuilder.buildGDEFc                 C   sŒ   | j rdd„ | j  ¡ D ƒ}nRi }| jD ]}| | ¡ ¡ q&| jj ¡ D ]&}|jD ]}| 	¡ D ]}d||< q\qPqF|r„t
 ¡ }||_|S d S d S )Nc                 S   s   i | ]\}\}}||“qS r2   r2   ©r;   r²   rD  Ú_r2   r2   r3   r´     rK   z3Builder.buildGDEFGlyphClassDef_.<locals>.<dictcomp>r  )rt   r¿   r]   rÀ   ZinferGlyphClassesrM   ZmarkClassesr  ÚdefinitionsÚglyphSetr   rG  Ú	classDefs)r}   Úclassesr«   Ú	markClassÚmarkClassDefr¼   r¨   r2   r2   r3   rF    s    

zBuilder.buildGDEFGlyphClassDef_c                 C   s.   dd„ | j  ¡ D ƒ}|sd S t ¡ }||_|S )Nc                 S   s   i | ]\}\}}||“qS r2   r2   rN  r2   r2   r3   r´   )  rK   z8Builder.buildGDEFMarkAttachClassDef_.<locals>.<dictcomp>)ru   r¿   r   rI  rR  )r}   rR  r¨   r2   r2   r3   rH  (  s    z$Builder.buildGDEFMarkAttachClassDef_c                 C   s<   g }t | j ¡ dd„ d�D ]\}}| |¡ qt || j¡S )Nc                 S   s   | d S )Nr¹   r2   )Úitemr2   r2   r3   Ú<lambda>3  rK   z4Builder.buildGDEFMarkGlyphSetsDef_.<locals>.<lambda>r¾   )r†   rw   r¿   r¥   r  ZbuildMarkGlyphSetsDefrO   )r}   ZsetsÚglyphsÚid_r2   r2   r3   rJ  0  s    ÿz"Builder.buildGDEFMarkGlyphSetsDef_c                 C   s:   d| j vr$tdƒ| j d< i | j d _| j| j d jt< d S )NZDebg)r0   r   rÿ   r^   r	   r�   r2   r2   r3   rŸ   8  s    
zBuilder.buildDebgc              
   C   sÊ   |dv sJ |ƒ‚| j D ]
}d |_qg }| j D ]N}|j|kr<q,t|ƒ|_tt|jƒ|  |¡d d�| j| t|jƒ< | 	|¡ q,zdd„ |D ƒ}W n6 t
yÄ } ztt|ƒ|jƒ|‚W Y d }~n
d }~0 0 |S )Nr€   )r¦   r5   r·   c                 S   s   g | ]}|  ¡ ‘qS r2   )r/   ©r;   Úlr2   r2   r3   rJ   N  rK   z)Builder.buildLookups_.<locals>.<listcomp>)r]   Úlookup_indexr—   rº   r   Ústrr¦   Úget_lookup_name_r^   r¥   r#   r   )r}   r<   r«   r¸   Z	otLookupsÚer2   r2   r3   ÚbuildLookups_>  s&    



ý(zBuilder.buildLookups_c              
      s  t t|d ƒƒ }d|_t ¡ |_g |j_t ¡ |_g |j_t ¡ |_|  |¡|j_	i }i }i }dd„ }t
| j ¡ |d�D �]b\}}|\}	}
}tdd„ |D ƒƒ}|dkoª|dk}|  ||¡}t|ƒd	krÎ|sÎ|sÎqv|D ]P}z,| j| t|ƒ j|d
�| j| t|ƒ< W qÒ t�y    t d¡ Y qÒ0 qÒ||f}| |¡}|d u �r t|jjƒ}t ¡ }||_t ¡ |_|  |¡|j_t|ƒ|j_t|ƒ|j_|jj |¡ |||< | |	i ¡ |
g ¡ |¡ | j  |	|
f¡|krv|||	|
f< qvt
| ¡ ƒD ]ü\}	}t ¡ }|	|_!t "¡ |_"d |j"_#g |j"_$t
| ¡ ƒD ]ž\}
}t $¡ }t %¡ |_%d |j%_&| |	|
f¡‰ ˆ d u �rhd|j%_'nˆ |j%_'‡ fdd„|D ƒ|j%_(t|j%j(ƒ|j%_)|
dk�r¬|j%|j"_#n|
|_*|j"j$ |¡ �q$t|j"j$ƒ|j"_+|jj |¡ �qèt|jjƒ|j_,t|jjƒ|j_)t|jj	ƒ|j_|S )NrÏ   c                 S   s(   | d d | d d | d d | d fS )Nr   rí   r¹   r2   )Úfr2   r2   r3   rW  d  rK   z#Builder.makeTable.<locals>.<lambda>r¾   c                 S   s   g | ]}|j d ur|j ‘qS r9   )r\  rZ  r2   r2   r3   rJ   k  rK   z%Builder.makeTable.<locals>.<listcomp>r@   rØ   r   )r·   zWfeaLib.Builder subclass needs upgrading to stash debug information. See fonttools#2065.iÿÿ  c                    s   g | ]}|ˆ kr|‘qS r2   r2   r  ©Zreq_feature_indexr2   r3   rJ      s   Údflt)-Úgetattrr   rà   r‘   ZScriptRecordr“   ZFeatureRecordr•   r`  ZLookupr†   r_   r¿   ÚtupleÚany_feature_variationsrº   r^   r]  Ú_replaceÚKeyErrorÚwarningsÚwarnrž   Z
FeatureTagZFeaturerã   ZFeatureParamsrj   ZLookupListIndexr–   r¥   rª   r`   Z	ScriptTagZScriptZDefaultLangSysZLangSysRecordZLangSysZLookupOrderZReqFeatureIndexZFeatureIndexr”   Z
LangSysTagZLangSysCountr’   )r}   r<   r—   Zfeature_indicesZrequired_feature_indicesrB  ZsortFeatureTagr®   r¸   r¬   r­   Úfeature_tagZlookup_indicesZsize_featureZforce_featureÚixZfeature_keyZfeature_indexZfrecZlang_featuresZsrecZlangrecr2   rb  r3   r�   S  s–    



ÿÿþÿ







ÿ

zBuilder.makeTablec                 C   sº   i }d}| j  ¡ D ]|\\}}}}g ||< | ¡ D ]\\}	}
| j|	 }g }|
D ].}|j|krZqJ|jd ushJ ‚| |j¡ d}qJ||  ||f¡ q0q|r¶| ¡ D ]\}}t| j|||ƒ qœd S )NFT)ra   r¿   r|   r—   r\  r¥   r&   r0   )r}   r—   Ú	table_tagZfeature_varsZhas_any_variationsrT   Úlanguagerk  Ú
variationsÚconditionsetÚbuildersZraw_conditionsetÚindicesÚbZconditions_and_lookupsr2   r2   r3   r�   ²  s0    ü


ÿzBuilder.makeFeatureVariationsc                    sX   | j  ¡ D ]H\\}}}}||kr"q
| ¡ D ]&\}}t‡ fdd„|D ƒƒr*  dS q*q
dS )Nc                 3   s   | ]}|j ˆ kV  qd S r9   )r—   )r;   rs  ©rm  r2   r3   r=   Ò  rK   z1Builder.any_feature_variations.<locals>.<genexpr>TF)ra   r¿   r˜   )r}   rk  rm  rO  r·   ro  rp  rq  r2   rt  r3   rf  Í  s    zBuilder.any_feature_variationsc                 C   s(   dd„ | j  ¡ D ƒ}||v r$|| S d S )Nc                 S   s   i | ]\}}||“qS r2   r2   )r;   ÚkÚvr2   r2   r3   r´   ×  rK   z,Builder.get_lookup_name_.<locals>.<dictcomp>)rY   r¿   )r}   r«   Úrevr2   r2   r3   r^  Ö  s    zBuilder.get_lookup_name_c                 C   s|   |dkr |dkr | j r td|ƒ‚|dkr:| jr@td|ƒ‚nd| _||f| j v rhtd| ¡ | ¡ f |ƒ‚| j  ||f¡ d S )NÚDFLTrc  z_If "languagesystem DFLT dflt" is present, it must be the first of the languagesystem statementszRlanguagesystems using the "DFLT" script tag must precede all other languagesystemsTz1"languagesystem %s %s" has already been specified)rS   r   rX   ÚstripÚadd)r}   r¦   r¬   rn  r2   r2   r3   Úadd_language_systemÜ  s(    ýýÿýzBuilder.add_language_systemc                 C   s   | j rt| j ƒS tdhƒS d S )N)rx  rc  )rS   r„   r�   r2   r2   r3   Úget_default_language_systems_õ  s    
z%Builder.get_default_language_systems_c                 C   s:   |   ¡ | _d| _d | _|| _d| _d | _|dkr6|| _d S )Nrx  r   rµ   )r|  rW   rT   rZ   r\   rU   rV   rc   ©r}   r¦   r5   r2   r2   r3   rÁ      s    
zBuilder.start_featurec                 C   s0   | j d usJ ‚d | _ d | _d | _d| _d | _d S rï   )r\   rW   rZ   rU   rV   r�   r2   r2   r3   rÄ   
  s    zBuilder.end_featurec                 C   s\   || j v rtd| |ƒ‚| jdkr,td|ƒ‚|| _d | j |< d | _| jd u rXd| _d | _d S )Nz$Lookup "%s" has already been definedrµ   zpLookup blocks cannot be placed inside 'aalt' features; move it out, and then refer to it with a lookup statementr   )rY   r   r\   r[   rZ   rU   rV   r}  r2   r2   r3   Ústart_lookup_block  s    
ÿ
ý

zBuilder.start_lookup_blockc                 C   s4   | j d usJ ‚d | _ d | _| jd u r0d| _d | _d S rï   )r[   rZ   r\   rU   rV   r�   r2   r2   r3   Úend_lookup_block$  s    
zBuilder.end_lookup_blockc                 C   s<   || j v sJ |ƒ‚d | _| j | }|d ur8|  || j¡ d S r9   )rY   rZ   r¯   r\   )r}   Úlookup_namer«   r2   r2   r3   Úadd_lookup_call,  s
    
zBuilder.add_lookup_callc                 C   s
   || _ d S r9   )rm   )r}   r¦   Úrevisionr2   r2   r3   Úset_font_revision3  s    zBuilder.set_font_revisionc                 C   sü   t |ƒdksJ ‚| jdv r*td| j |ƒ‚| jd u r>td|ƒ‚d | _| j|| jf}| j |d d|d f¡}|dksx|r�|r�|d d … | j|< n
g | j|< t| j|fgƒ| _|rø| j|f}|| j	v rìtd| 
¡ | j 
¡ | j	|  
¡ f |ƒ‚| j| j	|< d S )	Nr  ©rµ   rØ   z7Language statements are not allowed within "feature %s"zCLanguage statements are not allowed within standalone lookup blocksr   rc  rí   zPLanguage %s (script %s) has already specified feature %s as its required feature)rº   r\   r   rZ   rT   r_   rž   r„   rW   r`   ry  )r}   r¦   rn  Úinclude_defaultÚrequiredr®   r¸   r2   r2   r3   Úset_language6  sB    
ÿý
ý


ýþø
zBuilder.set_languagec                 C   s~   t |ƒ}| j |¡}|d ur |S t| jƒd }|| j|< |D ]<}|| jv rj| j| \}}td||f |ƒ‚||f| j|< q<|S )Nr¹   z=Glyph %s already has been assigned a MarkAttachmentType at %s)r„   rv   rž   rº   ru   r   )r}   r¦   rX  rY  r¼   rO  Úlocr2   r2   r3   ÚgetMarkAttachClass_]  s"    

ÿýzBuilder.getMarkAttachClass_c                 C   s8   t |ƒ}| j |¡}|d ur |S t| jƒ}|| j|< |S r9   )r„   rw   rž   rº   )r}   r¦   rX  rY  r2   r2   r3   ÚgetMarkFilterSet_o  s    

zBuilder.getMarkFilterSet_c                 C   sT   |d@ }|r$|   ||¡}||d> B }|rD|  ||¡}|dB }|| _nd | _|| _d S )Néÿ   r  r  )r‰  rŠ  rV   rU   )r}   r¦   r  Z
markAttachZ
markFilterZmarkAttachClassr¤   r2   r2   r3   Úset_lookup_flagx  s    zBuilder.set_lookup_flagc                 C   sp   | j dv rtd| j  |ƒ‚| j d u r.td|ƒ‚| j|dfhkrBd S d | _|| _d| _d | _| j|dddd� d S )	Nr„  z5Script statements are not allowed within "feature %s"zAScript statements are not allowed within standalone lookup blocksrc  r   TF)r…  r†  )r\   r   rW   rZ   rT   rU   rV   r‡  )r}   r¦   r¬   r2   r2   r3   Ú
set_script…  s&    
ÿý
þzBuilder.set_scriptc                    s>   g }|D ]0}|dur.|  ‡ fdd„|D ƒ¡ q|  d¡ q|S )zÓHelper for building chain contextual substitutions

        Given a list of lookup names, finds the LookupBuilder for each name.
        If an input name is None, it gets mapped to a None LookupBuilder.
        Nc                    s   g | ]}ˆ j  |j¡‘qS r2   )rY   rž   r5   rZ  r�   r2   r3   rJ   ¤  rK   z1Builder.find_lookup_builders_.<locals>.<listcomp>)r¥   )r}   r¸   Zlookup_buildersrÆ   r2   r�   r3   Úfind_lookup_builders_š  s    ÿzBuilder.find_lookup_builders_c                 C   s$   |D ]}| j  |tƒ ¡ |¡ qd S r9   )rq   rª   rR   rÀ   )r}   r¦   rX  ZcontourPointsr¼   r2   r2   r3   Úadd_attach_pointsª  s    zBuilder.add_attach_pointsc                 C   s(   | j dkrtd|ƒ‚| j ||f¡ d S )Nrµ   z9Feature references are only allowed inside "feature aalt")r\   r   rb   r¥   )r}   r¦   ZfeatureNamer2   r2   r3   Úadd_feature_reference®  s
    
ÿzBuilder.add_feature_referencec                 C   s   | j  |¡ d S r9   )re   rz  ©r}   r<   r2   r2   r3   Úadd_featureNameµ  s    zBuilder.add_featureNamec                 C   s   | j  |¡ d S r9   )rg   rz  r‘  r2   r2   r3   Úadd_cv_parameter¸  s    zBuilder.add_cv_parameterc                 C   s,   || j v r| j |  d7  < n
d| j |< dS )zbAdds new items to ``self.cv_num_named_params_``
        or increments the count of existing items.r¹   N)ri   r‘  r2   r2   r3   Úadd_to_cv_num_named_params»  s    
z"Builder.add_to_cv_num_named_paramsc                 C   s   | j |  |¡ d S r9   )rk   r¥   )r}   Ú	characterr<   r2   r2   r3   Úadd_cv_characterÃ  s    zBuilder.add_cv_characterc                 C   s   |r||f| _ n
||f| _d S r9   )rp   ro   )r}   rA  rB  Úverticalr2   r2   r3   Úset_base_axisÆ  s    zBuilder.set_base_axisc           	      C   sV   | j dkrtd| j  |ƒ‚||||g| _| jD ]"\}}||| j f}| j |g ¡ q.d S )NrØ   z9Parameters statements are not allowed within "feature %s")r\   r   rl   rW   r_   rª   )	r}   r¦   rÜ   rÝ   rÞ   rß   r¬   r­   r®   r2   r2   r3   Úset_size_parametersÌ  s    
ÿýzBuilder.set_size_parametersc           
      C   sÈ   | j dkr:| ¡ D ]"\}}| j |tƒ ¡}| |¡ qd S |sF|sF|rZ|  ||||¡ d S |  |t¡}	| ¡ D ]T\}}||	j	v r¸||	j	| kr t
 d|||¡ ntd||	j	| f |ƒ‚||	j	|< qnd S )Nrµ   zDRemoving duplicate single substitution from glyph "%s" to "%s" at %sz5Already defined rule for replacing glyph "%s" by "%s")r\   r¿   rd   rª   rR   rz  Úadd_single_subst_chained_r±   r   rÂ   ÚlogÚinfor   )
r}   r¦   ÚprefixÚsuffixrÂ   Ú
forceChainZ
from_glyphZto_glyphrÇ   r«   r2   r2   r3   Úadd_single_substÝ  s2    

ûÿýzBuilder.add_single_substc           
      C   s®   |s|s|rN|   |t¡}|  |t¡}||j|< |j t||hg||gƒ¡ d S |   |t¡}	||	jv r ||	j| kr’t 	d|||rŠd|› �nd¡ nt
d| |ƒ‚||	j|< d S )Nz@Removing duplicate multiple substitution from glyph "%s" to %s%sz at r7  z+Already defined substitution for glyph "%s")r±   r   r©   r   rÂ   Úrulesr¥   r"   r›  rœ  r   )
r}   r¦   r�  r¼   rž  ÚreplacementsrŸ  ÚchainÚsubr«   r2   r2   r3   Úadd_multiple_substú  s&    

ûÿzBuilder.add_multiple_substc           	      C   s˜   | j dkr(| j |tƒ ¡}| |¡ d S |s0|rf|  |t¡}|  |t¡}|j	 
t||hg||gƒ¡ n|  |t¡}||jv rŠtd| |ƒ‚||j|< d S )Nrµ   z)Already defined alternates for glyph "%s")r\   rd   rª   rR   rÀ   r±   r   r©   r   r¡  r¥   r"   rÃ   r   )	r}   r¦   r�  r¼   rž  ÚreplacementrÇ   r£  r«   r2   r2   r3   Úadd_alternate_subst  s    


ÿzBuilder.add_alternate_substc           
      C   s~   |s|s|r>|   |t¡}|  |t¡}|j t||||gƒ¡ n|   |t¡}t|ƒs\td|ƒ‚t	t
j|Ž ƒD ]}	||j|	< qjd S ©Nz!Empty glyph class in substitution)r±   r   r©   r   r¡  r¥   r"   Úallr   r†   Ú	itertoolsÚproductÚ	ligatures)
r}   r¦   r�  rX  rž  r¦  rŸ  r£  r«   r²   r2   r2   r3   Úadd_ligature_subst'  s    
zBuilder.add_ligature_substc              	   C   sN   t |ƒrt |ƒrt |ƒs"td|ƒ‚|  |t¡}|j t||||  |¡ƒ¡ d S ©Nz,Empty glyph class in contextual substitution)r©  r   r±   r   r¡  r¥   r"   rŽ  ©r}   r¦   r�  rX  rž  r¸   r«   r2   r2   r3   Úadd_chain_context_subst=  s    
ÿÿzBuilder.add_chain_context_substc                 C   s‚   |rt |ƒrt |ƒstd|ƒ‚|  |t¡}| t| ¡ ƒ¡}|d u rP|  |t¡}|j	 
|¡ |j t|t| ¡ ƒg||gƒ¡ d S r®  )r©  r   r±   r   Zfind_chainable_single_substrR   Úkeysr©   r   rÂ   rÀ   r¡  r¥   r"   rj   )r}   r¦   r�  rž  rÂ   r£  r¤  r2   r2   r3   rš  G  s    
ÿz!Builder.add_single_subst_chained_c                 C   s0   |st d|ƒ‚|  |t¡}|j |||f¡ d S r¨  )r   r±   r   r¡  r¥   )r}   r¦   Z
old_prefixÚ
old_suffixrÂ   r«   r2   r2   r3   Úadd_reverse_chain_single_substU  s    
z&Builder.add_reverse_chain_single_substc                 C   s®   |s|s|r|   ||||¡ nŒ|  |t¡}|D ]z\}}|sDtd|ƒ‚| j||dd�}	|D ]N}
z| ||
|	¡ W qX ty¤ } ztt|ƒ|jƒ|‚W Y d }~qXd }~0 0 qXq.d S )Nú%Empty glyph class in positioning ruleF©ÚpairPosContext)	Úadd_single_pos_chained_r±   r!   r   ÚmakeOpenTypeValueRecordÚadd_posr#   r]  r¦   )r}   r¦   r�  rž  ÚposrŸ  r«   rX  r  ZotValueRecordr¼   r_  r2   r2   r3   Úadd_single_pos^  s    
zBuilder.add_single_posc           	      C   sT   |r|st d|ƒ‚|  |t¡}| j||dd�}| j||dd�}| |||||¡ d S ©Nr´  Trµ  )r   r±   r    r¸  ZaddClassPair)	r}   r¦   Zglyphclass1Úvalue1Zglyphclass2Úvalue2r«   Úv1Úv2r2   r2   r3   Úadd_class_pair_posn  s    ÿzBuilder.add_class_pair_posc           	      C   sT   |r|st d|ƒ‚|  |t¡}| j||dd�}| j||dd�}| |||||¡ d S r¼  )r   r±   r    r¸  ZaddGlyphPair)	r}   r¦   Zglyph1r½  Zglyph2r¾  r«   r¿  rÀ  r2   r2   r3   Úadd_specific_pair_posx  s    
zBuilder.add_specific_pair_posc              	   C   s>   |st d|ƒ‚|  |t¡}| |||  ||¡|  ||¡¡ d S ©Nr´  )r   r±   r   Úadd_attachmentÚmakeOpenTypeAnchor)r}   r¦   Z
glyphclassZentryAnchorZ
exitAnchorr«   r2   r2   r3   Úadd_cursive_pos�  s    


üzBuilder.add_cursive_posc           	      C   sd   |   |t¡}|  |||¡ |s(td|ƒ‚|D ]2\}}|  ||¡}|D ]}||j |i ¡|j< qDq,d S rÃ  )r±   r   Ú
add_marks_r   rÅ  rA  rª   r5   )	r}   r¦   rA  Úmarksr   Ú
baseAnchorrT  ÚotBaseAnchorr¢   r2   r2   r3   Úadd_mark_base_pos�  s    
zBuilder.add_mark_base_posc                 C   s|   |   |t¡}g }|std|ƒ‚|D ]@}i }|  |||¡ |D ]\}}	|  ||¡||	j< q<| |¡ q"|D ]}
||j|
< qhd S rÃ  )r±   r   r   rÇ  rÅ  r5   r¥   r¬  )r}   r¦   r¬  Ú
componentsr   ZcomponentAnchorsrÈ  ÚanchorsZ	ligAnchorrT  r¼   r2   r2   r3   Úadd_mark_lig_pos˜  s    
zBuilder.add_mark_lig_posc           	      C   sd   |   |t¡}|  |||¡ |s(td|ƒ‚|D ]2\}}|  ||¡}|D ]}||j |i ¡|j< qDq,d S rÃ  )r±   r   rÇ  r   rÅ  Ú	baseMarksrª   r5   )	r}   r¦   rÏ  rÈ  r   rÉ  rT  rÊ  ZbaseMarkr2   r2   r3   Úadd_mark_mark_pos§  s    
þÿzBuilder.add_mark_mark_posc              	   C   sN   t |ƒrt |ƒrt |ƒs"td|ƒ‚|  |t¡}|j t||||  |¡ƒ¡ d S )Nú0Empty glyph class in contextual positioning rule)r©  r   r±   r   r¡  r¥   r"   rŽ  r¯  r2   r2   r3   Úadd_chain_context_pos´  s    
ÿÿzBuilder.add_chain_context_posc                 C   s  |rt |ƒrt |ƒstd|ƒ‚|  |t¡}g }|jD ]\}}}}| |¡ q4g }	|D ]z\}
}|d u rp|	 d ¡ qT| j||dd�}| ||
|¡}|d u r¬|  	|t
¡}| |¡ |
D ]}| |||¡ q°|	 |¡ qTt|ƒt|	ƒksìJ ||	fƒ‚|j t|dd„ |D ƒ||	ƒ¡ d S )NrÑ  Frµ  c                 S   s   g | ]\}}|‘qS r2   r2   )r;   r²   rv  r2   r2   r3   rJ   Õ  rK   z3Builder.add_single_pos_chained_.<locals>.<listcomp>)r©  r   r±   r   r¡  rÅ   r¥   r¸  Zfind_chainable_single_posr©   r!   r¹  rº   r"   )r}   r¦   r�  rž  rº  r£  ÚtargetsrO  r¸   ÚsubsrX  r  ZotValuer¤  r¼   r2   r2   r3   r·  ¾  s.    


ÿzBuilder.add_single_pos_chained_c           
      C   s†   |D ]|\}}|j D ]l}|j ¡ D ]\}||jvrN|  ||j¡}|j|f|j|< q |j| d }	|j|	kr td||	|jf |ƒ‚q qqdS )z)Helper for add_mark_{base,liga,mark}_pos.r   z&Glyph %s cannot be in both @%s and @%sN)rP  rX  rQ  rÈ  rÅ  Úanchorr5   r   )
r}   r¦   ZlookupBuilderrÈ  rO  rT  rU  ÚmarkZotMarkAnchorZexistingMarkClassr2   r2   r3   rÇ  Ø  s    



ÿýzBuilder.add_marks_c                 C   s   | j  |¡ d S r9   )rZ   Úadd_subtable_break)r}   r¦   r2   r2   r3   r×  é  s    zBuilder.add_subtable_breakc                 C   sB   | j  |d¡\}}|r0||kr0td||f |ƒ‚||f| j |< d S )N©NNz0Glyph %s was assigned to a different class at %s)rt   rž   r   )r}   r¦   r¼   Z
glyphClassZoldClassZoldLocationr2   r2   r3   ÚsetGlyphClass_ì  s    ÿýzBuilder.setGlyphClass_c                 C   sd   |D ]}|   ||d¡ q|D ]}|   ||d¡ q|D ]}|   ||d¡ q4|D ]}|   ||d¡ qLd S )Nr¹   rí   r  r  )rÙ  )r}   r¦   Z
baseGlyphsZligatureGlyphsZ
markGlyphsZcomponentGlyphsr¼   r2   r2   r3   Úadd_glyphClassDefö  s    zBuilder.add_glyphClassDefc                 C   s"   |D ]}|| j vr|| j |< qd S r9   )rs   ©r}   r¦   rX  Zcaretsr¼   r2   r2   r3   Úadd_ligatureCaretByIndex_  s    
z!Builder.add_ligatureCaretByIndex_c                 C   s"   |D ]}|| j vr|| j |< qd S r9   )rr   rÛ  r2   r2   r3   Úadd_ligatureCaretByPos_  s    
zBuilder.add_ligatureCaretByPos_c                 C   s   | j  |||||g¡ d S r9   )rn   r¥   )r}   r¦   rÓ   ræ   rç   rè   ré   r2   r2   r3   Úadd_name_record  s    zBuilder.add_name_recordc                 C   s   || j |< d S r9   )rx   ©r}   r®   r  r2   r2   r3   Úadd_os2_field  s    zBuilder.add_os2_fieldc                 C   s   || j |< d S r9   )ry   rß  r2   r2   r3   Úadd_hhea_field  s    zBuilder.add_hhea_fieldc                 C   s   || j |< d S r9   )rz   rß  r2   r2   r3   Úadd_vhea_field  s    zBuilder.add_vhea_fieldc                    sF   d| j vrtdƒ‚dd„ | jD ƒ‰ ‡ fdd„| ¡ D ƒ}|| j|< d S )NrG   z?Cannot add feature variations to a font without an 'fvar' tablec                 S   s    i | ]}|j |j|j|jf“qS r2   )rH   ZminValueÚdefaultValueZmaxValue)r;   r@  r2   r2   r3   r´     s   ÿz,Builder.add_conditionset.<locals>.<dictcomp>c                    s2   i | ]*\}\}}|t |ˆ | ƒt |ˆ | ƒf“qS r2   r'   )r;   r<   ÚbottomÚtop©ZaxisMapr2   r3   r´   $  s
   
üþ)r0   r   rQ   r¿   r|   rß  r2   ræ  r3   Úadd_conditionset  s    
ÿþ
ûzBuilder.add_conditionsetc                 C   s  |du rdS d}d\}}|j dur2t t|j ƒ¡}|jdurLt t|jƒ¡}dD ]ž}tt||ƒtƒsfqPt||d ƒdur‚td|ƒ‚| j	s’td|ƒ‚t||ƒ}| j
|_
| | j	¡\}}	t|||ƒ |	durP|	dkrP|d	krât|	ƒ}nt|	ƒ}d
}qPt |j|j|j||¡}
|�rd|
_|
S )zast.Anchor --> otTables.AnchorNFrØ  )ÚxÚyZDeviceTableú4Can't define a device coordinate and variable scalarú5Can't define a variable scalar in a non-variable fontì   ÿÿ rè  Tr  )ZxDeviceTabler  ÚbuildDeviceÚdictZyDeviceTablerL   rd  r   r   rP   rQ   Úadd_to_variation_storerñ   r%   ZbuildAnchorrè  ré  Zcontourpointrá   )r}   r¦   rÕ  ÚvariableZdeviceXZdeviceYÚdimZ	varscalarÚdefaultr?  Z	otlanchorr2   r2   r3   rÅ  .  s8    





zBuilder.makeOpenTypeAnchorc                 C   s<   i | ]4\}}}}|  d ¡s|d  ¡ |dd…  ||f“qS )ÚReservedr   r¹   N)Ú
startswithÚlower)r;   rO  r5   ÚisDevicer2   r2   r3   r´   O  s   

þzBuilder.<dictcomp>c                 C   s$  |sdS i }d}| j  ¡ D ]Ö\}\}}t||dƒ}	|	s8q|rPt t|	ƒ¡||< qt|	tƒrè|dd… d }
|
d  ¡ |
dd…  }t||ƒr–t	d|ƒ‚| j
s¦t	d|ƒ‚| j|	_|	 | j
¡\}}|||< |durð|d	krðt|ƒ||
< d
}q|	||< q|�r|�s|j�rddinddi}t |¡}|S )z&ast.ValueRecord --> otBase.ValueRecordNFr   r  ZDevicer¹   rê  rë  rì  TZYAdvanceZXAdvance)Ú_VALUEREC_ATTRSr¿   rd  r  rí  rî  rL   r   rõ  r   rP   rQ   rï  r%   r—  Z
buildValue)r}   r¦   rv  r¶  Zvrrð  ZastNameZotNamerö  ÚvalZotDeviceNameZfeaDeviceNamerò  r?  ZvalRecr2   r2   r3   r¸  V  s8    





zBuilder.makeOpenTypeValueRecord)NF)F)YÚ__name__Ú
__module__Ú__qualname__r„   rƒ   r~   r/   r©   r¯   r±   rˆ   r‰   rŠ   r‹   r×   rã   rŒ   r�   r  r  r  rŽ   rü   r›   r>  rš   rF  rH  rJ  rŸ   r`  r�   r�   rf  r^  r{  r|  rÁ   rÄ   r~  r  r�  rƒ  r‡  r‰  rŠ  rŒ  r�  rŽ  r�  r�  r’  r“  r”  r–  r˜  r™  r   r¥  r§  r­  r°  rš  r³  r»  rÁ  rÂ  rÆ  rË  rÎ  rÐ  rÒ  r·  rÇ  r×  rÙ  rÚ  rÜ  rÝ  rÞ  rà  rá  râ  rç  rÅ  r   ZvalueRecordFormatr÷  r¸  r2   r2   r2   r3   r.   \   s°   þF
@3+TU-#_	
'	 ÿ

	
	

!þr.   )NF)NNF)GZfontTools.miscr   ZfontTools.misc.textToolsr   r   r   r   ZfontTools.feaLib.errorr   Z fontTools.feaLib.lookupDebugInfor   r	   r
   ZfontTools.feaLib.parserr   ZfontTools.feaLib.astr   ZfontTools.feaLib.variableScalarr   ZfontTools.otlLibr   r  ZfontTools.otlLib.maxContextCalcr   ZfontTools.ttLibr   r   ZfontTools.ttLib.tablesr   r   ZfontTools.otlLib.builderr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   ZfontTools.otlLib.errorr#   ZfontTools.varLib.varStorer$   ZfontTools.varLib.builderr%   ZfontTools.varLib.featureVarsr&   ZfontTools.varLib.modelsr(   Úcollectionsr)   rª  Úior*   Úloggingri  rœ   Ú	getLoggerrù  r›  r4   r8   Úobjectr.   r2   r2   r2   r3   Ú<module>   s6   D

 ÿ
