
    McgL(                        d Z dZddlmZ ddlmZ ddlmZ ddlm	Z	m
Z
 ddlmZ ddlmZ dd	lmZmZmZmZmZmZmZ d
Zdeegef   dee   deee      fdZdededefdZ G d de	      Z ed       G d de             Z ed       G d de             Zi ej>                  df e       gej>                  df ed      gej@                  df ed      gejB                  d f ed!d"#      gej@                  df e       gejD                  df ed$      gejF                  df ed%d&'       ed(d)'      gejH                  df ed%d&'       ed*d+'      gejJ                  df ed,d-'       ed.d/'      gejL                  df ed0      gejL                  df e       gejL                  d1f e       gejN                  df ed2      gejN                  df e       gejN                  d1f ed34       ed54       ed64      gejP                  df ed7      gejP                  df e       gejP                  d1f e       gejR                  df ed8      gejR                  df e       gejR                  d1f ed34       ed54       ed64      gejT                  df ed9       ed34       ed64      gejV                  d f ed:      gejX                  d f ed;      gejZ                  d f e       gej\                  d f ed<4      gej^                  d f ed=      gej`                  d f ed>d?'      gejb                  d f ed@dA'      gejd                  d f edBdC'       edDdE'      giZ3eejh                  jj                  dFf   Z6dGejh                  dHedee6   fdIZ7eee6   ee6   gd f   Z8dGejh                  dHedJe8dee6   fdKZ9dLejt                  dMee   fdNZ;y )OzReorder glyphs in a font.zRod Sheeter    )ttLib)otBase)otTables)ABCabstractmethod)	dataclass)deque)OptionalAnyCallableDequeIterableListTupleCoverageget_glyph_idglyphsparallel_listc                      |r@t        d t        ||      D         fd      }t        t        t        |       \  }}||d d  nt        |       }||d d  y )Nc              3   *   K   | ]  \  }}||f  y wN ).0ges      X/var/www/html/bid-api/venv/lib/python3.12/site-packages/fontTools/ttLib/reorderGlyphs.py	<genexpr>z_sort_by_gid.<locals>.<genexpr>$   s     ; :1aV :s   c                      | d         S )Nr   r   )tr   s    r   <lambda>z_sort_by_gid.<locals>.<lambda>%   s    ,qt,    key)sortedzipmaplist)r   r   r   	reorderedsorted_glyphssorted_parallel_lists   `     r   _sort_by_gidr+      s[    
 ;FM :;,
	 /2$Y.H++/av<8F1Ir!   valuedotted_attrreturnc                 t    |j                  d      }|sJ |r |j                  d      }t        | |      } |r | S )N.r   )splitpopgetattr)r,   r-   
attr_names	attr_names       r   _get_dotted_attrr6   /   sC    ""3'J:
NN1%	y)  Lr!   c                   V    e Zd ZdZedej                  dej                  ddfd       Z	y)ReorderRulezEA rule to reorder something in a font to match the fonts glyph order.fontr,   r.   Nc                      y r   r   )selfr9   r,   s      r   applyzReorderRule.apply<   s    JMr!   )
__name__
__module____qualname____doc__r   r   TTFontr   	BaseTabler<   r   r!   r   r8   r8   9   s,    OM%,,Mv/?/?MDM Mr!   r8   T)frozenc                   p    e Zd ZU dZdZee   ed<   eZ	eed<   de
j                  dej                  ddfdZy)	ReorderCoveragezNReorder a Coverage table, and optionally a list that is sorted parallel to it.Nparallel_list_attrcoverage_attrr9   r,   r.   c                    t        || j                        }t        |      t        urd }| j                  rct        || j                        }t        |      t        u sJ | j                   d       t        |      t        |j                        k(  sJ d       t        |j                  |j                  |       y | j                  r
J d|         |D ]#  }t        |j                  |j                  d        % y )N should be a listzNothing makes sensez2Can't have multiple coverage AND a parallel list; )	r6   rG   typer'   rF   lenr   r+   
getGlyphID)r;   r9   r,   coverager   coverage_entrys         r   r<   zReorderCoverage.applyH   s    #E4+=+=>>% M&& 08O8O P'4/A--..?@A/=)S-AAXCXXA(//=I
 ++KCD6JK+"*T__n.C.CTJ #+r!   )r=   r>   r?   r@   rF   r
   str__annotations___COVERAGE_ATTRrG   r   rA   r   rB   r<   r   r!   r   rE   rE   @   sH    X )-,'M3'K%,, Kv/?/? KD Kr!   rE   c                   b    e Zd ZU dZeed<   eed<   dej                  dej                  ddfdZ
y)	ReorderLista7  Reorder the items within a list to match the updated glyph order.

    Useful when a list ordered by coverage itself contains something ordered by a gid.
    For example, the PairSet table of https://docs.microsoft.com/en-us/typography/opentype/spec/gpos#lookup-type-2-pair-adjustment-positioning-subtable.
    	list_attrr#   r9   r,   r.   Nc                      t        | j                        }t        |t              sJ  j                   d       |j	                   fd       y )NrI   c                 N    j                  t        | j                              S r   )rL   r3   r#   )vr9   r;   s    r   r    z#ReorderList.apply.<locals>.<lambda>n   s    twq$((/CDr!   r"   )r6   rT   
