
    gf:                         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y)z-Helpers for instantiating name table records.    )contextmanager)deepcopy)IntEnumNc                   0    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zy
)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     x/home/viktor/gitlab-persoonlijk/factuur-applicatie/venv/lib/python3.12/site-packages/fontTools/varLib/instancer/names.pyr   r   	   s3    KNNNO !#(*%r   r   r	   c                    g }d| v r| d   }|j                   D ]  }|j                  |j                          |j                  D ]H  }|j                  |j                         |j
                  dk7  s.|j                  |j
                         J d| v r| d   j                  }|j                  r|j                  j                  ndD ]  }|j                  |j                          |j                  r|j                  j                  ndD ]  }|j                  |j                          t        |dd       }||j                  |       |D ch c]
  }|dkD  s	| c}S c c}w )Nfvar  STATr   ElidedFallbackNameID   )axesappend
axisNameID	instancessubfamilyNameIDpostscriptNameIDtableDesignAxisRecordAxis
AxisNameIDAxisValueArray	AxisValueValueNameIDgetattr)	varfontusedr!   axisinstancestatvalueelidedFallbackNameIDnameIDs	            r   getVariationNameIDsr<      sB   DvII 	)DKK(	) 	7HKK001((F2H556	7 v$$262G2GD))..R 	)DKK(	)6:6I6IT((22r 	+EKK))*	+&t-CTJ+KK,-!%6v#F666s   
E E c              #   F  K   ddl m} t        |       }d  |j                  d       |t        |       z
  }| d   j                  D cg c]  }|j
                  |vs| c}| d   j                  d d  d| v r$t        d | d   j                  D              s| d= y y y c c}w w)Nr   )logzPruning name tablenameltagc              3   \   K   | ]$  }|j                   d k(  r|j                  dk7  r| & yw)r   r"   N)
platformIDlangID).0records     r   	<genexpr>z%pruningUnusedNames.<locals>.<genexpr>A   s1      
  A%&--6*A 
s   *,) r>   r<   infonamesr;   any)r4   r>   origNameIDsexcluderE   s        r   pruningUnusedNamesrM   /   s     %g.K	HH!"/88G$V_22 fmm76R GFO! 
  
!&///
 

 
  s   AB!BB AB!c                 ^   ddl m}m} d| vrt        d      | d   j                  }|j
                  st        d      | d   } ||      j                  |       }|j                         }|j                  D ci c]  }|j                  |j                   }} |i ||      }	t        d |	j                         D              sJ  |||	      }
t        ||
|	j                                |
D cg c]  }|j                  t         z  r| }
}t#        |
      }
t%        | |
       yc c}w c c}w )	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              3   N   K   | ]  }|j                   |j                  k(    y wN)minimummaximum)rD   vs     r   rF   z"updateNameTable.<locals>.<genexpr>y   s     J!qyyAII%Js   #%N)rG   rO   rP   
ValueErrorr,   r0   limitAxesAndPopulateDefaultsdefaultLocationr&   axisTagdefaultValueallvaluescheckAxisValuesExistpinnedLocationFlagsELIDABLE_AXIS_VALUE_NAME_sortAxisValues_updateNameRecords)r4   
axisLimitsrO   rP   r8   r!   partialDefaultsafvarDefaultsdefaultAxisCoordsaxisValueTablesrU   s               r   updateNameTableri   I   s2   @ 7WQRR6?  DWXX6?D
 J'DDWMJ 002O7;yyA!AIIq~~-ALA"#Fl#Fo#FGJ/@/G/G/IJJJJ.t5FGO0A0P0P0RS #!''4L*LO  &o6Ow0 Bs   8D%.D*D*c                    t               }| j                  j                  }t               }| j                  j                  D ]  }|j
                  dv r)|j                  ||j                     j                         :|j
                  dk(  sJ|j                  D ]*  }|j                  ||j                     j                         ,  |D ]  }|j
                  }	|j
                  dv rW||j                     j                  }
|	dk(  r|j                  }n|j                  }|
v sY||
   k(  sb|j                  |
       t|j
                  dk(  s|j                  D ]D  }||j                     j                  }
