
    ]Mh
                        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 d dlmZmZ d d	lmZ d d
lZd d
lZ G d de          Z G d de          Z G d de          Z G d de          Z ej        d          Zd Zd Z d Z!d Z"d Z# G d de$          Z%dWdZ&dXdZ'd Z(dWdZ)dWdZ*dWd Z+dWd!Z,dWd"Z-dWd#Z.dWd$Z/ej0        fd%Z1dWd&Z2d' Z3d( Z4d) Z5d* Z6 G d+ d,e7          Z8 G d- d.e8          Z9 G d/ d0e8          Z: G d1 d2e8          Z;dWd3Z<dWd4Z=dWd5Z>d6 Z?d7 Z@ G d8 d9e7          ZAdWd:ZBejC        fd;ZDejE        fd<ZFejC        fd=ZGejC        fd>ZHd? ZIdWd@ZJdWdAZKdWdBZLdWdCZMdWdDZNdWdEZOdWdFZPdG ZQdH ZRdI ZSdJ ZTdK ZUdL ZVdM ZWdN ZXdO ZYdP ZZdWdQZ[ G dR dSe7          Z\dWdTZ]dXdUZ^e_dVk    rd d
l`Z` e`ja         e^                       d
S d
S )Y    )ttLib)cmap_classes)otTables)ValueRecordvalueRecordFormatDict)builder)contextmanager)newTable)LOOKUP_DEBUG_ENV_VARLOOKUP_DEBUG_INFO_KEY)setitemNc                       e Zd ZdS )MtiLibErrorN__name__
__module____qualname__     Y/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/fontTools/mtiLib/__init__.pyr   r              Dr   r   c                       e Zd ZdS )ReferenceNotFoundErrorNr   r   r   r   r   r      r   r   r   c                       e Zd ZdS )FeatureNotFoundErrorNr   r   r   r   r   r      r   r   r   c                       e Zd ZdS )LookupNotFoundErrorNr   r   r   r   r   r       r   r   r   zfontTools.mtiLibc                 <   | d d         dv r5t           j                            t          | dd          d                    S | d d         dk    rdt          | dd                    z  S |                     d          dk     sJ d| z              | s
J d	            | S )
N   )zU zu    z# z	glyph%.5d r   zSpace found in glyph name: %szGlyph name is empty)r   TTFont_makeGlyphNameintfind)ss    r   	makeGlyphr'   '   s    !u|**3qub>>:::	
2A2$S122ZZ''66#;;???;a????######Hr   c                     d | D             S )Nc                 ,    g | ]}t          |          S r   )r'   ).0gs     r   
<listcomp>zmakeGlyphs.<locals>.<listcomp>2   s    $$$QIaLL$$$r   r   )ls    r   
makeGlyphsr.   1   s    $$!$$$$r   c                 v    |'	 ||          }n,# t           $ r t          |           w xY wt          |           }|S N)KeyErrorr   r$   symmappingidxs      r   	mapLookupr6   5   sU     	+#,CC 	+ 	+ 	+%c***	+ #hhJs    'c                     	 t          |           }n7# t          $ r* 	 ||          }n# t          $ r t          |           w xY wY nw xY w|S r0   )r$   
ValueErrorr1   r   r2   s      r   
mapFeaturer9   B   sv    ,#hh , , ,	,#,CC 	, 	, 	,&s+++	, C,
 Js#    
A&AA  AAc                     	  | ||          }nI# t           $ r<}	 |"|                    fd||           Y d }~d S n# t          $ r Y nw xY w d }~ww xY w |           d S )Nc                      |           S r0   r   )ref
collectionkeysetters    r   <lambda>zsetReference.<locals>.<lambda>V   s    z3 < < r   )r   addDeferredMappingAttributeError)mapperr4   r3   r?   r=   r>   mappedes      ```  r   setReferencerF   O   s    W%%! 	 	 		"**<<<<<<c1   	 #
  	 	 	D		 F:sF#####s2    
AAA
AAAAAc                        e Zd Zd Zd Zd ZdS )DeferredMappingc                     g | _         d S r0   )_deferredMappingsselfs    r   __init__zDeferredMapping.__init__`   s    !#r   c                     t                               d|t          |          j                   | j                            |||f           d S )Nz*Adding deferred mapping for symbol '%s' %s)logdebugtyper   rJ   append)rL   r?   r3   rE   s       r   rA   z"DeferredMapping.addDeferredMappingc   sF    		>T!WWEUVVV%%vsA&677777r   c                    | j         D ]t\  }}}t                              d|t          |          j                   	 | |         }n# t
          $ r |w xY w ||           t                              d|           ug | _         d S )Nz,Applying deferred mapping for symbol '%s' %sz	Set to %s)rJ   rO   rP   rQ   r   r1   )rL   r?   r3   rE   rD   s        r   applyDeferredMappingsz%DeferredMapping.applyDeferredMappingsg   s    "4 		+ 		+NFCII>T!WWEU  c   F6NNNIIk6****!#s   AAN)r   r   r   rM   rA   rT   r   r   r   rH   rH   _   sA        $ $ $8 8 8$ $ $ $ $r   rH   c                    t          j                    }g }|                     d          5  | D ](}t          |          dk     r(|                    d           t          |          dk     (|\  }}}t
                              d|           t          j                    }d |_        |rt          t          ||t          |d           nd|_        t          |          }	dgt          |	          z  x|_        }
t          |	          D ]#\  }}t          t          ||t           |
|           $t          |j                  |_        fd|D             }|r|d	         j        }nyt          j                    }d
dt                    z
  z  z   |_        t          j                    |_        |                    |           |j        }d |_        g |_        d	|_        |dk    r	||_        t          j                    }|d
dt          |          z
  z  z   |_        ||_        |j                            |           t          |j                  |_        *	 d d d            n# 1 swxY w Y   |D ](}t3          |j        j        d           |j        _        )t3          |d           |_        t          |j                  |_        |S )Nzscript table    z#Adding script %s language-system %sReqFeatureIndexi     c                 *    g | ]}|j         k    |S r   	ScriptTag)r*   r&   	scriptTags     r   r,   z#parseScriptList.<locals>.<listcomp>   s%    EEEAAK9,D,Da,D,D,Dr   r   r!   defaultc                     | j         S r0   )
LangSysTagrecs    r   r@   z!parseScriptList.<locals>.<lambda>   s     r   r>   c                     | j         S r0   r[   ra   s    r   r@   z!parseScriptList.<locals>.<lambda>   s     r   )ot
ScriptListbetweenlenrR   rO   rP   LangSysLookupOrderrF   r9   setattrrX   stripSplitCommaFeatureIndex	enumerater   FeatureCountScriptScriptRecordr\   DefaultLangSysLangSysRecordLangSysCountr`   sortedScriptCount)lines
featureMaprL   recordsline
langSysTagdefaultFeaturefeatureslangSyssymstheListir3   script	scriptRec
langSysRecr]   s                   @r   parseScriptListr   u   s2   =??DG	~	&	& .@ .@ -	@ -	@Dd))a--B d))a-->B;Iz>8II;Y
SSSjllG"&G 
1"%    +1'"8,,D./S3t99_<G 7#D// O O3ZS'7ANNNN#&w';#<#<G EEEEEEEF 
()O--	&/#S^^9K2L&L	##%9;;	 y)))")(,%')$&'#Y&&(/%%-//
(2SAJ<O5P(P
%%,
"$++J777&)&*>&?&?##[-	@.@ .@ .@ .@ .@ .@ .@ .@ .@ .@ .@ .@ .@ .@ .@`  
 
&,M'-G-G'
 '
 '
## w,E,EFFFD4,--DKs   H-I&&I*-I*c                    t          j                    }g |_        |                     d          5  | D ]Z}|\  }}}|(||vsJ d|z              t	          |j                  ||<   	 t          |          t	          |j                  k    s!J d|t	          |j                  fz              n# t          $ r Y nw xY wt          j                    }||_        t          j                    |_        |j        	                    |           |j        }	d |	_
        t          |          }
d gt	          |
          z  x|	_        }t          |
          D ]#\  }}t          t          ||t           ||           $t	          |	j                  |	_        \	 d d d            n# 1 swxY w Y   t	          |j                  |_        |S )Nzfeature tablezDuplicate feature name: %s%d %d)re   FeatureListFeatureRecordrg   rh   r$   r8   
