
    <`M8                         d Z ddlmZ ddlmZ ddlmZ ddlZ G d de          ZdZ	d	 Z
ed
             Zd Zd Zd Zd Zd Z	 	 	 ddZd Zd ZddZdS )z-Helpers for instantiating name table records.    )contextmanager)deepcopy)IntEnumNc                   2    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     @lib/python3.11/site-packages/fontTools/varLib/instancer/names.pyr   r   	   sA        KNNNO !#(*%%%r   r   r	   c                    g }d| v ru| d         }|j         D ]}|                    |j                   |j        D ]A}|                    |j                   |j        dk    r|                    |j                   Bd| v rq| d         j        }|j        r|j        j        ndD ]}|                    |j	                   |j
        r|j
        j        ndD ]}|                    |j                   d |D             S )Nfvar  STATr   c                     h | ]
}|d k    |S )   r   ).0nameIDs     r   	<setcomp>z&getVariationNameIDs.<locals>.<setcomp>)   s    666v#Fr   )axesappend
axisNameID	instancessubfamilyNameIDpostscriptNameIDtableDesignAxisRecordAxis
AxisNameIDAxisValueArray	AxisValueValueNameID)varfontusedr!   axisinstancestatvalues          r   getVariationNameIDsr<      s+   DvI 	) 	)DKK(((( 	7 	7HKK0111(F22H5666v$262GOD)..R 	) 	)DKK((((6:6IQT(22r 	+ 	+EKK)****666666r   c              #   <  K   ddl m} t          |           }d V  |                    d           |t          |           z
  fd| d         j        D             | d         j        d d <   d| v r)t          d | d         j        D                       s| d= d S d S d S )Nr   )logzPruning name tablec                 &    g | ]}|j         v|S r   r'   )r&   recordexcludes     r   
<listcomp>z&pruningUnusedNames.<locals>.<listcomp>6   s,          fm76R6R6R6R6Rr   nameltagc              3   F   K   | ]}|j         d k    |j        dk    |V  dS )r   r"   N)
platformIDlangID)r&   rA   s     r   	<genexpr>z%pruningUnusedNames.<locals>.<genexpr>>   sH       
 
 A%%&-6*A*A *A*A*A*A
 
r   ) r>   r<   infonamesany)r6   r>   origNameIDsrB   s      @r   pruningUnusedNamesrO   ,   s      %g..K	EEEHH!"""/888G       $V_2     GFO!!! 
  
 
!&//
 
 
 
 
 	 
  
	  	 r   c                    ddl m}m} d| vrt          d          | d         j        }|j        st          d          | d         }d |j        D             }t          |          }|                                D ]$\  }}	||vst          ||         |          r|	||<   % |||          }
t          ||
|           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                 (    i | ]}|j         |j        S r   )axisTagdefaultValuer&   as     r   
<dictcomp>z#updateNameTable.<locals>.<dictcomp>r   s    AAA!AIq~AAAr   c                 0    g | ]}|j         t          z  |S r   )FlagsELIDABLE_AXIS_VALUE_NAMEr&   vs     r   rC   z#updateNameTable.<locals>.<listcomp>~   s5       !'4L*L	  r   N)rJ   rQ   rR   
ValueErrorr/   r3   r)   r   items
isinstancecheckAxisValuesExist_sortAxisValues_updateNameRecords)r6   
axisLimitsrQ   rR   r:   r!   fvarDefaultsdefaultAxisCoordsrT   valaxisValueTabless              r   updateNameTableri   F   sH   @ 65555555WQRRR6? D YWXXX6?D
 BAtyAAAL ,,$**,, - -+++zg&	0
 0
+ *-g&..t5FGGO0ABBB "  O &o66Ow00000r   c                 2   t                      }| j        j        }|D ]}|j        }|j        dv rM||j                 j        }|dk    r|j        }n|j        }|v r!||         k    r|                    |           _|j        dk    rF|j	        D ]>}	||	j                 j        }|v r&|	j        |         k    r|                    |           ?t                    |z
  }
|
r4d
                    fd|
D                       }t          d| d          d S )N)r   r	   r
   r	   r   z, c              3   6   K   | ]}d | d|          d V  dS )'=Nr   )r&   i
axisCoordss     r   rI   z'checkAxisValuesExist.<locals>.<genexpr>   s;      JJ444JqM444JJJJJJr   zCannot find Axis Values [])setr0   r1   Format	AxisIndexAxisTagNominalValueValueaddAxisValueRecordjoinr^   )r:   
axisValuesro   seen
designAxesaxisValueTableaxisValueFormatrT   	axisValuerecmissingAxesmissings     `         r   ra   ra      sZ   55D&+J$ & &(/ I-- !9:BG!##*7		*0	*$$j6I)I)I!!!"a''%5 & &$S]3;j((SY*W:M-M-MHHW%%%j//D(K A))JJJJkJJJJJ?W???@@@A Ar   c                    g }t                      }t          d | D             d d          }|D ]P}t          d |j        D                       }t          |          }||z  s||z  }|                    ||f           Q| D ]>}||v r|j        }||vr,|                    |           |                    ||f           ?d t          |          D             S )Nc                 (    g | ]}|j         d k    |S )r   )rr   r\   s     r   rC   z#_sortAxisValues.<locals>.<listcomp>   s    000q!(a-----r   c                 *    t          | j                  S N)lenrx   )r]   s    r   <lambda>z!_sortAxisValues.<locals>.<lambda>   s    c!+,, r   T)keyreversec              3   $   K   | ]}|j         V  d S r   )rs   r&   rs     r   rI   z"_sortAxisValues.<locals>.<genexpr>   s$      CC!!+CCCCCCr   c                     g | ]\  }}|S r   r   )r&   _r   s      r   rC   z#_sortAxisValues.<locals>.<listcomp>   s    :::,!YI:::r   )rq   sortedrx   minr*   rs   rw   )rz   resultsseenAxesformat4rg   axisIndexesminIndex	axisIndexs           r   rb   rb      s    GuuH00J000,,  G  , ,CCs/BCCCCC{##+% 	,#HNNHc?+++ - -'>>M	H$$LL###NNIs+,,,::&//::::r   c                    | d         | d         j         }d |D             }fd|D             fd|D             }|j        }t          |          }j        t	          d j        D                       }|D ]ڊt          fddd	|fD                       s"d
                    fdD                       }|r#d
                    fd|D                       }	nd }	|	s;|s9|r |gR                                  }n |gR                                  }	d
                    fd|D                       }