|
v s!|j                  |
   k(  s4|j                  |
       F  t              |z
  |z  }|r)dj                  fd|D              }t        d| d      y )N)r   r	   r
   r   r	   z, c              3   4   K   | ]  }d | d|      yw)'z': Nr   )rD   i
axisCoordss     r   rF   z'checkAxisValuesExist.<locals>.<genexpr>   s"     K!as#jm_5Ks   zCannot find Axis Values {})setr-   r.   r0   r1   Formatadd	AxisIndexAxisTagAxisValueRecordNominalValueValuejoinrV   )r8   
axisValuesrn   seen
designAxes	hasValuesr9   recaxisValueTableaxisValueFormatrY   	axisValuemissingAxesmissings     `           r   r]   r]      s   5D&&++JI$$.. A<<9$MM*U__5==>\\Q,, Aj7??@A	A % &(//  I- !9!9:BBG!#*77	*00	*$j6I)I!""a'%55 &$S]]3;;j(SYY*W:M-MHHW%&&  z?T)Y6K))K{KK5gYbABB r   c                    g }t               }t        | D cg c]  }|j                  dk(  s| c}d d      }|D ]G  }t        d |j                  D              }t	        |      }||z  r0||z  }|j                  ||f       I | D ]<  }||v r|j                  }||vs|j                  |       |j                  ||f       > t        |      D 	
cg c]  \  }	}
|
	 c}
}	S c c}w c c}
}	w )Nr   c                 ,    t        | j                        S rR   )lenru   )rU   s    r   <lambda>z!_sortAxisValues.<locals>.<lambda>   s    c!++, r   T)keyreversec              3   4   K   | ]  }|j                     y wrR   )rs   rD   rs     r   rF   z"_sortAxisValues.<locals>.<genexpr>   s     C!!++Cs   )rp   sortedrq   ru   minr'   rs   rr   )ry   resultsseenAxesrU   format4valaxisIndexesminIndex	axisIndex_r   s              r   ra   ra      s     GuH0q!((a-0,G  ,Cs/B/BCC{#+%#HNNHc?+,  -'>MM	H$LL#NNIs+,- +1/:,!YI::) 	1( ;s   C%C%C*c                    | d   }| d   j                   }|D cg c]  }|j                   }}|D cg c]  }t        ||      s| }}|D cg c]	  }||vs| }}|j                  }	t        ||	      }
|j                  t        d |j                  D              }|D ]  t        fddd|	fD              sdj                  fd|D              }|rdj                  fd	|D              }nd }|s3|s1|
r |	g j                         }n |	g j                         }dj                  fd
|D              }t        | |||g   y c c}w c c}w c c}w )Nr?   r#   c              3   b   K   | ]'  }|j                   |j                  |j                  f ) y wrR   )rB   	platEncIDrC   r   s     r   rF   z%_updateNameRecords.<locals>.<genexpr>   s#     SaQ\\1;;9Ss   -/c              3   0   K   | ]  } |g   y wrR   r   )rD   rm   getNameplatforms     r   rF   z%_updateNameRecords.<locals>.<genexpr>   s     GQ71(x(Gs   r   r	    c              3   L   K   | ]  } |g j                           y wrR   	toUnicoderD   nr   r   s     r   rF   z%_updateNameRecords.<locals>.<genexpr>   s)      !
23GA!!++-!
   !$c              3   L   K   | ]  } |g j                           y wrR   r   r   s     r   rF   z%_updateNameRecords.<locals>.<genexpr>   s)      )67%H%//1)r   c              3   L   K   | ]  } |g j                           y wrR   r   r   s     r   rF   z%_updateNameRecords.<locals>.<genexpr>   s)      $
23GA!!++-$
r   )r,   r2   _isRibbir$   r   rp   rI   r[   rx   r   _updateNameTableStyleRecords)r4   ry   	nametabler8   re   axisValueNameIDsr   ribbiNameIDsnonRibbiNameIDselidedNameIDelidedNameIsRibbi	platformssubFamilyNametypoSubFamilyNamefamilyNameSuffixr   r   s                  @@r   rb   rb      s   I6?  D/9:!::/J!8Iq3IAJLJ"2LQa|6KqLOL,,L L9GS9??SSI "
G1a2FGG  !
7C!
 
  # );K) ! !% !  ' @x @ J J L$+L$D8$D$N$N$P!88 $
7F$
 
 	%		

 	
9"
 ;JLs   EE E 	E%E%c                 Z    | j                  |ddd      }||j                         dv rdS dS )Nr
   r   	  )RegularItalicBoldzBold ItalicTF)r   r   )r   r;   englishRecords      r   r   r      sF    %%faE:M $##%)UU 	 	r   c                 *   | d   }|||f} |j                   t        j                  g| xs!  |j                   t        j                  g| }	 |j                   t        j                  g| xs!  |j                   t        j
                  g| }
t        |	|
g      st        d|       |	j                         }	|
j                         }
t        j                  |	t        j
                  |xs di}|rM|	 d| j                         |t        j                  <   |	|t        j                  <   ||t        j                  <   n7t        j                  t        j                  fD ]  }|j                  |        |j                  t        j                        xs |t        j                     }|j                  t        j                        xs |t        j
                     }| d| |t        j                  <   t        | |||      |t        j                  <   t        | ||      }|r||t        j                   <   |j#                         D ]"  \  }}|sJ |        |j$                  ||g|  $ d| vr |j                  t        j&                         y y )Nr?   z.Missing required NameIDs 1 and 2 for platform r   r   )r;   r!   )r   r   r   r   r   r   r[   rV   r   stripremoveNamesgetr   _updatePSNameRecordr   _updateUniqueIdNameRecordr   itemssetNamer   )r4   r   r   r   rB   r   rC   r   r   currentFamilyNamecurrentStyleNamenameIDsr;   newFamilyNamenewStyleNameuniqueIDstrings                    r   r   r     s    IIv.H)	))&&)1 :			6--	9	9  )y(()),4 =			600	<8	<  !#345I(TUU)335'113 	-}9	G ):(;1=M<N&O&U&U&W""#2C../5F112
 **--
 	1F !!!0		1 	F223Rwv?Q?Q7R  	F556X'&BWBW:X  )6a~%FGF!!"&9h'GF""# )'8DH19--.!--/ 5vv	&&4845 WfFFG r   c                     | d   } |j                   t        j                  g| }|r|j                         }n|}| d| }t	        j
                  dd|      }t        |      dkD  r|d d  dS |S )Nr?   -z[^A-Za-z0-9-]rG      |   z...)r   r   r   r   resubr   )r4   
familyName	styleNamer   r   family_prefixpsNames          r   r   r   J  s     I%I%%003;M %//1"a	{+F VV$c62F
6{S #,s##Mr   c                 >   | d   } |j                   t        j                  g| }|sy t        j                  t        j                  fD ]u  } |j                   |g| }|s|j                         |j                         v s:|j                         j                  |j                         ||j                           c S  t        | |      }| d   j                  }t        j                  dd|      j                         }	|t        j                     }
| d|	 d|
 S )Nr?   zOS/2z[^\x00-\x7F]rG   ;)r   r   r   r   r   r   replacer;   _fontVersion	achVendIDr   r   r   )r4   r   r   r   currentRecordr;   
nameRecordfontVersionr   vendorr   s              r   r   r   d  s   I%I%%f&C&COhOM ((&*@*@A &Y&&v99
!]%<%<%>> **,44$$&
0A0A(B  w1K))IVVOR399;FV++,F]!F81VH--r   r
   r   r   c                      | d   j                   t        j                  g| }|| d   j                  dS |j	                         j                  d      d   }|j                  d      j                         S )Nr?   headz.3fr   r   zVersion )r   r   r   fontRevisionr   splitlstripr   )fontr   r   versionNumbers       r   r   r   }  sx    %f%%f&;&;GhGJv,++C01 ((*005a8M
+1133r   )r   )__doc__
contextlibr   copyr   enumr   r   r   r`   r<   rM   ri   r]   ra   rb   r   r   r   r   r   r   r   r   <module>r      s    3 %   		+W 	+  7.    2:1zCB;D/
d BHJ4.24r   