FeatureTagFeaturerR   FeatureParamsrl   LookupListIndexrn   rF   r6   r   LookupCountro   )rw   	lookupMaprx   rL   rz   name
featureTaglookups
featureRecfeaturer   r   r   r3   s                 r   parseFeatureListr      s    >DD		'	' ? ? 	? 	?D(,%D*g%:---/Kd/R---#&t'9#:#:
4 4yyC(:$;$;;;;W*++H >;;;;    )++J$.J!!#J%%j111 (G$(G!"7++D15T0BBG#g#D// M M3Y	3!LLLL"%g&=">">G/	?? ? ? ? ? ? ? ? ? ? ? ? ? ? ?4 D.//DKs7   6F'AB.-F.
B;8F:B;;CFF #F c                    d}d }g d}|                                  d                                         |v r4t          |           }ddddd                    |d                                                   }|rP|d                                         dv sJ |d                     |d                                         d	k    r||z  }|d                                         d
k    r|t	          |d                   dz  z  }|d                                         dk    r|dz  }t	          |d                   }|                                  d                                         |v 4||fS )Nr   )righttoleftignorebaseglyphsignoreligaturesignoremarksmarkattachmenttypemarkfiltertype   r   rV      )r   r   r   r   )yesnor   r   r   r    )peekslowernextgetr$   )rw   flags	filtersetallFlagsrz   flags         r   parseLookupFlagsr      sq   EI  H ++--

 
 
"
"h
.
.E{{! &%!	
 

 #d1gmmoo

 	  	7==??m333T!W333Aw}}%''7==??222Sa\\Q&&E7==??...TMEDGI% ++--

 
 
"
"h
.
.& )r   c                     i }| D ]?}t          |          dk    s
J |            t          |          }|d         ||d         <   @t          j        |          S )Nr   r   r   )rh   r.   otlbuildSingleSubstSubtablerw   font
_lookupMapr4   rz   s        r   parseSingleSubstr      sb    G # #4yyA~~~t~~~$7Q'000r   c                 |    i }| D ]$}t          |          }|dd          ||d         <   %t          j        |          S Nr   r   )r.   r   buildMultipleSubstSubtabler   s        r   parseMultipler      sM    G $ $$8Q)'222r   c                 |    i }| D ]$}t          |          }|dd          ||d         <   %t          j        |          S r   )r.   r   buildAlternateSubstSubtabler   s        r   parseAlternater     sM    G $ $$8Q*7333r   c                     i }| D ]N}t          |          dk    s
J |            t          |          }|d         |t          |dd                    <   Ot          j        |          S )Nr   r   r   )rh   r.   tupler   buildLigatureSubstSubtabler   s        r   parseLigaturer     sl    G + +4yyA~~~t~~~$#'7d122h  )'222r   c                    i }| D ]}t          |          dk    s
J |            |d                                                             dd          }|t          v sJ t	          |d                   }t          |d                   }||vrt                      ||<   t          ||         |          rJ ||f            t          ||         ||           t          j
        ||                                          S )NrY   r   r!   rW   r   r   )rh   titlereplacer   r'   r$   r   hasattrrk   r   buildSinglePosSubtablegetReverseGlyphMap)rw   r   r   valuesrz   wr+   vs           r   parseSinglePosr     s    F 	! 	!4yyA~~~t~~~GMMOO##C,,)))))d1gQLLF??#F1I6!9a((001a&000q	1a    %fd.E.E.G.GHHHr   c                    t          j                    }dx|_        |_        |                                 d                                         d                                         }|dv rd|_        i }| D ]}t          |          dk    s
J |            |d                                         d                                         }|dv s
J |            |d         t          |          d          	                                
                    dd          }t          |         d         }	t          |dd                   \  }
}t          |d                   }|
|vri ||
<   |||
         vr%t                      t                      f||
         |<   ||
         |         }|dk    r|xj        |	z  c_        |d         }n|xj        |	z  c_        |d         }t          ||          rJ ||f            t!          |||           t#          t%          |                                          |          |_        g |_        |j        j        D ]}
||
         }t          j                    }g x}|_        t1          |                                |j        	          D ]\}||         }t          j                    }||_        |d         |_        |j        r|d         nd |_        |                    |           ]t          |j                  |_        |j                            |           t          |j                  |_        n|                     d
          rzd|_        d d g}|                                 d                              d          r| !                                d         d t          d                                                    }dt           j"        fdt           j#        fd|         \  }}||         J tI          | ||          ||<   |                                 d                              d          |\  |_"        |_#        d |D             \  |_%        |_&        d tO          |j%                  D             |_(        |j(        D ]U}d tO          |j&                  D             |_)        |j)        D ](}t                      |_        t                      |_        )V| D ]H}t          |          dk    s
J |            |d                                         d                                         }|dv s
J |            |d         t          |          d          	                                
                    dd          }t          |         d         }	d |dd         D             \  }}}|j(        |         j)        |         }|dk    r|xj        |	z  c_        |j        }n|xj        |	z  c_        |j        }t          ||          rJ ||f            t!          |||           J|j(        D ]S}|j)        D ]I}t          |j        |j                  |_        |j        rt          |j        |j                  nd |_        JTt#          t%          |j"        j*                                                  |          |_        n
J |            |S )Nr   leftrightr   rV   r!   rW   rY   r   rc   classr   class definition begin)firstsecondklassc              3   h   K   | ]-}d t          |j                                                  z   V  .dS r   N)max	classDefsr   )r*   cs     r   	<genexpr>zparsePair.<locals>.<genexpr>\  sN       .
 .
./AAK&&(())).
 .
 .
 .
 .
 .
r   c                 4    g | ]}t          j                    S r   )re   Class1Recordr*   r   s     r   r,   zparsePair.<locals>.<listcomp>_  s     PPP1R_..PPPr   c                 4    g | ]}t          j                    S r   )re   Class2Record)r*   js     r   r,   zparsePair.<locals>.<listcomp>a  s      T T Tq!2!2 T T Tr   c              3   4   K   | ]}t          |          V  d S r0   r$   r*   xs     r   r   zparsePair.<locals>.<genexpr>k  s(      $?$?SVV$?$?$?$?$?$?r   )+re   PairPosValueFormat1ValueFormat2r   splitr   Formatrh   r   r   r   r.   r$   r   r   rk   makeCoveragesetkeysCoveragePairSetglyphsPairValueRecordru   
getGlyphIDSecondGlyphValue1Value2rR   PairValueCountPairSetCountendswithpeek	ClassDef1	ClassDef2parseClassDefClass1CountClass2Countranger   r   r   )rw   r   r   rL   typr   rz   sidewhatmaskglyph1glyph2valuerec2vrvalues1pairsetry   values2pairr   r5   r   rec1class1class2s                             r   	parsePairr
  $  s   :<<D,--D)
++--

 
 