t          | |
||	gR   d S )NrD   r#   c                     g | ]	}|j         
S r   )r5   rV   s     r   rC   z&_updateNameRecords.<locals>.<listcomp>   s    :::!:::r   c                 4    g | ]}t          |          |S r   )_isRibbi)r&   n	nametables     r   rC   z&_updateNameRecords.<locals>.<listcomp>   s(    JJJ!8Iq3I3IJAJJJr   c                     g | ]}|v|	S r   r   )r&   r   ribbiNameIDss     r   rC   z&_updateNameRecords.<locals>.<listcomp>   s#    LLLQa|6K6Kq6K6K6Kr   c              3   >   K   | ]}|j         |j        |j        fV  d S r   )rG   	platEncIDrH   r   s     r   rI   z%_updateNameRecords.<locals>.<genexpr>   s/      SSaQ\1;9SSSSSSr   c              3   *   K   | ]} |gR  V  d S r   r   )r&   rn   getNameplatforms     r   rI   z%_updateNameRecords.<locals>.<genexpr>   s5      GGQ771(x(((GGGGGGr   r   r	    c              3   N   K   | ]} |gR                                   V   d S r   	toUnicoder&   r   r   r   s     r   rI   z%_updateNameRecords.<locals>.<genexpr>   sR       !
 !
23GGA!!!!++--!
 !
 !
 !
 !
 !
r   c              3   N   K   | ]} |gR                                   V   d S r   r   r   s     r   rI   z%_updateNameRecords.<locals>.<genexpr>   sR       ) )67%H%%%//11) ) ) ) ) )r   c              3   N   K   | ]} |gR                                   V   d S r   r   r   s     r   rI   z%_updateNameRecords.<locals>.<genexpr>   sR       $
 $
23GGA!!!!++--$
 $
 $
 $
 $
 $