isinstancer'   sort)r;   r9   r,   lsts   ``  r   r<   zReorderList.applyk   sD    udnn5#t$J(88I&JJ$DEr!   )r=   r>   r?   r@   rO   rP   r   rA   r   rB   r<   r   r!   r   rS   rS   `   s;     N	HF%,, Fv/?/? FD Fr!   rS         Value)rF   PairSetNPairValueRecordSecondGlyphr"   EntryExitRecordMarkCoveragezMarkArray.MarkRecord)rG   rF   BaseCoveragezBaseArray.BaseRecordLigatureCoveragezLigatureArray.LigatureAttachMark1CoveragezMark1Array.MarkRecordMark2CoveragezMark2Array.Mark2Record
PosRuleSet   ChainPosRuleSetBacktrackCoverage)rG   InputCoverageLookAheadCoverage
SubRuleSetChainSubRuleSet
SubstituteAttachPointLigGlyphExtendedShapeCoverageItalicsCorrectionTopAccentCoverageTopAccentAttachmentMathKernCoverageMathKernInfoRecordsVertGlyphCoverageVertGlyphConstructionHorizGlyphCoverageHorizGlyphConstruction.rootroot_accessorc              #   <   K   t        | |d       E d {    y 7 w)Nc                 $    | j                  |      S r   )extend)frontiernews     r   r    z!_bfs_base_table.<locals>.<lambda>   s    8??33Gr!   )_traverse_ot_data)r|   r}   s     r   _bfs_base_tabler      s"      !mG  s   add_to_frontier_fnc              #   <  K   t               }|j                  t        j                  j	                  ||       f       |r\|j                         }|d   j                  }| g }|j                         D ]  }|j                  ||fz            |||       |r[y y w)N)r	   appendr   rB   SubTableEntrypopleftr,   iterSubTables)r|   r}   r   r   pathcurrentnew_entriessubtable_entrys           r   r   r      s     
 %*GHOOV%%33M4HJK
!r(..
%335Nt~&778 6 	8[1 s   BBBr9   new_glyph_orderc           	      N     j                         }t        |      t        |      k7  r$t        dt        |       dt        |       d      t        |      t        |      k7  r;t        dt        |      t        |      z
   dt        |      t        |      z
          j	                          t         fd j                         D              }|rt        d|        j                  |       h d}|D ]  }| j                         v st         |   j                  d	| d
      D ]V  }|d   j                  }t        |      t        |dd       f}t        j                  |g       D ]  }	|	j                   |        X  d v r d   }
|
j                   j"                  d   j$                  j&                  }||
j                   j"                  d   _        |D ci c]  }||j                  |       c}|
j                   j"                  d   j$                  _        y y c c}w )NzNew glyph order contains z glyphs, but font has z glyphszTNew glyph order does not contain the same set of glyphs as the font:
* only in new: z
* only in old: c              3   F   K   | ]  }j                  |      r|  y wr   )isLoaded)r   r   r9   s     r   r   z reorderGlyphs.<locals>.<genexpr>  s     G;admmA6F;s   !!z/Everything should be loaded, following aren't: >   GDEFGPOSGSUBMATHzfont["z"]r   FormatzCFF r   )getGlyphOrderrK   
ValueErrorsetensureDecompiledr$   keyssetGlyphOrderr   tabler,   rJ   r3   _REORDER_RULESgetr<   cfftopDictIndexCharStringscharStringscharset)r9   r   old_glyph_order
not_loadedcoverage_containerstagr   r,   reorder_keyreorder	cff_tablecharstringsks   `            r   reorderGlyphsr      s   ((*O
?s?33'O(<'= >01:
 	

 ?s?33!/2S5IIJ K!/2S5IIJL
 	
 	G499;GGJJ:,WXX':"$))+'S	6#b9IJR#E{GE8T,JK-11+rBGMM$.  C K # ~L	mm003??KK0?	""1%-+:A
+:aA{q!!?A
	""1%11=	 A
s   H")<r@   
__author__	fontToolsr   fontTools.ttLib.tablesr   r   otabcr   r   dataclassesr   collectionsr	   typingr
   r   r   r   r   r   r   rQ   rO   intr+   r6   r8   rE   rS   	SinglePosPairPosr^   
CursivePosMarkBasePos
MarkLigPosMarkMarkPos
ContextPosChainContextPosContextSubstChainContextSubstReverseChainSingleSubst
AttachListLigCaretListMarkGlyphSetsDefMathGlyphInfoMathItalicsCorrectionInfoMathTopAccentAttachmentMathKernInfoMathVariantsr   rB   r   SubTablePathr   AddToFrontierFnr   rA   r   r   r!   r   <module>r      s   
  ) 1 # !    C5#:&I DI&$C c c N# N $Kk K K> $F+ F F$X\\1)*X \\17CDX ZZOoCD	X
 ZZ%6MJKX ZZOo'(X ]]A<MNOX ^^Q(=S	
 	(=S	
	X  ]]A(=S	
 	,=	
	!X2 ^^Q)>U	
 	)>V	
	3XB ]]ALIJCXD ]]A*+EXF ]]A*+GXH oARSTIXJ o/0KXL &9:o6&9:MXX __a?lKLYXZ __a?,-[X\ __a?,-1CT UV1 121&9:o6&9: 
 #<8&9:&9:& ]]DO}MN__doLM$/"3!4t=TUV!!4(+>?+ &-BW	
)
 __d,AV	

 __d-6	
 	.7	
	]Xz V%%33S89


+.l E,/l1CDdJK2


2+.2DS2l2*(
 (
tCy (
r!   