o
    hL(                     @   s
  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dZdededefddZG dd de	ZeddG dd deZeddG dd deZi ejdfe gejdfedd gej dfed!d gej!d"fed#d$d%gej dfe gej"dfed&d gej#dfed'd(d)ed*d+d)gej$dfed'd(d)ed,d-d)gej%dfed.d/d)ed0d1d)gej&dfed2d gej&dfe gej&d3fe gej'dfed4d gej'dfe gej'd3fed5d6ed7d6ed8d6gej(dfed9d gej(dfe gej(d3fe gej)dfed:d gej)dfe gej)d3fed5d6ed7d6ed8d6gej*dfed;d ed5d6ed8d6gej+d"fed<d gej,d"fed=d gej-d"fe gej.d"fed>d6gej/d"fed?d gej0d"fed@dAd)gej1d"fedBdCd)gej2d"fedDdEd)edFdGd)giZ3eej4j5dHf Z6dIej4dJedee6 fdKdLZ7eee6 ee6 gd"f Z8dIej4dJedMe8dee6 fdNdOZ9dPej:dQee fdRdSZ;d"S )Tz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                    sd   |r$t dd t||D  fddd}ttt| \}}||d d < nt | d}||d d < d S )Nc                 s   s    | ]	\}}||fV  qd S N ).0ger   r   q/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/fontTools/ttLib/reorderGlyphs.py	<genexpr>$   s    z_sort_by_gid.<locals>.<genexpr>c                    s    | d S )Nr   r   )tr   r   r   <lambda>%   s    z_sort_by_gid.<locals>.<lambda>key)sortedzipmaplist)r   r   r   	reorderedsorted_glyphssorted_parallel_listr   r   r   _sort_by_gid   s   
r'   valuedotted_attrreturnc                 C   s2   | d}|s	J |r|d}t| |} |s| S )N.r   )splitpopgetattr)r(   r)   
attr_names	attr_namer   r   r   _get_dotted_attr/   s   


r1   c                   @   s.   e Zd ZdZedejdejddfddZ	dS )ReorderRulezEA rule to reorder something in a font to match the fonts glyph order.fontr(   r*   Nc                 C   s   d S r   r   )selfr3   r(   r   r   r   apply<   s   zReorderRule.apply)
__name__
__module____qualname____doc__r   r   TTFontr   	BaseTabler5   r   r   r   r   r2   9   s     r2   T)frozenc                   @   sH   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d	ZdS )
ReorderCoveragezNReorder a Coverage table, and optionally a list that is sorted parallel to it.Nparallel_list_attrcoverage_attrr3   r(   r*   c                 C   s   t || j}t|tur<d }| jr2t || j}t|tu s%J | j dt|t|jks2J dt|j|j| d S | jrFJ d|  |D ]
}t|j|jd  qHd S )N should be a listzNothing makes sensez2Can't have multiple coverage AND a parallel list; )	r1   r?   typer#   r>   lenr   r'   
getGlyphID)r4   r3   r(   coverager   coverage_entryr   r   r   r5   H   s"   
zReorderCoverage.apply)r6   r7   r8   r9   r>   r	   str__annotations___COVERAGE_ATTRr?   r   r:   r   r;   r5   r   r   r   r   r=   @   s
   
 r=   c                   @   s<   e Zd ZU dZeed< eed< dejdej	ddfdd	Z
dS )
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   r3   r(   r*   Nc                    s@   t |j}t|tsJ j d|j fddd d S )Nr@   c                    s     t| jS r   )rC   r.   r   )vr3   r4   r   r   r   n   s    z#ReorderList.apply.<locals>.<lambda>r   )r1   rJ   
isinstancer#   sort)r4   r3   r(   lstr   rL   r   r5   k   s   zReorderList.apply)r6   r7   r8   r9   rF   rG   r   r:   r   r;   r5   r   r   r   r   rI   `   s
   
 rI         Value)r>   PairSetNPairValueRecordSecondGlyphr   EntryExitRecordMarkCoveragezMarkArray.MarkRecord)r?   r>   BaseCoveragezBaseArray.BaseRecordLigatureCoveragezLigatureArray.LigatureAttachMark1CoveragezMark1Array.MarkRecordMark2CoveragezMark2Array.Mark2Record
PosRuleSet   ChainPosRuleSetBacktrackCoverage)r?   InputCoverageLookAheadCoverage
SubRuleSetChainSubRuleSet
SubstituteAttachPointLigGlyphExtendedShapeCoverageItalicsCorrectionTopAccentCoverageTopAccentAttachmentMathKernCoverageMathKernInfoRecordsVertGlyphCoverageVertGlyphConstructionHorizGlyphCoverageHorizGlyphConstruction.rootroot_accessorc                 c   s    t | |dd E d H  d S )Nc                 S   s
   |  |S r   )extend)frontiernewr   r   r   r      s   
 z!_bfs_base_table.<locals>.<lambda>)_traverse_ot_data)rq   rr   r   r   r   _bfs_base_table   s   
rw   add_to_frontier_fnc                 c   sr    t  }|tj|| f |r7| }|d j}|V  g }| D ]
}|||f  q#||| |sd S d S )N)r   appendr   r;   SubTableEntrypopleftr(   iterSubTables)rq   rr   rx   rt   pathcurrentnew_entriessubtable_entryr   r   r   rv      s   

rv   r3   new_glyph_orderc                    s|    }t|t|krtdt| dt| dt|t|kr9tdt|t|  dt|t|    tfdd D }|rStd| | h d	}|D ]5}| v rt| j	d
| dD ] }|d j
}t|t|dd f}t|g D ]}	|	| qqrq^dv rd }
|
jjd jj ||
jjd _ fdd|D |
jjd j_d S d S )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   s    | ]
}  |s|V  qd S r   )isLoaded)r   r   )r3   r   r   r     s    z reorderGlyphs.<locals>.<genexpr>z/Everything should be loaded, following aren't: >   GDEFGPOSGSUBMATHzfont["z"]ry   FormatzCFF r   c                    s   i | ]}|  |qS r   )get)r   k)charstringsr   r   
<dictcomp>  s    z!reorderGlyphs.<locals>.<dictcomp>)getGlyphOrderrB   
ValueErrorsetensureDecompiledr    keyssetGlyphOrderrw   tabler(   rA   r.   _REORDER_RULESr   r5   cfftopDictIndexCharStringscharStringscharset)r3   r   old_glyph_order
not_loadedcoverage_containerstagr~   r(   reorder_keyreorder	cff_tabler   )r   r3   r   reorderGlyphs   sL   	


r   )<r9   
__author__	fontToolsr   fontTools.ttLib.tablesr   r   otabcr   r   dataclassesr   collectionsr   typingr	   r
   r   r   r   r   r   rH   rF   intr'   r1   r2   r=   rI   	SinglePosPairPosrS   
CursivePosMarkBasePos
MarkLigPosMarkMarkPos
ContextPosChainContextPosContextSubstChainContextSubstReverseChainSingleSubst
AttachListLigCaretListMarkGlyphSetsDefMathGlyphInfoMathItalicsCorrectionInfoMathTopAccentAttachmentMathKernInfoMathVariantsr   r;   r{   SubTablePathrw   AddToFrontierFnrv   r:   r   r   r   r   r   <module>   s    $


!"#$%&,-.]
	
