L i(dZdZddlmZddlmZddlmZddlm Z m Z ddl m Z ddl mZdd lmZmZmZmZmZmZmZd Zd eegefd eed eeefdZdededefdZGdde Ze dGddeZe dGddeZiej>dfegej>dfedgej@dfedgejBd fed!d"#gej@dfegejDdfed$gejFdfed%d&'ed(d)'gejHdfed%d&'ed*d+'gejJdfed,d-'ed.d/'gejLdfed0gejLdfegejLd1fegejNdfed2gejNdfegejNd1fed34ed54ed64gejPdfed7gejPdfegejPd1fegejRdfed8gejRdfegejRd1fed34ed54ed64gejTdfed9ed34ed64gejVd fed:gejXd fed;gejZd fegej\d fed<4gej^d fed=gej`d fed>d?'gejbd fed@dA'gejdd fedBdC'edDdE'gi Z3eejhjjdFfZ6dGejhdHedee6fdIZ7eee6ee6gd fZ8dGejhdHedJe8dee6fdKZ9dLejtdMeefdNZ;y )OzReorder glyphs in a font.z Rod Sheeter)ttLib)otBase)otTables)ABCabstractmethod) dataclass)deque)OptionalAnyCallableDequeIterableListTupleCoverage get_glyph_idglyphs parallel_listc|r@tdt||Dfd}ttt|\}}||ddn t|}||ddy)Nc3*K|] \}}||f ywN).0ges c/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/fontTools/ttLib/reorderGlyphs.py z_sort_by_gid..$s ;1aV ;sc|dS)Nrr)trs rz_sort_by_gid..%s,qt,key)sortedzipmaplist)rrr reordered sorted_glyphssorted_parallel_lists` r _sort_by_gidr+s[  ;FM : ;, /2$Y.H+ +/ av<8 F1Ir!value dotted_attrreturnct|jd}|sJ|r |jd}t||}|r |S)N.r)splitpopgetattr)r,r- attr_names attr_names r_get_dotted_attrr6/sC""3'J : NN1% y)  Lr!cVeZdZdZedej dejddfdZ y) ReorderRulezEA rule to reorder something in a font to match the fonts glyph order.fontr,r.Ncyrr)selfr9r,s rapplyzReorderRule.apply<sJMr!) __name__ __module__ __qualname____doc__rrTTFontr BaseTabler<rr!rr8r89s,OM%,,Mv/?/?MDMMr!r8T)frozencpeZdZUdZdZeeed<eZ eed<de jde jddfdZy) ReorderCoveragezNReorder a Coverage table, and optionally a list that is sorted parallel to it.Nparallel_list_attr coverage_attrr9r,r.ct||j}t|turd}|jrct||j}t|tusJ|jdt |t |j k(sJdt|j|j |y|jr Jd||D]#}t|j|j d%y)N should be a listzNothing makes sensez2Can't have multiple coverage AND a parallel list; ) r6rGtyper'rFlenrr+ getGlyphID)r;r9r,coveragercoverage_entrys rr<zReorderCoverage.applyHs#E4+=+=> > % M&& 08O8O P '4/A--..?@A/=)S-AAXCXXA (//= I ++ KCD6J K+"* KT__n.C.CTJ Kr!)r=r>r?r@rFr str__annotations___COVERAGE_ATTRrGrrArrBr<rr!rrErE@sHX)- ,'M3'K%,,Kv/?/?KDKr!rEcbeZdZUdZeed<eed<dejdejddfdZ y) ReorderLista7Reorder 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#r9r,r.Nct|j}t|tsJjd|j fdy)NrIcNjt|jSr)rLr3r#)vr9r;s rr z#ReorderList.apply..nstwq$((/CDr!r")r6rT isinstancer'sort)r;r9r,lsts`` rr<zReorderList.applyksDudnn5#t$J(88I&JJ$ DEr!) r=r>r?r@rOrPrrArrBr<rr!rrSrS`s; N HF%,,Fv/?/?FDFr!rSValue)rFPairSetNPairValueRecord SecondGlyphr"EntryExitRecord MarkCoveragezMarkArray.MarkRecord)rGrF BaseCoveragezBaseArray.BaseRecordLigatureCoveragezLigatureArray.LigatureAttach Mark1CoveragezMark1Array.MarkRecord Mark2CoveragezMark2Array.Mark2Record PosRuleSetChainPosRuleSetBacktrackCoverage)rG InputCoverageLookAheadCoverage SubRuleSetChainSubRuleSet Substitute AttachPointLigGlyphExtendedShapeCoverageItalicsCorrectionTopAccentCoverageTopAccentAttachmentMathKernCoverageMathKernInfoRecordsVertGlyphCoverageVertGlyphConstructionHorizGlyphCoverageHorizGlyphConstruction.root root_accessorc#<Kt||dEd{y7w)Nc$|j|Sr)extend)frontiernews rr z!_bfs_base_table..s8??33Gr!)_traverse_ot_data)r|r}s r_bfs_base_tablers"! mGs add_to_frontier_fnc#<Kt}|jtjj ||f|r\|j }|dj }|g}|jD]}|j||fz||||r[yyw)N)r appendrrB SubTableEntrypopleftr, iterSubTables)r|r}rrpathcurrent new_entriessubtable_entrys rrrs %*GH OOV%%33M4HJK !r(..  %335 9N   t~&77 8 9 8[1 s BBBr9new_glyph_orderc \j}t|t|k7r$tdt|dt|dt|t|k7r;tdt|t|z dt|t|z j t fdj D}|rtd|j|hd}|D]}|j vst|jd |d D]V}|d j}t|t|d df}tj|gD]} | j|Xd D]}|vs|} | j j"dj$j&} || j j"d_|D cic]} | | j| c} | j j"dj$_ycc} w)NzNew 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: c3FK|]}j|r|ywr)isLoaded)rrr9s rrz reorderGlyphs..sGadmmA6FGs!!z/Everything should be loaded, following aren't: >GDEFGPOSGSUBMATHzfont["z"]rFormat)zCFF CFF2r) getGlyphOrderrK ValueErrorsetensureDecompiledr$keys setGlyphOrderrtabler,rJr3_REORDER_RULESgetr<cff topDictIndex CharStrings charStringscharset) r9rold_glyph_order not_loadedcoverage_containerstagrr, reorder_keyreorder cff_table charstringsks ` r reorderGlyphsrs+((*O ?s?33'O(<'=>01 :   ?s?33 !/2S5IIJK!/2S5IIJ L   G499;GGJJ:,WXX':"/ $))+ 'S 6#b9IJ /R#E{GE8T,JK -11+rB/GMM$./ //  $;S I#--44Q7CCOOK4CIMM & &q ) 1/>E*+;??1%%EIMM & &q ) 5 5 A  Es$H))rs  )1#!C5#:& IDI&$CccN#N $KkKK> $ F+ F F$X\\1)*X\\17CDXZZOoCD X ZZ%6MJK X ZZOo'( X]]AU  )>V 3XB]]ALIJCXD]]A*+EXF]]A*+GXHoARSTIXJo/0KXL&9:o6&9:MXX__a?lKLYXZ__a?,-[X\__a?,-1CT UV1 121&9:o6&9:  #<8&9:&9:& ]]DO}MN__doLM$/"3!4t=TUV!!4(+>?+&-BW ) __d,AV  __d-6  .7 ]XzV%%33S89    +. lE,/l1CDdJK2   2+.2DS2 l2*) )tCy)r!