o
    hf:                     @   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   t/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/fontTools/varLib/instancer/names.pyr   	   s    r   r   c                 C   s   g }d| v r-| d }|j D ]}||j q|jD ]}||j |jdkr,||j qd| v ri| d j}|jr=|jjndD ]}||j	 q?|j
rO|j
jndD ]}||j qQt|dd }|d uri|| 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append
axisNameID	instancessubfamilyNameIDpostscriptNameIDtableDesignAxisRecordAxis
AxisNameIDAxisValueArray	AxisValueValueNameIDgetattr)varfontusedr   axisinstancestatvalueelidedFallbackNameIDr   r   r   getVariationNameIDs   s(   




r;   c                 #   s    ddl m} t| }d V  |d |t|    fdd| d jD | d jd d < d| v rAtdd	 | d jD sC| d= d S d S 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>nameltagc                 s   s(    | ]}|j d kr|jdkr|V  qdS )r   r   N)
platformIDlangIDr>   r   r   r   	<genexpr>A   s    z%pruningUnusedNames.<locals>.<genexpr>) r<   r;   infonamesany)r4   r<   origNameIDsr   r@   r   pruningUnusedNames/   s    


rM   c           
      C   s   ddl m}m} d| vrtd| d j}|jstd| d }||| }| }dd |jD }|i ||}t	d	d
 |
 D sHJ |||}	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 |jqS r   )axisTagdefaultValuer"   ar   r   r   
<dictcomp>w   s    z#updateNameTable.<locals>.<dictcomp>c                 s   s    | ]	}|j |jkV  qd S N)minimummaximumr"   vr   r   r   rG   y   s    z"updateNameTable.<locals>.<genexpr>c                 S   s   g | ]	}|j t@ s|qS r   )FlagsELIDABLE_AXIS_VALUE_NAMErX   r   r   r   rB      s
    
z#updateNameTable.<locals>.<listcomp>N)rH   rN   rO   
ValueErrorr,   r0   limitAxesAndPopulateDefaultsdefaultLocationr&   allvaluescheckAxisValuesExistpinnedLocation_sortAxisValues_updateNameRecords)
r4   
axisLimitsrN   rO   r8   r   partialDefaultsfvarDefaultsdefaultAxisCoordsaxisValueTablesr   r   r   updateNameTableI   s&    

rj   c                    sF  t  }| jj}t  }| jjD ]%}|jdv r|||j j q|jdkr3|j	D ]}|||j j q'q|D ]L}|j}	|jdv ra||j j}
|	dkrN|j
}n|j}|
 v r`| |
 kr`||
 q6|jdkr|j	D ]}||j j}
|
 v r|j |
 kr||
 qiq6t  | |@ }|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   rG      s   " z'checkAxisValuesExist.<locals>.<genexpr>zCannot find Axis Values {})setr-   r.   r0   r1   Formatadd	AxisIndexAxisTagAxisValueRecordNominalValueValuejoinr\   )r8   
axisValuesro   seen
designAxes	hasValuesr9   recaxisValueTableaxisValueFormatrP   	axisValuemissingAxesmissingr   rn   r   ra      s>   







ra   c                 C   s   g }t  }tdd | D dd dd}|D ]}t dd |jD }t|}||@ s4||O }|||f q| D ]}||v r>q7|j}||vrQ|| |||f q7d	d t|D S )
Nc                 S   s   g | ]	}|j d kr|qS )r	   )rr   rX   r   r   r   rB          z#_sortAxisValues.<locals>.<listcomp>c                 S   s
   t | jS rU   )lenrv   )rY   r   r   r   <lambda>   s   
 z!_sortAxisValues.<locals>.<lambda>T)keyreversec                 s   s    | ]}|j V  qd S rU   )rt   r"   rr   r   r   rG      s    z"_sortAxisValues.<locals>.<genexpr>c                 S   s   g | ]\}}|qS r   r   )r"   _r   r   r   r   rB      s    )rq   sortedrv   minr'   rt   rs   )rz   resultsseenAxesformat4valaxisIndexesminIndex	axisIndexr   r   r   rc      s.   