r   )
r/   ElidedFallbackNameIDr   r   rq   rL   allry   r   _updateNameTableStyleRecords)r6   rz   r:   axisValueNameIDsnonRibbiNameIDselidedNameIDelidedNameIsRibbi	platformssubFamilyNametypoSubFamilyNamefamilyNameSuffixr   r   r   r   s              @@@@r   rc   rc      sX   I6? D::z:::JJJJ/JJJLLLLL"2LLLO,L L99GSS9?SSSSSI "
 "
GGGGG1a2FGGGGG 	  !
 !
 !
 !
 !
7C!
 !
 !
 
 
  	% # ) ) ) ) );K) ) ) ! ! !% ! 	Q 	Q  Q ' @x @ @ @ J J L L$+GL$D8$D$D$D$N$N$P$P!88 $
 $
 $
 $
 $
7F$
 $
 $
 
 
 	%		

 	
 	
 	
 	
 	
9"
 "
r   c                 j    |                      |ddd          }||                                dv rdndS )Nr
   r   	  )RegularItalicBoldzBold ItalicTF)r   r   )r   r'   englishRecords      r   r   r      sL    %%faE::M $##%%)UUU 	 	r   r
   r   r   c                    | d         }|||f} |j         t          j        g|R  p |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}|rE|	 d| 	                                |t          j        <   |	|t          j        <   ||t          j        <   n1t          j        t          j        fD ]}|
                    |           |                    t          j                  p|t          j                 }|                    t          j                  p|t          j                 }| d| |t          j        <   t          | |||          |t          j        <   t          | ||          }|r||t          j        <   |                                D ] \  }}|s
J |             |j        ||g|R   !d| vr!|
                    t          j                   d S d S )NrD   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   r_   setNamer   )r6   r   r   r   rG   r   rH   r   r   currentFamilyNamecurrentStyleNamenameIDsr'   newFamilyNamenewStyleNameuniqueIDstrings                    r   r   r      s    IIv.H)	)&)1   :		6-	9	9	9	9  )y(),4   =		60	<8	<	<	<  !#3455 VT(TTUUU)3355'1133 	-}9	G  1):&O&O=M&O&O&U&U&W&W"#2C./5F122
 *-
 	1 	1F !!!0000 	F233Rwv?Q7R  	F566X'&BW:X  )6%F%F%F%FGF!"&9h' 'GF"# )'8DDH :19-.!--// 5 5v	&&4844444WfFGGGGG r   c                     | d         } |j         t          j        g|R  }|r|                                }n|}| d| }t	          j        dd|          }t          |          dk    r|d d          dS |S )NrD   -z[^A-Za-z0-9-]rJ      |   z...)r   r   r   r   resubr   )r6   
familyName	styleNamer   r   family_prefixpsNames          r   r   r   A  s     I%I%03;  M  #%//11"++	++F V$c622F
6{{S #,####Mr   c                 B   | d         } |j         t          j        g|R  }|sd S t          j        t          j        fD ]} |j         |g|R  }|s|                                |                                v rG|                                                    |                                ||j                           c S t          | |          }| d         j	        }t          j        dd|                                          }	|t          j                 }
| d|	 d|
 S )NrD   zOS/2z[^\x00-\x7F]rJ   ;)r   r   r   r   r   r   replacer'   _fontVersion	achVendIDr   r   r   )r6   r   r   r   currentRecordr'   
nameRecordfontVersionr   vendorr   s              r   r   r   [  sJ   I%I%f&COhOOOM t (&*@A  &Y&v9999
 	!!]%<%<%>%>>> **,,44$$&&
0A(B     ? w11K)IVOR3399;;FV+,F--F--V---r   r
   r   r   c                     | d         j         t          j        g|R  }|| d         j        dS |                                                    d          d         }|                    d                                          S )NrD   headz.3fr   r   zVersion )r   r   r   fontRevisionr   splitlstripr   )fontr   r   versionNumbers       r   r   r   t  s    %f%f&;GhGGGJv,+111 ((**0055a8M
++11333r   )r   )__doc__
contextlibr   copyr   enumr   r   r   r[   r<   rO   ri   ra   rb   rc   r   r   r   r   r   r   r   r   <module>r      s[   3 3 % % % % % %             					+ 	+ 	+ 	+ 	+W 	+ 	+ 	+  7 7 7(      2<1 <1 <1~A A A2; ; ;D/
 /
 /
d   BH BH BH BHJ  4. . .24 4 4 4 4 4r   