a
    èÝEbM8  ã                   @   s¨   d Z ddlmZ ddlmZ ddlmZ ddlZG dd„ deƒZdZ	d	d
„ Z
edd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd#dd„Zdd„ Zdd„ Zd$d!d"„ZdS )%z-Helpers for instantiating name table records.é    )Úcontextmanager)Údeepcopy)ÚIntEnumNc                   @   s0   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
S )ÚNameIDé   é   é   é   é   é   é   é   é   N)Ú__name__Ú
__module__Ú__qualname__ÚFAMILY_NAMEÚSUBFAMILY_NAMEÚUNIQUE_FONT_IDENTIFIERÚFULL_FONT_NAMEÚVERSION_STRINGÚPOSTSCRIPT_NAMEÚTYPOGRAPHIC_FAMILY_NAMEÚTYPOGRAPHIC_SUBFAMILY_NAMEÚ!VARIATIONS_POSTSCRIPT_NAME_PREFIX© r   r   ú`/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/fontTools/varLib/instancer/names.pyr   	   s   r   r   c                 C   sÂ   g }d| v rZ| d }|j D ]}| |j¡ q|jD ]&}| |j¡ |jdkr2| |j¡ q2d| v r´| d j}|jrz|jjndD ]}| |j	¡ q~|j
rž|j
jndD ]}| |j¡ q¢dd„ |D ƒS )NÚfvaréÿÿ  ÚSTATr   c                 S   s   h | ]}|d kr|’qS )éÿ   r   )Ú.0ÚnameIDr   r   r   Ú	<setcomp>)   ó    z&getVariationNameIDs.<locals>.<setcomp>)ÚaxesÚappendZ
axisNameIDZ	instancesZsubfamilyNameIDZpostscriptNameIDÚtableÚDesignAxisRecordÚAxisZ
AxisNameIDÚAxisValueArrayZ	AxisValueÚValueNameID)ÚvarfontÚusedr   ZaxisÚinstanceÚstatÚvaluer   r   r   ÚgetVariationNameIDs   s     



r1   c                 #   s€   ddl m} t| ƒ}d V  | d¡ |t| ƒ ‰ ‡ fdd„| d jD ƒ| d jd d …< d| v r|tdd	„ | d jD ƒƒs|| d= d S )
Nr   )ÚlogzPruning name tablec                    s   g | ]}|j ˆ vr|‘qS r   ©r"   ©r!   Úrecord©Úexcluder   r   Ú
<listcomp>6   s   z&pruningUnusedNames.<locals>.<listcomp>ÚnameÚltagc                 s   s&   | ]}|j d kr|jdkr|V  qdS )r   r   N)Ú
platformIDÚlangIDr4   r   r   r   Ú	<genexpr>>   s   þz%pruningUnusedNames.<locals>.<genexpr>)Ú r2   r1   ÚinfoÚnamesÚany)r,   r2   ZorigNameIDsr   r6   r   ÚpruningUnusedNames,   s    

ÿþrB   c                 C   sÂ   ddl m}m} d| vr tdƒ‚| d j}|js8tdƒ‚| d }dd„ |jD ƒ}t|ƒ}| ¡ D ]&\}}	||vs~t	|| |ƒr`|	||< q`|||ƒ}
t
||
|ƒ d	d
„ |
D ƒ}
t|
ƒ}
t| |
ƒ dS )a<  Update instatiated variable font's name table using STAT AxisValues.

    Raises ValueError if the STAT table is missing or an Axis Value table is
    missing for requested axis locations.

    First, collect all STAT AxisValues that match the new default axis locations
    (excluding "elided" ones); concatenate the strings in design axis order,
    while giving priority to "synthetic" values (Format 4), to form the
    typographic subfamily name associated with the new default instance.
    Finally, update all related records in the name table, making sure that
    legacy family/sub-family names conform to the the R/I/B/BI (Regular, Italic,
    Bold, Bold Italic) naming model.

    Example: Updating a partial variable font:
    | >>> ttFont = TTFont("OpenSans[wdth,wght].ttf")
    | >>> updateNameTable(ttFont, {"wght": AxisRange(400, 900), "wdth": 75})

    The name table records will be updated in the following manner:
    NameID 1 familyName: "Open Sans" --> "Open Sans Condensed"
    NameID 2 subFamilyName: "Regular" --> "Regular"
    NameID 3 Unique font identifier: "3.000;GOOG;OpenSans-Regular" -->         "3.000;GOOG;OpenSans-Condensed"
    NameID 4 Full font name: "Open Sans Regular" --> "Open Sans Condensed"
    NameID 6 PostScript name: "OpenSans-Regular" --> "OpenSans-Condensed"
    NameID 16 Typographic Family name: None --> "Open Sans"
    NameID 17 Typographic Subfamily name: None --> "Condensed"

    References:
    https://docs.microsoft.com/en-us/typography/opentype/spec/stat
    https://docs.microsoft.com/en-us/typography/opentype/spec/name#name-ids
    r   )Ú	AxisRangeÚaxisValuesFromAxisLimitsr   z6Cannot update name table since there is no STAT table.z<Cannot update name table since there are no STAT Axis Valuesr   c                 S   s   i | ]}|j |j“qS r   )ÚaxisTagÚdefaultValue©r!   Úar   r   r   Ú
<dictcomp>r   r$   z#updateNameTable.<locals>.<dictcomp>c                 S   s   g | ]}|j t@ s|‘qS r   )ÚFlagsÚELIDABLE_AXIS_VALUE_NAME©r!   Úvr   r   r   r8   ~   s   z#updateNameTable.<locals>.<listcomp>N)r>   rC   rD   Ú
ValueErrorr'   r*   r%   r   ÚitemsÚ
isinstanceÚcheckAxisValuesExistÚ_sortAxisValuesÚ_updateNameRecords)r,   Z
axisLimitsrC   rD   r/   r   ZfvarDefaultsZdefaultAxisCoordsrE   ÚvalZaxisValueTablesr   r   r   ÚupdateNameTableF   s*     

ÿ

ÿrU   c                    sè   t ƒ }| jj}|D ]˜}|j}|jdv rh||j j}|dkrB|j}n|j}|ˆ v rª|ˆ | krª| |¡ q|jdkr|j	D ]0}	||	j j}|ˆ v rx|	jˆ | krx| |¡ qxqt ˆ ƒ| }
|
räd 
‡ fdd„|
D ƒ¡}td|› d�ƒ‚d S )	N)r   r   r   r   r	   z, c                 3   s$   | ]}d |› dˆ | › d �V  qdS )ú'ú=Nr   ©r!   Úi©Ú
axisCoordsr   r   r=   š   r$   z'checkAxisValuesExist.<locals>.<genexpr>zCannot find Axis Values [ú])Úsetr(   r)   ÚFormatÚ	AxisIndexZAxisTagZNominalValueÚValueÚaddÚAxisValueRecordÚjoinrN   )r/   Ú
axisValuesr[   ÚseenZ
designAxesZaxisValueTableZaxisValueFormatrE   Ú	axisValueZrecZmissingAxesÚmissingr   rZ   r   rQ   …   s(    


rQ   c                 C   s¶   g }t ƒ }tdd„ | D ƒdd„ dd�}|D ]>}t dd„ |jD ƒƒ}t|ƒ}||@ s*||O }| ||f¡ q*| D ]4}||v r|qn|j}||vrn| |¡ | ||f¡ qnd	d„ t|ƒD ƒS )
Nc                 S   s   g | ]}|j d kr|‘qS )r	   )r^   rL   r   r   r   r8   ©   r$   z#_sortAxisValues.<locals>.<listcomp>c                 S   s
   t | jƒS ©N)Úlenrb   )rM   r   r   r   Ú<lambda>ª   r$   z!_sortAxisValues.<locals>.<lambda>T)ÚkeyÚreversec                 s   s   | ]}|j V  qd S rh   )r_   ©r!   Úrr   r   r   r=   ¯   r$   z"_sortAxisValues.<locals>.<genexpr>c                 S   s   g | ]\}}|‘qS r   r   )r!   Ú_rf   r   r   r   r8   ½   r$   )r]   Úsortedrb   Úminr&   r_   ra   )rd   ÚresultsZseenAxesZformat4rT   ZaxisIndexesZminIndexZ	axisIndexr   r   r   rR   ž   s*    ý
rR   c                    sD  | d ‰| d j }dd„ |D ƒ}‡fdd„|D ƒ‰‡fdd„|D ƒ}|j}tˆ|ƒ}ˆj‰ tdd„ ˆjD ƒƒ}|D ]Ì‰t‡ ‡fd	d„d
d|fD ƒƒs–qrd ‡ ‡fdd„ˆD ƒ¡}|rÐd ‡ ‡fdd„|D ƒ¡}	nd }	|	�s|�s|rúˆ |gˆ¢R Ž  ¡ }nˆ |gˆ¢R Ž  ¡ }	d ‡ ‡fdd„|D ƒ¡}
t	| |
||	gˆ¢R Ž  qrd S )Nr9   r   c                 S   s   g | ]
}|j ‘qS r   )r+   rG   r   r   r   r8   Å   r$   z&_updateNameRecords.<locals>.<listcomp>c                    s   g | ]}t ˆ |ƒr|‘qS r   )Ú_isRibbi©r!   Ún)Ú	nametabler   r   r8   Æ   r$   c                    s   g | ]}|ˆ vr|‘qS r   r   rt   )ÚribbiNameIDsr   r   r8   Ç   r$   c                 s   s   | ]}|j |j|jfV  qd S rh   )r;   Ú	platEncIDr<   rm   r   r   r   r=   Ì   r$   z%_updateNameRecords.<locals>.<genexpr>c                 3   s   | ]}ˆ |gˆ¢R Ž V  qd S rh   r   rX   ©ÚgetNameÚplatformr   r   r=   Î   r$   r   r   ú c                 3   s"   | ]}ˆ |gˆ¢R Ž   ¡ V  qd S rh   ©Ú	toUnicodert   ry   r   r   r=   Ó   s   c                 3   s"   | ]}ˆ |gˆ¢R Ž   ¡ V  qd S rh   r}   rt   ry   r   r   r=   ×   s   c                 3   s"   | ]}ˆ |gˆ¢R Ž   ¡ V  qd S rh   r}   rt   ry   r   r   r=   å   s   )
r'   ZElidedFallbackNameIDrs   rz   r]   r@   Úallrc   r~   Ú_updateNameTableStyleRecords)r,   rd   r/   ZaxisValueNameIDsZnonRibbiNameIDsZelidedNameIDZelidedNameIsRibbiÚ	platformsÚsubFamilyNameÚtypoSubFamilyNameÚfamilyNameSuffixr   )rz   rv   r{   rw   r   rS   À   sF    

ÿÿ
ÿüûrS   c                 C   s,   |   |ddd¡}|d ur(| ¡ dv r(dS dS )Nr   r   é	  )ÚRegularZItalicZBoldzBold ItalicTF)rz   r~   )rv   r"   ZenglishRecordr   r   r   rs   ò   s    ÿ
þürs   r   r   r…   c                 C   s´  | d }|||f}|j tjg|¢R Ž p8|j tjg|¢R Ž }	|j tjg|¢R Ž p`|j tjg|¢R Ž }
t|	|
gƒs|td|› �ƒ‚|	 ¡ }	|
 ¡ }