"
"1
%
+
+
-
-C
 	% 	%Dt99>>>4>>>7==??1%++--D,,,,d,,,73t99;;'--//77R@@D(.q1D'QqS	22NFFQLLEV##!#vVF^++*5--)Gvv&&>&)Dv~~!!T)!!!W!!T)!!!Wr4((442t*444Be$$$$$S%7%7>>m* 	) 	)FVnGjllG022Gg- T_EEE % %!&/)++#) %aj,0,=Ggajj4t$$$$%()@%A%AG"L((((--	g		 04L	kkmmA''(@AA 	E**,,q/"BS)A%B%B$B"BCIIKKCR\*bl+  JC S>)))*5$eDDDIcN kkmmA''(@AA 	E *3&.
 .
3<.
 .
 .
*$* QPd>N8O8OPPP% 	, 	,D T TE$BR<S<S T T TD) , ,)mm)mm,  	% 	%Dt99>>>4>>>7==??1%++--D,,,,d,,,73t99;;'--//77R@@D(.q1D$?$?T!A#Y$?$?$?!FFE$V,9&ADv~~!!T)!![!!T)!![r4((442t*444Be$$$$% 	 	D)  )$*;T[II (K 14;???  %S)A)F)F)H)H%I%I4PP#Kr   c                 ,   |                                  d                                         d                                         }|dv r=|                     d          5  t	          | |          cd d d            S # 1 swxY w Y   t	          | |          S )Nr   r   )zfirstclass definition beginzsecondclass definition begin)r   r   r   untilr
  )rw   r   r   r   s       r   parseKernsetr    s    
++--

 
 
"
"1
%
+
+
-
-C
[[K
 
 	* 	* UD))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* UD!!!s   A;;A?A?c                    t          |           dk    sJ  |            }d|_        t          | d                   \  |_        |_        t          |           dk    r-| d         dk    r!d|_        t          | d                   |_        |S )Nr   r   r   rW   )rh   r   intSplitCommaXCoordinateYCoordinater$   AnchorPoint)datar   anchors      r   
makeAnchorr    s|    t99>>>>UWWFFM-:47-C-C*F*
4yy1}}aB a\\Mr   c                    i }| D ]}t          |          dv s
J |            dt          j        fdt          j        fd|d                  \  }}t	          |d                   }||vrd d g||<   ||         |         J ||f            t          |dd          |          ||         |<   t          j        ||                                          S )N)rY   rV   r   r   )entryexitr   )	rh   re   EntryAnchor
ExitAnchorr'   r  r   buildCursivePosSubtabler   )rw   r   r   ry   rz   r5   r   glyphs           r   parseCursiver    s    G 
: 
:4yyF"""D"""(&
 
 q'
U $q'"""D\GENu~c"**UCL***(abb599s&w0G0G0I0IJJJr   c                     g }|j         D ]S}| |         \  }}|                                }||_        t          ||j        |           |                    |           T|S r0   )r   MarkRecordClassClassrk   
MarkAnchorrR   )r  coverager   ry   r  r   r  records           r   makeMarkRecordsr$    sk    G  Uv""$$f---vNr   c                    g }i }|j         D ]Y}t          |          ||<   |                                }d g|z  }t          ||j        |           |                    |           Z|                                 D ]D\  \  }}	}
|||                  }t          ||j                  }||	         J ||	f            |
||	<   E|S r0   )r   rh   BaseRecordClassrk   
BaseAnchorrR   itemsgetattr)r  r"  r   
classCountry   r5   r  r#  anchorsr   r  s              r   makeBaseRecordsr,    s    G
C  \\E
""$$&:%g...v"&**,,    U$&!,//u~%%u~%%%Nr   c                    d gt          |j                  z  }d t          |j                  D             }|                                 D ]\  \  }}}}	}
|||                  }|Xt	          j                    x}|||         <   |	|_        d t          |	          D             |_        |j        D ]}d g|z  |_	        |j        |	k    sJ ||j        |	f            |j        |dz
           j	        }||         J |||f            |
||<   |S )Nc                     i | ]\  }}||	S r   r   )r*   r   r+   s      r   
<dictcomp>z'makeLigatureRecords.<locals>.<dictcomp>  s    
7
7
7DAq1a
7
7
7r   c                 4    g | ]}t          j                    S r   )re   ComponentRecordr   s     r   r,   z'makeLigatureRecords.<locals>.<listcomp>  s!    %U%U%Uqb&8&:&:%U%U%Ur   r   )
rh   r   rn   r(  re   LigatureAttachComponentCountr   r1  LigatureAnchor)r  r"  r   r*  ry   r5   r  r   compIdx	compCountr  r#  compRecr+  s                 r   makeLigatureRecordsr8    sC   fs8?+++G
7
7Iho66
7
7
7C6:jjll    2*w	FU$>+-+<+>+>>FWSZ($-F!%U%UE)DTDT%U%U%UF"!1 = =*.*)<&&$	111!4
111 (15Du~%%w'>%%%Nr   c                    |                                 }d|_        i }i }||j        f||j        f||j        fd}d}| D ]}|d         }	|	dv sJ t	          |d                   }
||	         \  }}|	dk    rdnd}t          d |dd|z            D                       }t          |d|z                      }t          |d|z   d          |          }|	dk    r|
||f}}n	|
|f|z   |}}||vs
J |            |||<   t          ||          }t          t          |                                          ||j                  }|                                }t          |||          }t          ||j        |           t          ||j        t%          |                     t          ||j        |           t          ||j        |           |dz   |_        |sdn-dt          d	 |                                D                       z   |_        t          t          d
 |                                D                       ||j                  }|                                }|j        dk    rt7          ||||j                  }nt9          ||||j                  }t          ||j        |           t          ||j        t%          |                     t          ||j        |           t          ||j         |           |S )Nr   )markbaseligaturer   r<  r   c              3   4   K   | ]}t          |          V  d S r0   r   r   s     r   r   z'parseMarkToSomething.<locals>.<genexpr>  s(      @@!s1vv@@@@@@r   rY   r:  c              3   ,   K   | ]\  }}|d          V  dS r   r   )r*   kr   s      r   r   z'parseMarkToSomething.<locals>.<genexpr>  s*      4W4WdaQqT4W4W4W4W4W4Wr   c                     g | ]
}|d          S )r   r   )r*   r?  s     r   r,   z(parseMarkToSomething.<locals>.<listcomp>  s    +++aQqT+++r   Ligature)!Typer   MarkAnchorClassBaseAnchorClassr'   r   r$   r  r   r   r   r   MarkCoverageClassMarkArrayClassr$  rk   
MarkRecord	MarkCountrh   MarkCoverage	MarkArray
ClassCountr(  r*  BaseCoverageClassBaseArrayClassBaser8  r,  
BaseRecord	BaseCountBaseCoverage	BaseArray)rw   r   r   rL   markDatabaseDataDatamaxKlassrz   r   r  r  anchorClass
extraItemsextrasr   r  r>   r   markCoverage	markArraymarkRecordsbaseCoverage	baseArraybaseRecordss                            r   parseMarkToSomethingr`    s)   6688DDKHH1,-1,-q01 D
 H ( (1g22222$q'"" Ik++QQ
@@tAJ,>'?@@@@@DZ())DZ!1!12K@@&==CC %.61FC$S	x''  HMMOO 4 4dA<OPPL  ""I!(L!<<KIq|[111Iq{C$4$4555D!.,///D!+y)))lDO  (WaaQ4W4WhnnFVFV4W4W4W1W1W-WDO++8==??+++,,dA4G L   ""Iv)(L!T_UU%haQQIq|[111Iq{C$4$4555D!.,///D!+y)))Kr   c                       e Zd Zd ZdS )
MarkHelperc                     dD ]t}dD ]o}||z   }|dk    r|dv r|}nt          | |          |z   }|dk    rd}t          | ||           |dk    r)t          t          |          }t          | |dz   |           pud S )	N)MarkrN  )r   ArrayCountRecordAnchorrd  )rf  rg  rh  LigatureRecordr2  rf  r   )r)  rk   re   )rL   WhichWhatr>   r   r   s         r   rM   zMarkHelper.__init__  s    % 	8 	8EJ 8 8dlF??t/L'L'LEE#D%0047E,,,,Ec5)))7??#B..ED#-7778	8 	8r   Nr   r   r   rM   r   r   r   rb  rb    s#        8 8 8 8 8r   rb  c                   $    e Zd ZdZdZej        ZdS )MarkToBaseHelperrd  rN  N)r   r   r   rd  rN  re   MarkBasePosrB  r   r   r   rn  rn  &  s        DD>DDDr   rn  c                   $    e Zd ZdZdZej        ZdS )MarkToMarkHelperMark1Mark2N)r   r   r   rd  rN  re   MarkMarkPosrB  r   r   r   rq  rq  ,  s        DD>DDDr   rq  c                   $    e Zd ZdZdZej        ZdS )MarkToLigatureHelperrd  rA  N)r   r   r   rd  rN  re   
MarkLigPosrB  r   r   r   rv  rv  2  s        DD=DDDr   rv  c                 <    t          | |t                                S r0   )r`  rn  rw   r   r   s      r   parseMarkToBaserz  8      t-=-?-?@@@r   c                 <    t          | |t                                S r0   )r`  rq  ry  s      r   parseMarkToMarkr}  <  r{  r   c                 <    t          | |t                                S r0   )r`  rv  ry  s      r   parseMarkToLigaturer  @  s    t-A-C-CDDDr   c                 H    | rd |                      d          D             ng S )Nc                 6    g | ]}|                                 S r   stripr*   r&   s     r   r,   z#stripSplitComma.<locals>.<listcomp>E  s     ///!AGGII///r   ,r   rz   s    r   rl   rl   D  s+    37?//tzz#////R?r   c                 H    | rd |                      d          D             ng S )Nc                 ,    g | ]}t          |          S r   r   r   s     r   r,   z!intSplitComma.<locals>.<listcomp>I  s    ,,,qCFF,,,r   r  r  r  s    r   r  r  H  s+    04<,,DJJsOO,,,,"<r   c                       e Zd Zd ZdS )ContextHelperc                    |                     d          rd}d}nd}d}|                    d          rd}d}d}nd}d}d}||z   }|| _        || _        || _        || _        || _        || _        |d	z   | _        |dk    rd
 }	d }
