
    ]Mhf:                         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     `/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/fontTools/varLib/instancer/names.pyr   r   	   sA        KNNNO !#(*%%%r   r   r	   c                 J   g }d| v ru| d         }|j         D ]}|                    |j                   |j        D ]A}|                    |j                   |j        dk    r|                    |j                   Bd| v r| d         j        }|j        r|j        j        ndD ]}|                    |j	                   |j
        r|j
        j        ndD ]}|                    |j                   t          |dd           }||                    |           d |D             S )Nfvar  STATr   ElidedFallbackNameIDc                     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getattr)varfontusedr!   axisinstancestatvalueelidedFallbackNameIDs           r   getVariationNameIDsr?      sW   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)****&t-CTJJ+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>9   s,          fm76R6R6R6R6Rr   nameltagc              3   F   K   | ]}|j         d k    |j        dk    |V  dS )r   r"   N)
platformIDlangID)r'   rD   s     r   	<genexpr>z%pruningUnusedNames.<locals>.<genexpr>A   sH       
 
 A%%&-6*A*A *A*A*A*A
 
r   ) rA   r?   infonamesany)r8   rA   origNameIDsrE   s      @r   pruningUnusedNamesrR   /   s      %g..K	EEEHH!"""/888G       $V_2     GFO!!! 
  
 
!&//
 
 
 
 
 	 
  
	  	 r   c                 D   ddl m}m} d| vrt          d          | d         j        }|j        st          d          | d         } ||                              |           }|                                }d |j        D             } |i ||          }t          d |
                                D                       sJ  |||          }	t          ||	|                                           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                 (    i | ]}|j         |j        S r   )axisTagdefaultValuer'   as     r   
<dictcomp>z#updateNameTable.<locals>.<dictcomp>w   s    AAA!AIq~AAAr   c              3   6   K   | ]}|j         |j        k    V  d S N)minimummaximumr'   vs     r   rL   z"updateNameTable.<locals>.<genexpr>y   s+      JJ!qyAI%JJJJJJr   c                 0    g | ]}|j         t          z  |S r   )FlagsELIDABLE_AXIS_VALUE_NAMEr`   s     r   rF   z#updateNameTable.<locals>.<listcomp>   s5       !'4L*L	  r   N)rM   rT   rU   
ValueErrorr0   r4   limitAxesAndPopulateDefaultsdefaultLocationr*   allvaluescheckAxisValuesExistpinnedLocation_sortAxisValues_updateNameRecords)
r8   
axisLimitsrT   rU   r<   r!   partialDefaultsfvarDefaultsdefaultAxisCoordsaxisValueTabless
             r   updateNameTablers   I   sl   @ 76666666WQRRR6? D YWXXX6?D
 J''DDWMMJ 0022OAAtyAAAL"
#Fl#Fo#FGGJJ/@/G/G/I/IJJJJJJJJ..t5FGGO0A0P0P0R0RSSS "  O &o66Ow00000r   c                 D   t                      }| j        j        }t                      }| j        j        D ]k}|j        dv r&|                    ||j                 j                   1|j        dk    r/|j	        D ]'}|                    ||j                 j                   (l|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
  |z  }|r4d                    fd|D                       }t          d| d          d S )N)r   r	   r
   r   r	   z, c              3   4   K   | ]}d | d|          V  dS )'z': Nr   )r'   i