tj|	tj|pœdi}|rÒ|	› d|› � 	¡ |tj< |	|tj< ||tj< ntjtjfD ]}|j
|d� qÞ| tj¡�p|tj }| tj¡�p|tj }|› d|› �|tj< t| |||ƒ|tj< t| ||ƒ}|�rd||tj< | ¡ D ],\}}|�s‚J |ƒ‚|j||g|¢R Ž  �qld| v�r°| 
tj¡ d S )Nr9   z.Missing required NameIDs 1 and 2 for platform r†   r|   r3   r   )rz   r   r   r   r   r   r   rN   r~   ÚstripZremoveNamesÚgetr   Ú_updatePSNameRecordr   Ú_updateUniqueIdNameRecordr   rO   ÚsetNamer   )r,   r„   r‚   rƒ   r;   rx   r<   rv   r{   ZcurrentFamilyNameZcurrentStyleNameÚnameIDsr"   ZnewFamilyNameZnewStyleNameZuniqueIDÚstringr   r   r   r€   ü   s^    
ÿÿþÿÿþ
þ
þÿÿÿ


r€   c                 C   sl   | d }|j tjg|¢R Ž }|r*| ¡ }n|}|› d|› �}t dd|¡}t|ƒdkrh|d d… › d�S |S )Nr9   ú-z[^A-Za-z0-9-]r>   é   é|   z...)rz   r   r   r~   ÚreÚsubri   )r,   Z
familyNameZ	styleNamer{   rv   Zfamily_prefixÚpsNamer   r   r   r‰   A  s    ÿÿ
r‰   c                 C   sÀ   | d }|j tjg|¢R Ž }|s$d S tjtjfD ]J}|j |g|¢R Ž }|sLq0| ¡ | ¡ v r0| ¡  | ¡ ||j ¡  S q0t| |ƒ}| d j	}t
 dd|¡ ¡ }	|tj }
|› d|	› d|
› �S )Nr9   zOS/2z[^\x00-\x7F]r>   ú;)rz   r   r   r   r   r~   Úreplacer"   Ú_fontVersionÚ	achVendIDr‘   r’   r‡   )r,   rŒ   r{   rv   ZcurrentRecordr"   Ú
nameRecordZfontVersionr—   Úvendorr“   r   r   r   rŠ   [  s"    ÿ



rŠ   ©r   r   r…   c                 C   sN   | d j tjg|¢R Ž }|d u r.| d jd›S | ¡  d¡d }| d¡ ¡ S )Nr9   Úheadz.3fr”   r   zVersion )rz   r   r   ZfontRevisionr~   ÚsplitÚlstripr‡   )Úfontr{   r˜   ZversionNumberr   r   r   r–   t  s
    r–   )r   r   r…   )rš   )Ú__doc__Ú
contextlibr   Úcopyr   Úenumr   r‘   r   rK   r1   rB   rU   rQ   rR   rS   rs   r€   r‰   rŠ   r–   r   r   r   r   Ú<module>   s*   
?"2   ù
E