d }d }d }d }d }d }d }d }nS|dk    rd }	d }
d }d }d }d }d }d }d }d }n.|dk    rd }	d }
d }d }d }d }d }d  }d! }d" }nJ d#|z              |r$|
| _	        || _
        || _        || _        || _        n#|	| _	        || _
        || _        || _        || _        |dk    r2|d$z   | _        |d%z   | _        |d&z   | _        |d'z   | _        d( | _        d S |dk    rS|d)z   | _        |d*z   | _        |d+z   | _        |d,z   | _        d- | _        |rd.nd/| _        |rdnd| _        |rd0nd1| _        d S d S )2NSubstSubPosChainr   rY   rW   r   LookupRecordc                     | j         S r0   r   rs    r   r@   z(ContextHelper.__init__.<locals>.<lambda>i       r   c                     | j         S r0   r  r  s    r   r@   z(ContextHelper.__init__.<locals>.<lambda>j      aj r   c                     dS )Nr0   r   r  s    r   r@   z(ContextHelper.__init__.<locals>.<lambda>k  s    G r   c                     dS )N)NNNr   r  s    r   r@   z(ContextHelper.__init__.<locals>.<lambda>l  s    ); r   c                     | j         fS r0   )Inputr  s    r   r@   z(ContextHelper.__init__.<locals>.<lambda>o  
    !' r   c                 *    | j         | j        | j        fS r0   	Backtrackr  	LookAheadr  s    r   r@   z(ContextHelper.__init__.<locals>.<lambda>p      q{AGQ[&I r   c                 >    |\  | _         d |D             \  | _        d S )Nc              3   :   K   | ]}t          |          d z   V  dS r   rh   r   s     r   r   z>ContextHelper.__init__.<locals>.SetRuleData.<locals>.<genexpr>t  ,      "9"9!3q66A:"9"9"9"9"9"9r   )r  
