a
    w=ic"9                     @   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   q/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/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 qt|dd }|d ur|| dd |D S )Nfvar  STATr   ElidedFallbackNameIDc                 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getattr)varfontusedr   ZaxisinstancestatvalueZelidedFallbackNameIDr   r   r   getVariationNameIDs   s&    




r3   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>9   s   z&pruningUnusedNames.<locals>.<listcomp>nameZltagc                 s   s&   | ]}|j d kr|jdkr|V  qdS )r   r   N)
platformIDlangIDr6   r   r   r   	<genexpr>A   s   z%pruningUnusedNames.<locals>.<genexpr>) r4   r3   infonamesany)r.   r4   ZorigNameIDsr   r8   r   pruningUnusedNames/   s    

rC   c           
      C   s   ddl m}m} d| vr td| d j}|js8td| d }||| }dd | D }d	d |jD }|i ||}t	d
d |
 D sJ |||}	t||	|  dd |	D }	t|	}	t| |	 dS )a3  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": (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   )
AxisLimits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 qS r   )default)r"   kvr   r   r   
<dictcomp>v   r%   z#updateNameTable.<locals>.<dictcomp>c                 S   s   i | ]}|j |jqS r   )axisTagdefaultValuer"   ar   r   r   rI   w   r%   c                 s   s   | ]}|j |jkV  qd S N)minimummaximumr"   rH   r   r   r   r>   y   r%   z"updateNameTable.<locals>.<genexpr>c                 S   s   g | ]}|j t@ s|qS r   )FlagsELIDABLE_AXIS_VALUE_NAMErQ   r   r   r   r:      s   z#updateNameTable.<locals>.<listcomp>N)r?   rD   rE   
ValueErrorr(   r+   ZpopulateDefaultsitemsr&   allvaluescheckAxisValuesExistZpinnedLocation_sortAxisValues_updateNameRecords)
r.   Z
axisLimitsrD   rE   r1   r   ZpartialDefaultsZfvarDefaultsZdefaultAxisCoordsZaxisValueTablesr   r   r   updateNameTableI   s&     

r[   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  | }
|
rd
 fdd|
D }td| dd S )	N)r   r   r   r   r	   z, c                 3   s"   | ]}d | d |  V  qdS )'z': 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joinrT   )r1   
axisValuesr`   seenZ
designAxesZaxisValueTableZaxisValueFormatrJ   	axisValueZrecZmissingAxesmissingr   r_   r   rX      s(    


rX   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	   )rc   rQ   r   r   r   r:      r%   z#_sortAxisValues.<locals>.<listcomp>c                 S   s
   t | jS rN   )lenrg   )rH   r   r   r   <lambda>   r%   z!_sortAxisValues.<locals>.<lambda>T)keyreversec                 s   s   | ]}|j V  qd S rN   )rd   r"   rr   r   r   r>      r%   z"_sortAxisValues.<locals>.<genexpr>c                 S   s   g | ]\}}|qS r   r   )r"   _rk   r   r   r   r:      r%   )rb   sortedrg   minr'   rd   rf   )ri   resultsZseenAxesZformat4valZaxisIndexesZminIndexZ	axisIndexr   r   r   rY      s*    
rY   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 sqrd fddD }|rd fdd|D }	nd }	|	s|s|r |gR   }n |gR   }	d fdd|D }
t	| |
||	gR   qrd S )Nr;   r   c                 S   s   g | ]
}|j qS r   )r,   rL   r   r   r   r:      r%   z&_updateNameRecords.<locals>.<listcomp>c                    s   g | ]}t  |r|qS r   )_isRibbir"   n)	nametabler   r   r:      r%   c                    s   g | ]}| vr|qS r   r   ry   )ribbiNameIDsr   r   r:      r%   c                 s   s   | ]}|j |j|jfV  qd S rN   )r<   	platEncIDr=   rq   r   r   r   r>      r%   z%_updateNameRecords.<locals>.<genexpr>c                 3   s   | ]} |gR  V  qd S rN   r   r]   getNameplatformr   r   r>      r%   r   r    c                 3   s"   | ]} |gR    V  qd S rN   	toUnicodery   r~   r   r   r>      s   c                 3   s"   | ]} |gR    V  qd S rN   r   ry   r~   r   r   r>      s   c                 3   s"   | ]} |gR    V  qd S rN   r   ry   r~   r   r   r>      s   )
r(   r    rx   r   rb   rA   rV   rh   r   _updateNameTableStyleRecords)r.   ri   r1   ZaxisValueNameIDsZnonRibbiNameIDsZelidedNameIDZelidedNameIsRibbi	platformssubFamilyNametypoSubFamilyNamefamilyNameSuffixr   )r   r{   r   r|   r   rZ      sF    


rZ   c                 C   s,   |  |ddd}|d ur(| dv r(dS dS )Nr   r   	  )RegularZItalicZBoldzBold ItalicTF)r   r   )r{   r#   ZenglishRecordr   r   r   rx      s    
rx   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|pd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 ],\}}|sJ ||j||g|R   qld| vr|
tj d S )Nr;   z.Missing required NameIDs 1 and 2 for platform r   r   r5   r   )r   r   r   r   r   r   rV   rT   r   stripZremoveNamesgetr   _updatePSNameRecordr   _updateUniqueIdNameRecordr   rU   setNamer   )r.   r   r   r   r<   r}   r=   r{   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 )Nr;   -z[^A-Za-z0-9-]r?      |   z...)r   r   r   r   resubrm   )r.   Z
familyNameZ	styleNamer   r{   Zfamily_prefixpsNamer   r   r   r   B  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 )Nr;   zOS/2z[^\x00-\x7F]r?   ;)r   r   r   r   r   r   replacer#   _fontVersion	achVendIDr   r   r   )r.   r   r   r{   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 )Nr;   headz.3fr   r   zVersion )r   r   r   ZfontRevisionr   splitlstripr   )Zfontr   r   ZversionNumberr   r   r   r   u  s
    r   )r   r   r   )r   )__doc__
contextlibr   copyr   enumr   r   r   rS   r3   rC   r[   rX   rY   rZ   rx   r   r   r   r   r   r   r   r   <module>   s*   
="2   
E