axisCoordss     r   rL   z'checkAxisValuesExist.<locals>.<genexpr>   s8      KK!555jm55KKKKKKr   zCannot find Axis Values {})setr1   r2   r4   r5   Formatadd	AxisIndexAxisTagAxisValueRecordNominalValueValuejoinre   )r<   
axisValuesrx   seen
designAxes	hasValuesr=   recaxisValueTableaxisValueFormatrW   	axisValuemissingAxesmissings     `           r   rj   rj      s   55D&+JI$. A A<9$$MM*U_5=>>>>\Q, A Aj7?@@@@$ & &(/ I-- !9:BG!##*7		*0	*$$j6I)I)I!!!"a''%5 & &$S]3;j((SY*W:M-M-MHHW%%%z??T)Y6K C))KKKK{KKKKKAgAAABBBC C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   )r{   r`   s     r   rF   z#_sortAxisValues.<locals>.<listcomp>   s    000q!(a-----r   c                 *    t          | j                  S r]   )lenr   )ra   s    r   <lambda>z!_sortAxisValues.<locals>.<lambda>   s    c!+,, r   T)keyreversec              3   $   K   | ]}|j         V  d S r]   )r}   r'   rs     r   rL   z"_sortAxisValues.<locals>.<genexpr>   s$      CC!!+CCCCCCr   c                     g | ]\  }}|S r   r   )r'   _r   s      r   rF   z#_sortAxisValues.<locals>.<listcomp>   s    :::,!YI:::r   )rz   sortedr   minr+   r}   r|   )r   resultsseenAxesformat4valaxisIndexesminIndex	axisIndexs           r   rl   rl      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 )NrG   r#   c                     g | ]	}|j         
S r   )r6   rY   s     r   rF   z&_updateNameRecords.<locals>.<listcomp>   s    :::!:::r   c                 4    g | ]}t          |          |S r   )_isRibbi)r'   n	nametables     r   rF   z&_updateNameRecords.<locals>.<listcomp>   s(    JJJ!8Iq3I3IJAJJJr   c                     g | ]}|v|	S r   r   )r'   r   ribbiNameIDss     r   rF   z&_updateNameRecords.<locals>.<listcomp>   s#    LLLQa|6K6Kq6K6K6Kr   c              3   >   K   | ]}|j         |j        |j        fV  d S r]   )rJ   	platEncIDrK   r   s     r   rL   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'   rw   getNameplatforms     r   rL   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   rL   z%_updateNameRecords.<locals>.<genexpr>   sR       !
 !
23GGA!!!!++--!
 !
 !
 !
 !
 !
r   c              3   N   K   | ]} |gR                                   V   d S r]   r   r   s     r   rL   z%_updateNameRecords.<locals>.<genexpr>   sR       ) )67%H%%%//11) ) ) ) ) )r   c              3   N   K   | ]} |gR                                   V   d S r]   r   r   s     r   rL   z%_updateNameRecords.<locals>.<genexpr>   sR       $
 $
23GGA!!!!++--$
 $
 $
 $
 $
 $
r   )
r0   r$   r   r   rz   rO   rh   r   r   _updateNameTableStyleRecords)r8   r   r<   axisValueNameIDsnonRibbiNameIDselidedNameIDelidedNameIsRibbi	platformssubFamilyNametypoSubFamilyNamefamilyNameSuffixr   r   r   r   s              @@@@r   rm   rm      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 )NrG   z.Missing required NameIDs 1 and 2 for platform r   r   rC   r!   )r   r   r   r   r   r   rh   re   r   stripremoveNamesgetr   _updatePSNameRecordr   _updateUniqueIdNameRecordr   itemssetNamer   )r8   r   r   r   rJ   r   rK   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 )NrG   -z[^A-Za-z0-9-]rM      |   z...)r   r   r   r   resubr   )r8   
familyName	styleNamer   r   family_prefixpsNames          r   r   r   J  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 )NrG   zOS/2z[^\x00-\x7F]rM   ;)r   r   r   r   r   r   replacer(   _fontVersion	achVendIDr   r   r   )r8   r   r   r   currentRecordr(   
nameRecordfontVersionr   vendorr   s              r   r   r   d  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 )NrG   headz.3fr   r   zVersion )r   r   r   fontRevisionr   splitlstripr   )fontr   r   versionNumbers       r   r   r   }  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   rd   r?   rR   rs   rj   rl   rm   r   r   r   r   r   r   r   r   <module>r      s\   3 3 % % % % % %             					+ 	+ 	+ 	+ 	+W 	+ 	+ 	+  7 7 7.      2:1 :1 :1zC C CB; ; ;D/
 /
 /
d   BH BH BH BHJ  4. . .24 4 4 4 4 4r   