GlyphCountr  ds     r   SetRuleDataz+ContextHelper.__init__.<locals>.SetRuleDatar  &    
"9"9q"9"9"9r   c                     |\  | _         | _        | _        t          |d                   t          |d                   dz   t          |d                   c| _        | _        | _        d S Nr   r   r   r  r  r  rh   BacktrackGlyphCountInputGlyphCountLookAheadGlyphCountr  s     r   ChainSetRuleDataz0ContextHelper.__init__.<locals>.ChainSetRuleDatav  \    673agq{
 1YYAaD		As1Q4yy	)%)))r   r   c                     | j         S r0   r  r  s    r   r@   z(ContextHelper.__init__.<locals>.<lambda>  r  r   c                     | j         S r0   r  r  s    r   r@   z(ContextHelper.__init__.<locals>.<lambda>  r  r   c                     | j         fS r0   ClassDefr  s    r   r@   z(ContextHelper.__init__.<locals>.<lambda>  s
    QZM r   c                 *    | j         | j        | j        fS r0   BacktrackClassDefInputClassDefLookAheadClassDefr  s    r   r@   z(ContextHelper.__init__.<locals>.<lambda>  s    ##* r   c                     |\  | _         d S r0   r  r  s     r   SetContextDataz.ContextHelper.__init__.<locals>.SetContextData  s     !r   c                 0    |\  | _         | _        | _        d S r0   r  r  s     r   SetChainContextDataz3ContextHelper.__init__.<locals>.SetChainContextData  s    NOK$aoq7J7J7Jr   c                     | j         fS r0   )r   r  s    r   r@   z(ContextHelper.__init__.<locals>.<lambda>  r  r   c                 *    | j         | j        | j        fS r0   r  r  s    r   r@   z(ContextHelper.__init__.<locals>.<lambda>  r  r   c                 >    |\  | _         d |D             \  | _        d S )Nc              3   :   K   | ]}t          |          d z   V  dS r   r  r   s     r   r   z>ContextHelper.__init__.<locals>.SetRuleData.<locals>.<genexpr>  r  r   )r   r  r  s     r   r  z+ContextHelper.__init__.<locals>.SetRuleData  r  r   c                     |\  | _         | _        | _        t          |d                   t          |d                   dz   t          |d                   c| _        | _        | _        d S r  r  r  s     r   r  z0ContextHelper.__init__.<locals>.ChainSetRuleData  r  r   c                     | j         d         S Nr   r  r  s    r   r@   z(ContextHelper.__init__.<locals>.<lambda>  s    A r   c                     | j         d         S r  )InputCoverager  s    r   r@   z(ContextHelper.__init__.<locals>.<lambda>  s    aoa&8 r   c                     | j         S r0   r  r  s    r   r@   z(ContextHelper.__init__.<locals>.<lambda>  r  r   c                 0    | j         | j        z   | j        z   S r0   )BacktrackCoverager  LookAheadCoverager  s    r   r@   z(ContextHelper.__init__.<locals>.<lambda>  s    #ao58KK r   c                 >    |\  | _         d |D             \  | _        d S )Nc              3   4   K   | ]}t          |          V  d S r0   r  r   s     r   r   z>ContextHelper.__init__.<locals>.SetRuleData.<locals>.<genexpr>  s(      "5"5a3q66"5"5"5"5"5"5r   )r   r  r  s     r   r  z+ContextHelper.__init__.<locals>.SetRuleData  s&     !"5"51"5"5"5r   c                 n    |\  | _         | _        | _        d |D             \  | _        | _        | _        d S )Nc              3   4   K   | ]}t          |          V  d S r0   r  r   s     r   r   zCContextHelper.__init__.<locals>.ChainSetRuleData.<locals>.<genexpr>  s(      ''SVV''''''r   )r  r  r  r  r  r  r  s     r   r  z0ContextHelper.__init__.<locals>.ChainSetRuleData  sF    NOK$aoq7J
 ('Q'''	)%)))r   zunknown format: %sRule	RuleCountRuleSetRuleSetCountc                     || v r|gng S r0   r   r   r   r  s      r   r@   z(ContextHelper.__init__.<locals>.<lambda>  s    f1##" r   	ClassRuleClassRuleCountClassSetClassSetCountc                 x    |r|                     | |          n"|dk    rt          |           nt                      S r  )intersect_classr   r  s      r   r@   z(ContextHelper.__init__.<locals>.<lambda>  s=    8!!&!,,,%&!VVc&kkk r   r  r  r  r   )r   
startswithTyprB  r  ChainTypInputIdxDataLenr  r   ContextDatar  RuleDatar  r  r  r  r  	Intersectr  ClassDefIndexr  )rL   	klassNamer   r  rB  r  r  r  r  r   ChainCoverager  ChainContextDatar  r  r  ChainRuleDatar  r  s                      r   rM   zContextHelper.__init__N  s6   g&& 	CDDCD(( 	EHGGEHG3;	
   >1Q;;++H00M++K;;!N"&++HIIM: : :: : : : q[[++H00M11K   " " "P P P ,+HIIM: : :: : : : q[[..H88MK#!N"&++H M6 6 6( ( ( ( 4*V3333 	+)DM/D"5D)DM/D$DM*D"0D$DM*DQ;; 6)DI%3DN#i/DL (> 9DLLDNNNq[[ ;.DI%(88DN#j0DL (? :D DN 05DOO*DM&+!2D$)6wDJJJ [r   Nrl  r   r   r   r  r  M  s(        J7 J7 J7 J7 J7r   r  c           	      z   t          t          |          }g }| D ]} |            }t          |          }t          |          dk    s
J |            t	          |d                   }|dk    s
J |            |dz
  |_        t          t          ||d         t          |d           |	                    |           |S )Nr   r   r   r   )
r)  re   rl   rh   r$   SequenceIndexrF   r6   rk   rR   )r(  r  r   r   lstitemrb   r5   s           r   parseLookupRecordsr    s    B	""E
C  eggt$$4yyA~~~t~~~$q'llQwwwwww!GY	47GSBSTTT

3Jr   c                 J    | sd S  |            }t          |           |_        |S r0   )dictr   )r   r   r   rL   s       r   makeClassDefr    s,     t577D)__DNKr   c                    i }|                      d          5  | D ]=}t          |d                   }||vs
J |            t          |d                   ||<   >	 d d d            n# 1 swxY w Y   t          |||          S )Nzclass definitionr   r   )rg   r'   r$   r  )rw   r   r   r   rz   r  s         r   r   r     s    I	)	*	* , , 	, 	,Dd1g&&E	)))5)))"47||Ie	,, , , , , , , , , , , , , , ,
 	4///s   AA&&A*-A*c                     | sd S t          | t                    rt          |           }  |            }t          t          |           |j                  |_        |S )Nrc   )
isinstancer   ru   r   r   )r   r   r   r"  s       r   r   r     sX     t&#  uwwHS[[do>>>HOOr   c                     g }|                      d          5  | D ]*}|                    t          |d                              +	 d d d            n# 1 swxY w Y   t          |||          S )Nzcoverage definitionr   )rg   rR   r'   r   )rw   r   r   r   rz   s        r   parseCoverager    s    F	,	-	- . . 	. 	.DMM)DG,,----	.. . . . . . . . . . . . . . . e,,,s   .AAAc           	         i }|D ]g\  }}|                     |j                 d         g                               t          fdt	          |          D                       |f           hg }|D ]&}||vr|                    d            g }	||         D ]\  }} t          t          j                              }
                    |
|           t          |
j
        dz   t          |                     t          |
j        |           |	                    |
            t          t          j                              }t          |j        |	           t          |j        t          |	                     |                    |           (t          | j        |           t          | j        t          |                     d S )Nr   c              3   L   K   | ]\  }}||j         k    rd ndd         V  dS )r   r   Nr  )r*   r   r&   r   s      r   r   z!bucketizeRules.<locals>.<genexpr>  s@      OO11!qz//QQq223OOOOOOr   rf  )