rc   c                    s@  | d | d j }dd |D }fdd|D fdd|D }|j}t|}j tdd jD }|D ]dt fd	dd
d|fD sKq9d fddD }|rhd fdd|D }	nd }	|	s|s|r{ |gR   }n
 |gR   }	d fdd|D }
t	| |
||	gR   q9d S )NrC   r   c                 S   s   g | ]}|j qS r   )r2   rR   r   r   r   rB      s    z&_updateNameRecords.<locals>.<listcomp>c                    s   g | ]	}t  |r|qS r   )_isRibbir"   n)	nametabler   r   rB      r   c                    s   g | ]}| vr|qS r   r   r   )ribbiNameIDsr   r   rB      r%   c                 s   s     | ]}|j |j|jfV  qd S rU   )rE   	platEncIDrF   r   r   r   r   rG          z%_updateNameRecords.<locals>.<genexpr>c                 3   s     | ]} |gR  V  qd S rU   r   rl   getNameplatformr   r   rG      r   r   r    c                 3   $    | ]} |gR    V  qd S rU   	toUnicoder   r   r   r   rG          
c                 3   r   rU   r   r   r   r   r   rG      r   c                 3   r   rU   r   r   r   r   r   rG      r   )
r,   r    r   r   rq   rJ   r_   ry   r   _updateNameTableStyleRecords)r4   rz   r8   axisValueNameIDsnonRibbiNameIDselidedNameIDelidedNameIsRibbi	platformssubFamilyNametypoSubFamilyNamefamilyNameSuffixr   )r   r   r   r   r   rd      sH   



rd   c                 C   s,   |  |ddd}|d ur| dv rdS dS )Nr   r   	  )RegularItalicBoldzBold ItalicTF)r   r   )r   r#   englishRecordr   r   r   r      s   r   r   r   r   c                 C   s  | d }|||f}|j tjg|R  p|j tjg|R  }	|j tjg|R  p0|j tjg|R  }
t|	|
gs>td| |	 }	|
 }
tj|	tj|pNdi}|ri|	 d| 	 |tj< |	|tj< ||tj< ntjtjfD ]}|j
|d qo|tjp|tj }|tjp|tj }| d| |tj< t| ||||tj< t| ||}|r||tj< | D ]\}}|sJ ||j||g|R   qd| vr|
tj d S d S )NrC   z.Missing required NameIDs 1 and 2 for platform r   r   r=   r   )r   r   r   r   r   r   r_   r\   r   stripremoveNamesgetr   _updatePSNameRecordr   _updateUniqueIdNameRecordr   itemssetNamer   )r4   r   r   r   rE   r   rF   r   r   currentFamilyNamecurrentStyleNamenameIDsr#   newFamilyNamenewStyleName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r4|d d  dS |S )NrC   -z[^A-Za-z0-9-]rH      |   z...)r   r   r   r   resubr   )r4   
familyName	styleNamer   r   family_prefixpsNamer   r   r   r   J  s   
r   c                 C   s   | d }|j tjg|R  }|sd S tjtjfD ]%}|j |g|R  }|s&q| | v r=| | ||j   S qt| |}| d j	}t
dd| }	|tj }
| d|	 d|
 S )NrC   zOS/2z[^\x00-\x7F]rH   ;)r   r   r   r   r   r   replacer#   _fontVersion	achVendIDr   r   r   )r4   r   r   r   currentRecordr#   
nameRecordfontVersionr   vendorr   r   r   r   r   d  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 )NrC   headz.3fr   r   zVersion )r   r   r   fontRevisionr   splitlstripr   )fontr   r   versionNumberr   r   r   r   }  s
   r   )r   )__doc__
contextlibr   copyr   enumr   r   r   r[   r;   rM   rj   ra   rc   rd   r   r   r   r   r   r   r   r   r   <module>   s,    
=!"2
E