setdefaultr  rR   r   rn   r)  re   r  r  rk   rB  rh   r  r  r  r  )rL   r   rules
bucketKeysbucketsseqrecsrulesets
firstGlyph	thisRulesrulerulesets    `          r   bucketizeRulesr    s   G 
 
	T3qz?1-r2299OOOO	#OOOOOQUV	
 	
 	
 	
 H  ! !
W$$OOD!!!	 , 	# 	#IC&72qv&&((DMM$$$$D!&7*CII666D!.$///T""""('"ai((**+++c)nn555    D!)X&&&D!.#h--00000r   c           
          t          t          |                      }|                                 d                                         d                                         }|dk    rqd|_        t                              d||j                   t          ||j                  g }| D ]}|d                                         dk    sJ |d                     t          |          dj
        z   k     r0|                    d           t          |          dj
        z   k     0t          d |ddj
        z            D                       }t          |dj
        z   d          j        |          }	|                    ||	f           t          fd|D                       }
t!          |
|          |_        t%          |||j        j                   n|                    d          rd	|_        t                              d||j                   t          ||j                  d gj
        z  }|                                 d                             d
          r|                                 d         d t          d
                                                    }ddt          j        fidt          j        fdt          j        fd	t          j        fddj
                 |         \  }}||         
J |            t5          | ||          ||<   |                                 d                             d
                              ||           g }| D ]}|d                                                             d          sJ |d                     t          |          dj
        z   k     r0|                    d           t          |          dj
        z   k     0t          d |ddj
        z            D                       }t          |dj
        z   d          j        |          }	|                    ||	f           t          fd|D                       t          fd|j                 j                                        D                       }
t!          |
|          |_        t%          ||tA          tC                    dz                        ni|                    d          rId|_        t                              d||j                   t          ||j                  t          d tA          j
                  D                       }|                                 d                             d          r|                                 d         d t          d                                                    }ddt          j        fidt          j"        fdt          j#        fd	t          j$        fddj
                 |         \  }}||                             tK          | ||                     |                                 d                             d          &                    ||           tO          |           } t          |           dk    sJ | d         }|d                                         dk    sJ |d                     t          |dd          j        |          }	tQ          |j)        dz   t          |	                     tQ          |j        |	           n
J |            |S )Nr   r  r   zParsing %s format %srW   c              3   N   K   | ] }t          t          |                    V  !d S r0   )r.   rl   r   s     r   r   zparseContext.<locals>.<genexpr>7  s2      XX1
?1#5#566XXXXXXr   c              3   D   K   | ]\  }}|j                  d          V  dS r   Nr  r*   r   r  r   s      r   r   zparseContext.<locals>.<genexpr>;  s2      DDd#aj/!,DDDDDDr   r   r   r   )	backtrackrW   	lookahead)r   rY   r   c              3   4   K   | ]}t          |          V  d S r0   )r  r   s     r   r   zparseContext.<locals>.<genexpr>W  s*      JJQa((JJJJJJr   c              3   D   K   | ]\  }}|j                  d          V  dS r  r  r  s      r   r   zparseContext.<locals>.<genexpr>Z  s2      EE)#t3qz?1-EEEEEEr   c              3   *   K   | ]\  }}|v 	|V  d S r0   r   )r*   r+   r   firstClassess      r   r   zparseContext.<locals>.<genexpr>[  s:       
 
!QQ,EVEVAEVEVEVEV
 
r   r"  rY   c              3      K   | ]}g V  d S r0   r   r   s     r   r   zparseContext.<locals>.<genexpr>d  s"      77"777777r   coverage definition begin)r  inputr  rf  )*r)  re   r   r   r   r   rO   rP   r  rh   r  rR   r   r  r  r   r   r   r  r   r   r   r  r  r  r  r   r  r  r  r   r(  r   r   r  r  r  r  r  listrk   rB  )rw   r   rB  r   rL   r   r  rz   r   r  firstGlyphsr   r5   r   	coveragesr   r  s                  @@r   parseContextr  +  s   72tD
++--

 
 
"
"1
%
+
+
-
-C
g~~		($<<<$,, 	& 	&D7==??g---tAw---d))a!)m++B d))a!)m++XXQQYEV@WXXXXXC%d1qy=??&;Q^YWWDLL#t%%%%DDDDeDDDDD$[$77tQt}';<<<<	g		 =		($<<<$,,FQY&	kkmmA''(@AA 	E**,,q/"BS)A%B%B$B"BCIIKKC BK( #$R%9!:B,-"#R%9!: 		 	 i	 	JC S>))3)))*5$eDDDIcN kkmmA''(@AA 	E 	
y))) 	& 	&D7==??--g66??Q???d))a!)m++B d))a!)m++JJ$q1qy=7H2IJJJJJC%d1qy=??&;Q^YWWDLL#t%%%%EEEEuEEEEE 
 
 
 
#AJ/9??AA
 
 
 
 
 %[$77tQuS->->-B'C'CDDDD	j	!	! 		($<<<$,,77eAI&6&677777	kkmmA''(CDD 	K**,,q/"ES)D%E%E$E"EFLLNNC BK( #$R%9!:!12"#R%9!: 		 	 i	 	JC cN!!-t5"I"I"IJJJ kkmmA''(CDD 	K 	
dI&&&U5zzQQxAw}}*,,,d1g,,,!$qrr(ANIFFafw&D		222and++++#Kr   c                 (    t          | |d|          S )NContextSubstr   r  rw   r   r   s      r   parseContextSubstr    s    t^yIIIIr   c                 (    t          | |d|          S )N
ContextPosr  r  r  s      r   parseContextPosr"    s    t\YGGGGr   c                 (    t          | |d|          S )NChainContextSubstr  r  r  s      r   parseChainedSubstr%    s    t%8INNNNr   c                 (    t          | |d|          S )NChainContextPosr  r  r  s      r   parseChainedPosr(    s    t%6)LLLLr   c                   	 t          j                    }d|_        g g f}|                                 d                             d          r|                                 d         d t          d                                                    }dt           j        fdt           j	        fd|         \  }}||         
                    t          | ||                     |                                 d                             d          |d         |_        t          |j                  |_        |d         |_	        t          |j	                  |_        i 	| D ]?}t          |          dk    s
J |            t          |          }|d         	|d         <   @t          t!          	                                          |          |_        	fd|j        j        D             |_        t          |j                  |_        |S )Nr   r   r  )r  r  r   r   c                      g | ]
}|         S r   r   )r*   r?  r4   s     r   r,   z,parseReverseChainedSubst.<locals>.<listcomp>  s    @@@awqz@@@r   )re   ReverseChainSingleSubstr   r   r   r   rh   r   r  r  rR   r  r  r  r.   r   r   r   r   r   
Substituter  )
rw   r   r   rL   r  r   r5   r   rz   r4   s
            @r   parseReverseChainedSubstr-    s   %''DDKRI
++--

#
#$?
@
@ Gjjll1oA%@!A!A AABHHJJR12R12
 
 
U 	#mE4uEEEFFF ++--

#
#$?
@
@ G 'q\D"4#9::D&q\D"4#9::DG # #4yyA~~~t~~~$7Q W\\^^!4!4d;;DM@@@@4=+?@@@DO$/**DOKr   c                    |                      d          }|\  }}}t                              d||           t          j                    }t          |           \  |_        }	|	|	|_        dt          fdt          fdt          fdt          fdt          fdt          fd	t          fd
dt          fdt           fdt"          fdt$          fdt&          fdt(          fdt*          fdt,          fd	t.          fd	d|         |         \  |_        }
|                     d          5  g }|                                 r|                     d          5  |                                 rH |
| ||          }|j        |j        k    sJ |                    |           |                                 Hd d d            n# 1 swxY w Y   |                                 d         dv rt;          |            |                                 d d d            n# 1 swxY w Y   |                      d           ||_        t?          |j                  |_         |j         dk    rd S |S )NlookupzParsing lookup type %s %sr   r   rY   rV         r   )singlemultiple	alternater<  contextchainedreversechained   )	r2  r  kernsetcursivezmark to basezmark to ligaturezmark to markr5  r6  GSUBGPOSz
lookup end)
% subtablezsubtable endr   )!expectrO   rP   re   Lookupr   
LookupFlagMarkFilteringSetr   r   r   r   r  r%  r-  r   r
  r  r  rz  r  r}  r"  r(  
LookupTyper  r   rR   r   r   SubTablerh   SubTableCount)rw   tableTagr   r   rz   _r   r   r/  r   parseLookupSubTable	subtablessubtables                r   parseLookuprK    s   <<!!DLAtSII)3555Y[[F#3E#:#: Fy"+ *+M*^,M*,-,- ":;
 
 .)	N<(<(0!"$7 80?+?+

 

. .* +.* +.*F*. 
\	"	" 
 
	jjll 	;<< / /jjll /225$	JJH!,0CCCCC$$X... jjll // / / / / / / / / / / / / / /
 {{}}Q#AAAU jjll 	
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
LLFOv//Fq   tMs8   ,HAF0$H0F4	4H7F4	8AHH
H
c                 *    t          j        |                      }t                      t                      |dv sJ t                              d|            t          t          |                      }d|_        dfdfdfdfdd	}|                                D ]\  }}t          ||d            | 
                                | 
                                d
                                         }||vr=t                              d| 
                                           t          |            ||         \  }}|dk    r|j        $t          j                    |_        g |j        _        | 
                                \  }	}
}	t          | ||          }.|
vsJ d|
z              t!          |j        j                  |
<   nKt#          |
          t!          |j        j                  k    s!J d|
t!          |j                  fz              |j        j                            |           n4t          ||          
J |            t          || ||                      | 
                                |j        r#t!          |j        j                  |j        _        ؉                                 t*          j                            t0                    rd|vrt3          d          |d<   i |d         _        |d         j                            t8          i                               |i           }                                D ]\  }
}d|
dg|t=          |          <                                    ||_        |S )Nr;  z
Parsing %s   rf   c                 $    t          |           S r0   )r   )rw   rx   s    r   r@   zparseGSUBGPOS.<locals>.<lambda>  s    /%<< r   r   c                 &    t          |           S r0   )r   )rw   rx   r   s    r   r@   zparseGSUBGPOS.<locals>.<lambda>  s    *5)ZHH r   )
LookupListN)zscript table beginzfeature table beginr/  r   Skipping %sr/  zDuplicate lookup name: %sr   DebgrW   ) r   getTableClassrH   rO   rP   r)  re   Versionr   rk   r   r   r   rP  r@  rK  rh   r$   rR   r   rT   osenvironr   r   r
   r  r  r   r(  strtable)rw   r   rF  	containerrL   fieldsattrparserr   rG  r   r/  rP   rx   r   s                @@r   parseGSUBGPOSr]    s   -#H--//I!!I ""J'''''IIlH%%% 72x  ""DDL <<<<

 HHHHH 
 '
 
F  " "fdD!!!!
**,,
"jjll1o##%%fIImUZZ\\222KKKc{f(??&"$-//)+&JAtQ $	BBF$9,,,.ID.P,,,"%do&<"="=	$4yyC(>$?$????$$L B??? O"))&11114&&.....D$u...1 **,,
"2  B&)$/*@&A&A#''))):>>.// 
	4T!!'//V$&V!Vjj!6;;Hb)) 
 !* 1 1 4 4f&($^c&kk""((***IOr   c                 $    t          | |d          S )Nr<  r]  rw   r   s     r   	parseGSUBra  !      f---r   c                 $    t          | |d          S )Nr=  r_  r`  s     r   	parseGPOSrd  %  rb  r   c                 .   i }|                      d          5  | D ]<}t          |d                   }||vs
J |            d |dd          D             ||<   =	 d d d            n# 1 swxY w Y   t          j        ||                                          S )Nzattachment listr   c                 ,    g | ]}t          |          S r   r   r   s     r   r,   z#parseAttachList.<locals>.<listcomp>/  s    666SVV666r   r   )rg   r'   r   buildAttachListr   )rw   r   pointsrz   r  s        r   parseAttachListri  )  s    F	(	)	) 7 7 	7 	7Dd1g&&E&&&&&&66T!""X666F5MM	77 7 7 7 7 7 7 7 7 7 7 7 7 7 7
 vt'>'>'@'@AAAs   A A%%A),A)c                    i }|                      d          5  | D ]p}t          |d                   }||vs
J |            t          |d                   }d |dd          D             }|t          |          k    s
J |            |||<   q	 d d d            n# 1 swxY w Y   t	          j        |i |                                          S )Ncaretsr   r   c                 ,    g | ]}t          |          S r   r   r   s     r   r,   z"parseCaretList.<locals>.<listcomp>:  s    333Q#a&&333r   r   )rg   r'   r$   rh   r   buildLigCaretListr   )rw   r   rk  rz   r  num
thisCaretss          r   parseCaretListrp  3  s#   F	x	 	  ' ' 	' 	'Dd1g&&E&&&&&&d1g,,C33$qrr(333J#j//)))4)))&F5MM	'' ' ' ' ' ' ' ' ' ' ' ' ' ' '  T-D-D-F-FGGGs   A4BB Bc                 D   t          j                    }d|_        dt          |                                           z   |_        d g|j        z  |_        t          |                                           D ]*\  }}t          t          |          |          |j        |<   +|S )Nr   )re   MarkGlyphSetsDefMarkSetTableFormatr   r   MarkSetCountr   ru   r(  r   r   )setsr   rL   r?  r   s        r   makeMarkFilteringSetsrv  @  s      DDC		,,,DFT..DMtzz||$$ 6 61'A55aKr   c                 b   i }|                      d          5  | D ]m}t          |          dk    s
J |            t          |d                   }t          |d                   }||vrg ||<   ||                             |           n	 d d d            n# 1 swxY w Y   t          ||          S )Nzset definitionr   r   r   )rg   rh   r'   r$   rR   rv  )rw   r   ru  rz   r  sts         r   parseMarkFilteringSetsry  J  s    D	'	(	( # # 	# 	#Dt99>>>4>>>d1g&&ET!WB~~RHOOE""""	## # # # # # # # # # # # # # # !t,,,s   A1BBBc                     t          j        d                      }t                              d           t	          j                    }dd fdt          fdt          fdd fd	t          fd
}|	                                D ]\  }}t          ||d            |                                 |                                 d                                         }||vr+t                              d|           t          |            o||         \  }}t          ||          
J |            t          || || |                     |                                 |j        dnd|_        ||_        |S )NGDEFzParsing GDEFGlyphClassDefc                 :    t          | |t          j                  S Nr   )r   re   r|  r`  s     r   r@   zparseGDEF.<locals>.<lambda>_  s    eTAQ R R R r   
AttachListLigCaretListMarkAttachClassDefc                 :    t          | |t          j                  S r~  )r   re   r  r`  s     r   r@   zparseGDEF.<locals>.<lambda>e  s    eTAV W W W r   rr  )r   zattachment list beginzcarets beginz&mark attachment class definition beginzmarkfilter set definition beginr   rQ  rM  i  )r   rS  rO   rP   re   r{  ri  rp  ry  r   rk   r   r   r   r)  rr  rT  rX  )rw   r   rY  rL   rZ  r[  r\  r   s           r   	parseGDEFr  X  s   +#F++--IIIn799D RR#
 #/!@'8 WW3
 -?@V+W F  " "fdD!!!!
**,,
"jjll1o##%%fIImS)))KKKc{ftT""**D***dFF5$//000 **,,
" "&!6!>::JDLIOr   c                      t          j        d                      }t                              d           g }                                                      dt          |          z              fddD             \  }}}}t          |         |          }||_        ||_	        ||_
        i |_        t                     }	|	d         dk    r?|	d         |j        t          |	d         d	          <   t                     }	|	d         dk    ?|                    |                                            d|_        ||_        |S )
NcmapzParsing cmapzcmap subtable %dc                 0    g | ]}t          |          S r   )parseCmapId)r*   fieldrw   s     r   r,   zparseCmap.<locals>.<listcomp>  s3     $
 $
 $
 u%%$
 $
 $
r   )
platformID
encodingIDformatlanguager   zend subtabler   r    )r   rS  rO   rP   r   r?  rh   r   r  	platEncIDr  r  r   r$   rR   tableVersiontables)
rw   r   rY  r  platIdencIdfmtlangrX  rz   s
   `         r   	parseCmapr  y  sP   +#F++--IIInF
**,,
"'#f++5666$
 $
 $
 $
K$
 $
 $
 sD S!#&&!
E{{1g''+/7EJs47B''(;;D 1g'' 	e **,,
"  IIr   c                 f    t          |           }||d         k    sJ t          |d                   S )Nr   r   )r   r$   )rw   r  rz   s      r   r  r    s2    ;;DDGtAw<<r   c                    t                               d           |                                 }d }|d                                         d         dk    r!|d                                         d         }nYd                    |d                                         d d                   dk    r |d                                         d         }|;t          |            |                    d          }||}n||k    sJ ||f            |
J d	            	 t          t          t          t          d
|         | |          S )NzParsing tabler   FontDamer   r!   rY   zFont Chef TablerV   z7Don't know what table to parse and data doesn't specify)r<  r=  r{  r  )rO   rP   r   r   joinr   ljustra  rd  r  r  )rw   r   rF  rz   tags        r   
parseTabler    s4   IIo;;==D
CAw}}qZ''1gmmooa 	$q'--//"1"%	&	&*;	;	;1gmmooa 
UiillHHs???XsO??? 	@ 		 
 
 t  r   c                   |    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zed
             Zed             Zd Zd ZdS )	Tokenizerc                     t          |          }	 |j        | _        n#  d | _        Y nxY wt          |          | _        d| _        d| _        g | _        d | _        d S )NrW   r   )iterr   filenamerw   rz   linenostoppersbuffer)rL   frw   s      r   rM   zTokenizer.__init__  s^    Q	!FDMM	! DMMM%[[
	s    	)c                     | S r0   r   rK   s    r   __iter__zTokenizer.__iter__  s    r   c                 j   | xj         dz  c_         t          | j                  x}| _        d |                    d          D             }t          |          dk    r|d         s|d= |rH|d         s@t                              d| j         | j        fz             |r|d         s|d= |r|d         |S )Nr   c                 6    g | ]}|                                 S r   r  r  s     r   r,   z(Tokenizer._next_line.<locals>.<listcomp>  s     444a		444r   	r   z!trailing tab found on line %d: %s)r  r   rw   rz   r   rh   rO   warningrL   rz   s     r   
_next_linezTokenizer._next_line  s    q
+++ty444::d#3#3444t99>>$q'>Q 	R 	KK;t{DI>VVWWW tBx H  tBx r   c                     	 |                                  }|r(|d         r |d         d         dk    s|d         dk    r|S ?)NTr   %r>  )r  r  s     r   _next_nonemptyzTokenizer._next_nonempty  sS    	??$$D Q T!WQZ3%6%6$q'\:Q:Q		r   c                 X    | j         r| j         }d | _         |S |                                 S r0   )r  r  rL   rets     r   _next_bufferedzTokenizer._next_buffered  s1    ; 	)+CDKJ&&(((r   c                     |                                  }|d                                         | j        v r|| _        t          |S r  )r  r   r  r  StopIterationr  s     r   __next__zTokenizer.__next__  s>    ""$$7==??dm++DKr   c                 *    |                                  S r0   )r  rK   s    r   r   zTokenizer.next  s    }}r   c                     | j         s,	 |                                 | _         n# t          $ r Y d S w xY w| j         d                                         | j        v rd S | j         S r  )r  r  r  r   r  rK   s    r   r   zTokenizer.peek  st    { 	"1133    tt;q>!!T]224{s   # 
11c                 6    |                                  }||ndS )N)rW   )r   r  s     r   r   zTokenizer.peeks  s    iikkoss50r   c              #      K   |dz   }|dz   }|                      |           | j                            |           d V  | j        d= |                     |dz              d S )Nz beginz endr  )expectendswithr  rR   r?  )rL   r  startends       r   rg   zTokenizer.between  sq      hFlE"""S!!!M"C&L!!!!!r   c              #      K   t          |          t          ur|f}| j                            |           d V  | j        t	          |           d = d S r0   )rQ   r   r  extendrh   )rL   tagss     r   r  zTokenizer.until  sY      ::U""7DT"""M3t99*,,'''r   c                     t          |           }|d                                         }||k    sJ d|d|d            |S )Nr   z
Expected '', got '')r   r   rL   r&   rz   r  s       r   r?  zTokenizer.expect
  sE    Dzz1gmmooaxxxxaaa=xxxr   c                     t          |           }|d                                         }|                    |          sJ d|d|d            |S )Nr   zExpected '*r  r  )r   r   r   r  s       r   r  zTokenizer.expectendswith  sQ    Dzz1gmmoo||AEEEaaa EEEEr   N)r   r   r   rM   r  r  r  r  r  r   r   r   r	   rg   r  r?  r  r   r   r   r  r    s            
 
 
  ) ) )      1 1 1 " " ^" ( ( ^(      r   r  c                 D    t          |           }t          |||          S )a=  Convert a Monotype font layout file to an OpenType layout object

    A font object must be passed, but this may be a "dummy" font; it is only
    used for sorting glyph sets when making coverage tables and to hold the
    OpenType layout table while it is being built.

    Args:
            f: A file object.
            font (TTFont): A font object.
            tableTag (string): If provided, asserts that the file contains data for the
                    given OpenType table.

    Returns:
            An object representing the table. (e.g. ``table_G_S_U_B_``)
    rF  )r  r  )r  r   rF  rw   s       r   buildr    s$      aLLEeTH5555r   c                 <   ddl }ddlm} ddlm} | |j        dd         }  |             ddl}|                    dt          j	                  }|
                    dd	d
dd           |
                    ddddd           |
                    dd
t          dd           |                    |           } |+| j        rt          j        | j                  }n
 |            }| j        D ]-}t"                              d|           t'          |dd          5 }t)          ||| j                  }ddd           n# 1 swxY w Y   |                    |          }	|                                }
|
                    |	|           ddlm} |j        }|                    |j                  }|                    |           |                                 |
                    ||           |                     |           |                                 /dS )zConvert a FontDame OTL file to TTX XML

    Writes XML output to stdout.

    Args:
            args: Command line arguments (``--font``, ``--table``, input files).
    r   N)configLogger)MockFontr   zfonttools mtiLib)descriptionz--fontz-fFILEr   zDInput TTF files (used for glyph classes and sorting coverage tables))metavardesthelpz--tablez-tTABLErF  z7Table to fill (sniffed from input file if not provided)inputs+zInput FontDame .txt files)r  rQ   nargsr  zProcessing %srtz	utf-8-sig)encodingr  )	xmlWriter)!sys	fontToolsr  fontTools.misc.testToolsr  argvargparseArgumentParsermain__doc__add_argumentrW  
parse_argsr   r   r"   r  rO   rP   openr  rF  compile	__class__	decompilefontTools.miscr  	XMLWriterstdoutbegintagnewlinetoXMLendtag)argsr   r  r  r  r  r\  r  rX  blob
decompiledr  r  writers                 r   r  r  +  s    JJJ&&&&&&111111|x| LNNN OOO$$L %  F
 S     F     &s#<W     T""D|9 	<	**DD8::D[  		/1%%%!TK000 	;A!TDM:::E	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;}}T""__&&
T4((( 	-,,,,,n$$SZ00&&&c% s   EE	E	__main__r0   )NN)br  r   fontTools.ttLib.tables._c_m_a_pr   fontTools.ttLib.tablesr   re   fontTools.ttLib.tables.otBaser   r   fontTools.otlLibr   r   
contextlibr	   fontTools.ttLibr
    fontTools.feaLib.lookupDebugInfor   r   operatorr   rU  logging	Exceptionr   r   r   r   	getLoggerrO   r'   r.   r6   r9   rF   r  rH   r   r   r   r   r   r   r   r   r
  r  rh  r  r  r$  r,  r8  r`  objectrb  rn  rq  rv  rz  r}  r  rl   r  r  r  r   r  r  r   r   r  r  r  r  r"  r%  r(  r-  rK  r]  ra  rd  ri  rp  rv  ry  r  r  r  r  r  r  r  r   r  r  r   r   r   <module>r     s          8 8 8 8 8 8 1 1 1 1 1 1 L L L L L L L L + + + + + + % % % % % % $ $ $ $ $ $ X X X X X X X X       				 	 	 	 	 	) 	 	 		 	 	 	 	[ 	 	 		 	 	 	 	1 	 	 		 	 	 	 	0 	 	 	 g*++  % % %
 
 

 
 
$ $ $ $ $ $ $ $d $ $ $,9 9 9 9x   B  B1 1 1 13 3 3 34 4 4 43 3 3 3I I I I] ] ] ]@" " " " 9    K K K K     "  05 5 5p8 8 8 8 8 8 8 8"    z       z       :   A A A AA A A AE E E E@ @ @= = =
K7 K7 K7 K7 K7F K7 K7 K7\    )+     &([ 0 0 0 0 &([     &([ - - - -1 1 1:Q Q Q QhJ J J JH H H HO O O OM M M M   42 2 2 2j@ @ @F. . .. . .B B B
H 
H 
H  - - -  B  2     8` ` ` ` ` ` ` `F6 6 6 6(G G G GT zJJJCHTTVV r   