
    <`                         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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dUdZ dVdZ!d Z"dUdZ#dUdZ$dUdZ%dUdZ&dUd Z'dUd!Z(dUd"Z)ej*        fd#Z+dUd$Z,d% Z-d& Z.d' Z/d( Z0 G d) d*e1          Z2 G d+ d,e2          Z3 G d- d.e2          Z4 G d/ d0e2          Z5dUd1Z6dUd2Z7dUd3Z8d4 Z9d5 Z: G d6 d7e1          Z;dUd8Z<ej=        fd9Z>ej?        fd:Z@ej=        fd;ZAej=        fd<ZBd= ZCdUd>ZDdUd?ZEdUd@ZFdUdAZGdUdBZHdUdCZIdUdDZJdE ZKdF ZLdG ZMdH ZNdI ZOdJ ZPdK ZQdL ZRdM ZSdN ZTdUdOZU G dP dQe1          ZVdUdRZWdVdSZXeYdTk    rd dlZZZ eZj[         eX                       dS dS )W    )ttLib)cmap_classes)otTables)ValueRecordvalueRecordFormatDict)builder)contextmanager)setitemNc                       e Zd ZdS )MtiLibErrorN__name__
__module____qualname__     9lib/python3.11/site-packages/fontTools/mtiLib/__init__.pyr   r                r   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    bqbE\		$	$S122^^	4	44etmm	s1QRR5zz	!!	sa81<	      	r   c                     d | D             S )Nc                 ,    g | ]}t          |          S r   )r$   ).0gs     r   
<listcomp>zmakeGlyphs.<locals>.<listcomp>%   s    !!!!1!!!r   r   )ls    r   
makeGlyphsr+   $   s    !!q!!!!r   c                 v    |'	 ||          }n,# t           $ r t          |           w xY wt          |           }|S N)KeyErrorr   r!   symmappingidxs      r   	mapLookupr3   '   sU     "	33	 " " "	S	!	!!" 	C#s    'c                     	 t          |           }n7# t          $ r* 	 ||          }n# t          $ r t          |           w xY wY nw xY w|S r-   )r!   
ValueErrorr.   r   r/   s      r   
mapFeaturer6   3   sv    #C## # # ##	33	 # # #	c	"	""# 3#
 	s#    
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 r-   r   )ref
collectionkeysetters    r   <lambda>zsetReference.<locals>.<lambda>E   s    66*c3+G+G r   )r   addDeferredMappingAttributeError)mapperr1   r0   r<   r:   r;   mappedes      ```  r   setReferencerC   ?   s    	6#w&&   GGGGGGaPPP
FFFFF  
   4 
C     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 r-   )_deferredMappingsselfs    r   __init__zDeferredMapping.__init__N   s    $r   c                     t                               d|t          |          j                   | j                            |||f           d S )Nz*Adding deferred mapping for symbol '%s' %s)logdebugtyper   rG   append)rI   r<   r0   rB   s       r   r>   z"DeferredMapping.addDeferredMappingQ   sE    ))8#tAww?OPPPQ00000r   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)rG   rL   rM   rN   r   r.   )rI   r<   r0   rB   rA   s        r   applyDeferredMappingsz%DeferredMapping.applyDeferredMappingsU   s    , " "lfS99;S$q''BRSSS#YFF
   
G	6&>>>99[&!!!!$s   AAN)r   r   r   rJ   r>   rQ   r   r   r   rE   rE   L   sA          1 1 1	 	 	 	 	r   rE   c                 p   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        }nct          j                    }|_        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>w   s%    <<<11;)#;#;Q#;#;#;r   r   defaultr   c                     | j         S r-   )
LangSysTagrecs    r   r=   z!parseScriptList.<locals>.<lambda>   s
    TWTb r   r;   c                     | j         S r-   rX   r^   s    r   r=   z!parseScriptList.<locals>.<lambda>   s    S] r   )ot
ScriptListbetweenlenrO   rL   rM   LangSysLookupOrderrC   r6   setattrrU   stripSplitCommaFeatureIndex	enumerater
   FeatureCountScriptScriptRecordrY   DefaultLangSysLangSysRecordLangSysCountr]   sortedScriptCount)lines
featureMaprI   recordsline
langSysTagdefaultFeaturefeatureslangSyssymstheListir0   script	scriptRec
langSysRecrZ   s                   @r   parseScriptListr   a   s   
mmN## '4 '4 &4 &4d	TQKKOOO 
TQ5929j.(992IzJJJZ\\77 %Z'K\]]]]$G
(
#
#4%&C#d))O37'$ C CuqZgwBBBBg2337<<<<<<<6 
AYFF!!I#Iy{{INN9F FFFI#F!##J&a#j//.A)BBJ J

+++f233FM&4'4 '4 '4 '4 '4 '4 '4 '4 '4 '4 '4 '4 '4 '4 '4R  d dV &v}'BHbHb c c c&-G)B)BCCC)**s   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)rb   FeatureListFeatureRecordrd   re   r!   r5   
FeatureTagFeaturerO   FeatureParamsri   LookupListIndexrk   rC   r3   r
   LookupCountrl   )rt   	lookupMapru   rI   rw   name
featureTaglookups
featureRecfeaturer|   r}   r~   r0   s                 r   parseFeatureListr      s   
mmO$$ 6 6 6 6d#4Wz!!!#?$#F!!!4-..Jt	t99D./////D#dFXBYBY;Z1Z////
 	 	 	D	 "":%:
:Z(((77
'
"
"4(,vD		'997W$ A AuqIsGWa@@@@W4557)66 6 6 6 6 6 6 6 6 6 6 6 6 6 6. +,,s7   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   rS      )r   r   r   r   )yesnor   r   r   r   )peekslowernextgetr!   )rt   flags	filtersetallFlagsrw   flags         r   parseLookupFlagsr      sq   	
   {{}}Q8++	e$	
 

 	Sa  
 
q'--//]
*
*
*DG
*
*
*
1gmmoo	TME	!W]]__,,,CQLLA5	!W]]__(((D=547||9% {{}}Q8++& 	yr   c                     i }| D ]?}t          |          dk    s
J |            t          |          }|d         ||d         <   @t          j        |          S )Nr   r   r   )re   r+   otlbuildSingleSubstSubtablert   font
_lookupMapr1   rw   s        r   parseSingleSubstr      sb      T	Ta	D		$!W'$q'$W---r   c                 |    i }| D ]$}t          |          }|dd          ||d         <   %t          j        |          S Nr   r   )r+   r   buildMultipleSubstSubtabler   s        r   parseMultipler      sM      T	D		$!""X'$q'&w///r   c                 |    i }| D ]$}t          |          }|dd          ||d         <   %t          j        |          S r   )r+   r   buildAlternateSubstSubtabler   s        r   parseAlternater      sM      T	D		$!""X'$q''000r   c                     i }| D ]N}t          |          dk    s
J |            t          |          }|d         |t          |dd                    <   Ot          j        |          S )Nr   r   r   )re   r+   tupler   buildLigatureSubstSubtabler   s        r   parseLigaturer      sl     % %T	Ta	D		$!!W'%QRR//&w///r   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 )NrV   r   r   rT   r   r   )re   titlereplacer   r$   r!   r   hasattrrh   r   buildSinglePosSubtablegetReverseGlyphMap)rt   r   r   valuesrw   wr(   vs           r   parseSinglePosr      s    
 	 	T	Ta
1gmmooc2&&!	
#	#	#	#	#Q!	$q'll!f__}}6!9VAY""**QF***	&)Q"64+B+B+D+DEEEr   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   rS   r   rT   rV   r   r`   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>2  s=      'W'W#ak.@.@.B.B*C*C(C'W'W'W'W'W'Wr   c                 4    g | ]}t          j                    S r   )rb   Class1Recordr'   r~   s     r   r)   zparsePair.<locals>.<listcomp>3  s     JJJQr((JJJr   c                 4    g | ]}t          j                    S r   )rb   Class2Record)r'   js     r   r)   zparsePair.<locals>.<listcomp>5  s     KKKa))KKKr   c              3   4   K   | ]}t          |          V  d S r-   r!   r'   xs     r   r   zparsePair.<locals>.<genexpr>?  s(      66qCFF666666r   )+rb   PairPosValueFormat1ValueFormat2r   splitr   Formatre   r   r   r   r+   r!   r   r   rh   makeCoveragesetkeysCoveragePairSetglyphsPairValueRecordrr   
getGlyphIDSecondGlyphValue1Value2rO   PairValueCountPairSetCountendswithpeek	ClassDef1	ClassDef2parseClassDefClass1CountClass2Countranger   r   r   )rt   r   r   rI   typr   rw   sidewhatmaskglyph1glyph2valuerec2vrvalues1pairsetrv   values2pairr   r2   r   rec1class1class2s                             r   	parsePairr     s   

)**T&{{}}Q"((**$+&  d
d))q...$...
q'--//!

"
"
$
$4
#
#
#
#T
#
#
#
q'#d))**

#
#
%
%
-
-c2
6
64

%a
(4tAaCy))>66tAw<<5
F

RF6N
F6N
"
"kmmKMM=ZF6N6$:
.
 4
fnn	aBB	aBb$++"d+++
2tUs6;;==11488$-$,$    fF^7Z\\7'))7W$DO<<<  vfoGDD!*DK $ 1;'!**tDKNN4 7887<w$,''$	ll7 +$+Tl)a!!":;; <	a8378888	9	?	?	A	A3  	
93u C.
 
 
 !%U;;;9S> 	a!!":;; < $- $.$.'W'WY'W'W'W$$D$JJ%8H2I2IJJJ$    dKK59I3J3JKKK4     t--DK--DKK    d
d))q...$...
q'--//!

"
"
$
$4
#
#
#
#T
#
#
#
q'#d))**

#
#
%
%
-
-c2
6
64

%a
(466D1I666665

F
#
0
84
fnn	BB	Bb$++"d+++
2tU % %d  % %td/==DK		%+d/=== $ 	KK%
 s4>#;#@#@#B#BCCTJJ$--C---r   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  )rt   r   r   r   s       r   parseKernsetr
  T  s    {{}}Q"((**{{RSS ! !
E4
 
 ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! !%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   rT   )re   r   intSplitCommaXCoordinateYCoordinater!   AnchorPoint)datar   anchors      r   
makeAnchorr  [  s|    D		Q
%'')6tAw)?)?&F&IIMMd1gmm&-47||&r   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)rV   rS   r   r   )entryexitr   )	re   rb   EntryAnchor
ExitAnchorr$   r  r   buildCursivePosSubtabler   )rt   r   r   rv   rw   r2   r   glyphs           r   parseCursiver  e  s     
4 
4T	Te			T			r~r}  	G)#e DG

%
'$K75>			$	$ucl	$	$	$"48U33'%.#GT-D-D-F-FGGGr   c                     g }|j         D ]S}| |         \  }}|                                }||_        t          ||j        |           |                    |           T|S r-   )r   MarkRecordClassClassrh   
MarkAnchorrO   )r  coverager   rv   r  r   r  records           r   makeMarkRecordsr!  t  sk    o  Uu+-%&&,	&!,'''	..r   c                    g }i }|j         D ]Y}t          |          ||<   |                                }d g|z  }t          ||j        |           |                    |           Z|                                 D ]D\  \  }}	}
|||                  }t          ||j                  }||	         J ||	f            |
||	<   E|S r-   )r   re   BaseRecordClassrh   
BaseAnchorrO   itemsgetattr)r  r  r   
classCountrv   r2   r  r   anchorsr   r  s              r   makeBaseRecordsr)  ~  s    	o  U7||#e*&FZ'	&!,(((	..!ZZ\\  ]eE63u:&FAL))'			%			'%..r   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    222!!222r   c                 4    g | ]}t          j                    S r   )rb   ComponentRecordr   s     r   r)   z'makeLigatureRecords.<locals>.<listcomp>  s!    LLLaR/11LLLr   r   )
re   r   rk   r%  rb   LigatureAttachComponentCountr   r.  LigatureAnchor)r  r  r   r'  rv   r2   r  r   compIdx	compCountr  r   compRecr(  s                 r   makeLigatureRecordsr5    s<   6C(((22y11222/3zz||  +$eE')V3u:&^"$"3"5"556GCJ$6LL5;K;KLLL6( 1 1w"Vj0G		)	+	+	+eV5JI-V	+	+	+"7Q;/>'			%%!8			'%..r   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   r9  r   c              3   4   K   | ]}t          |          V  d S r-   r   r   s     r   r   z'parseMarkToSomething.<locals>.<genexpr>  s(      66AQ666666r   rV   r7  c              3   ,   K   | ]\  }}|d          V  dS r   r   )r'   kr   s      r   r   z'parseMarkToSomething.<locals>.<genexpr>  s*      /Q/Q1!/Q/Q/Q/Q/Q/Qr   c                     g | ]
}|d          S )r   r   )r'   r<  s     r   r)   z(parseMarkToSomething.<locals>.<listcomp>  s    !@!@!@1!A$!@!@!@r   Ligature)!Typer   MarkAnchorClassBaseAnchorClassr$   r   r!   r  r   r   r   r   MarkCoverageClassMarkArrayClassr!  rh   
MarkRecord	MarkCountre   MarkCoverage	MarkArray
ClassCountr%  r'  BaseCoverageClassBaseArrayClassBaser5  r)  
BaseRecord	BaseCountBaseCoverage	BaseArray)rt   r   r   rI   markDatabaseDataDatamaxKlassrw   r   r  r  anchorClass
extraItemsextrasr   r  r;   r   markCoverage	markArraymarkRecordsbaseCoverage	baseArraybaseRecordss                            r   parseMarkToSomethingr]    s   	a'(a'(*+	 	
  " "TQ#	,	,	,	,	,
DG

%3i$:%%qq1*66a*n!566666&
d1Z< 
!
!%d1Z<==);77&F]]eF^u33uf$fu3	D#$s)5!!(( S1149LMMxq99AL+...AK[!1!1222q~|,,,q{I&&&a< %Q11!C/Q/Q@P@P/Q/Q/Q,Q,Q*QS!@!@!@!@!@AA4I\]]Fj#HlAtOO++,4?KK+AL+...AK[!1!1222q~|,,,q{I&&&r   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)MarkrK  )r   ArrayCountRecordAnchorra  )rc  rd  re  LigatureRecordr/  rc  r  )r&  rh   rb   )rI   WhichWhatr;   r   r   s         r   rJ   zMarkHelper.__init__  s     ' 'eA ' 't
$,C4#@@@UUT5!!D(U   UD#uwRUT3w;&&&'' 'r   Nr   r   r   rJ   r   r   r   r_  r_    s#        ' ' ' ' 'r   r_  c                   $    e Zd ZdZdZej        ZdS )MarkToBaseHelperra  rK  N)r   r   r   ra  rK  rb   MarkBasePosr?  r   r   r   rk  rk    s        
r   rk  c                   $    e Zd ZdZdZej        ZdS )MarkToMarkHelperMark1Mark2N)r   r   r   ra  rK  rb   MarkMarkPosr?  r   r   r   rn  rn    s        
r   rn  c                   $    e Zd ZdZdZej        ZdS )MarkToLigatureHelperra  r>  N)r   r   r   ra  rK  rb   
MarkLigPosr?  r   r   r   rs  rs    s        
r   rs  c                 <    t          | |t                                S r-   )r]  rk  rt   r   r   s      r   parseMarkToBaserw        UD*:*<*<===r   c                 <    t          | |t                                S r-   )r]  rn  rv  s      r   parseMarkToMarkrz    rx  r   c                 <    t          | |t                                S r-   )r]  rs  rv  s      r   parseMarkToLigaturer|    s    UD*>*@*@AAAr   c                 H    | rd |                      d          D             ng S )Nc                 6    g | ]}|                                 S r   stripr'   r#   s     r   r)   z#stripSplitComma.<locals>.<listcomp>  s     ,,,q,,,r   ,r   rw   s    r   ri   ri     s+    04<,,DJJsOO,,,,"<r   c                 H    | rd |                      d          D             ng S )Nc                 ,    g | ]}t          |          S r   r   r   s     r   r)   z!intSplitComma.<locals>.<listcomp>  s    )))AQ)))r   r  r  r  s    r   r  r    s+    -19))C))))r9r   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   rV   rT   r   LookupRecordc                     | j         S r-   r   rs    r   r=   z(ContextHelper.__init__.<locals>.<lambda>      
 r   c                     | j         S r-   r  r  s    r   r=   z(ContextHelper.__init__.<locals>.<lambda>      QZ r   c                     dS )Nr-   r   r  s    r   r=   z(ContextHelper.__init__.<locals>.<lambda>  s    ' r   c                     dS )N)NNNr   r  s    r   r=   z(ContextHelper.__init__.<locals>.<lambda>   s    1 r   c                     | j         fS r-   )Inputr  s    r   r=   z(ContextHelper.__init__.<locals>.<lambda>#  
    z r   c                 *    | j         | j        | j        fS r-   	Backtrackr  	LookAheadr  s    r   r=   z(ContextHelper.__init__.<locals>.<lambda>$      Q[!'1;? r   c                 >    |\  | _         d |D             \  | _        d S )Nc              3   :   K   | ]}t          |          d z   V  dS r   re   r   s     r   r   z>ContextHelper.__init__.<locals>.SetRuleData.<locals>.<genexpr>'  ,      ++As1vvax++++++r   )r  
GlyphCountr  ds     r   SetRuleDataz+ContextHelper.__init__.<locals>.SetRuleData%  &    JQW+++++OQ\\\r   c                     |\  | _         | _        | _        t          |d                   t          |d                   dz   t          |d                   c| _        | _        | _        d S Nr   r   r   r  r  r  re   BacktrackGlyphCountInputGlyphCountLookAheadGlyphCountr  s     r   ChainSetRuleDataz0ContextHelper.__init__.<locals>.ChainSetRuleData(  c    *+'Q[!'1;HKAaD		RUVWXYVZR[R[\]R]^abcdebf^g^gDQ1,Q-B-B-Br   r   c                     | j         S r-   r  r  s    r   r=   z(ContextHelper.__init__.<locals>.<lambda>,  r  r   c                     | j         S r-   r  r  s    r   r=   z(ContextHelper.__init__.<locals>.<lambda>-  r  r   c                     | j         fS r-   ClassDefr  s    r   r=   z(ContextHelper.__init__.<locals>.<lambda>.  s
    1:- r   c                 *    | j         | j        | j        fS r-   BacktrackClassDefInputClassDefLookAheadClassDefr  s    r   r=   z(ContextHelper.__init__.<locals>.<lambda>/  s     3?   r   c                     |\  | _         d S r-   r  r  s     r   SetContextDataz.ContextHelper.__init__.<locals>.SetContextData2  s    MQZZZr   c                 0    |\  | _         | _        | _        d S r-   r  r  s     r   SetChainContextDataz3ContextHelper.__init__.<locals>.SetChainContextData4  s"     Q_r   c                     | j         fS r-   )r  r  s    r   r=   z(ContextHelper.__init__.<locals>.<lambda>8  r  r   c                 *    | j         | j        | j        fS r-   r  r  s    r   r=   z(ContextHelper.__init__.<locals>.<lambda>9  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>A  s    
1 r   c                     | j         d         S r  )InputCoverager  s    r   r=   z(ContextHelper.__init__.<locals>.<lambda>B  s    Q_Q/ r   c                     | j         S r-   r  r  s    r   r=   z(ContextHelper.__init__.<locals>.<lambda>G  r  r   c                 0    | j         | j        z   | j        z   S r-   )BacktrackCoverager  LookAheadCoverager  s    r   r=   z(ContextHelper.__init__.<locals>.<lambda>H  s    Q0		 r   c                 >    |\  | _         d |D             \  | _        d S )Nc              3   4   K   | ]}t          |          V  d S r-   r  r   s     r   r   z>ContextHelper.__init__.<locals>.SetRuleData.<locals>.<genexpr>M  s(      ))!s1vv))))))r   )r   r  r  s     r   r  z+ContextHelper.__init__.<locals>.SetRuleDataK  s&    MQZ))q)))OQ\\\r   c                 n    |\  | _         | _        | _        d |D             \  | _        | _        | _        d S )Nc              3   4   K   | ]}t          |          V  d S r-   r  r   s     r   r   zCContextHelper.__init__.<locals>.ChainSetRuleData.<locals>.<genexpr>P  s)      GZGZSTAGZGZGZGZGZGZr   )r  r  r  r  r  r  r  s     r   r  z0ContextHelper.__init__.<locals>.ChainSetRuleDataN  s@    BC?Q!/1+>GZGZXYGZGZGZDQ1,Q-B-B-Br   zunknown format: %sRule	RuleCountRuleSetRuleSetCountc                     || v r|gng S r-   r   r   r   r  s      r   r=   z(ContextHelper.__init__.<locals>.<lambda>f  s    V! 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>l  s<    ! +6!*;*;FA*F*F*F#$66CKKKsuu r   r  r  r  r  )r   
startswithTypr?  r  ChainTypInputIdxDataLenr  r   ContextDatar  RuleDatar  r  r  r  r  	Intersectr  ClassDefIndexr  )rI   	klassNamer   r  r?  r  r  r  r  r   ChainCoverager  ChainContextDatar  r  r  ChainRuleDatar  r  s                      r   rJ   zContextHelper.__init__  s>      	3
44	3
4'"" 58775873Y($($)$*$-$-$,>)$q[[""8''=!!;11>!!8??=, , ,i i i i {{""8''='';        "!8??=, , ,i i i i {{%%8//=;>""8 =* * *[ [ [ [ +!F****
 " 4=&4,4 4=&44=!4'44=!4q[[49[(4>9$4<.4CC4>>>{{#49--4>:%4</47 74> ',;??4=")4 -g4::: {r   Nri  r   r   r   r  r    s(        o. o. o. o. o.r   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&  rb   ri   re   r!   SequenceIndexrC   r3   rh   rO   )r%  r  r   r   lstitemr_   r2   s           r   parseLookupRecordsr  s  s    	Y			  T#			$	TaDG#	q#Ag#y)T!Wgs<MNNN**S////r   c                 J    | sd S  |            }t          |           |_        |S r-   )dictr   )r   r   r   rI   s       r   makeClassDefr    s)    $$y//r   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   )rd   r$   r!   r  )rt   r   r   r   rw   r  s         r   r   r     s    mm&'' # # # #dT!W5
y
 
 
 %
 
 
 $q'll9U## # # # # # # # # # # # # # #
 	Ye,,,s   AA&&A*-A*c                     | sd S t          | t                    rt          |           }  |            }t          t          |           |j                  |_        |S )Nr`   )
isinstancer   rr   r   r   )r   r   r   r  s       r   r   r     sU    ttvs &>>&EGG#f++4?;;;r   c                     g }|                      d          5  | D ]*}|                    t          |d                              +	 d d d            n# 1 swxY w Y   t          |||          S )Nzcoverage definitionr   )rd   rO   r$   r   )rt   r   r   r   rw   s        r   parseCoverager    s    
mm)** % % % %d	==47##$$$$%% % % % % % % % % % % % % % % 	VT5)))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>  sD      :s:s]`]^_`1!QZ--QQUV=W=W;X:s:s:s:s:s:sr   rc  )
setdefaultr  rO   r   rk   r&  rb   r  r  rh   r?  re   r  r  r  r  )rI   r   rules
bucketKeysbucketsseqrecsrulesets
firstGlyph	thisRulesrulerulesets    `          r   bucketizeRulesr    s    | |XS	S_Q',,33U:s:s:s:sdmnqdrdr:s:s:s5s5suy4z{{{{  Zw??4)*%  hc$
'"af



4==s
4T+++
4&&&D"GB	""$$'	'169%%%	'1;I///
//'qy(###q~s8}}-----r   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 %srT   c              3   N   K   | ] }t          t          |                    V  !d S r-   )r+   ri   r   s     r   r   zparseContext.<locals>.<genexpr>  s2      KK!z/!,,--KKKKKKr   c              3   D   K   | ]\  }}|j                  d          V  dS r   Nr  r'   r  r  r   s      r   r   zparseContext.<locals>.<genexpr>  s2      ==83tC
OA&======r   r   r   r   )	backtrackrT   	lookahead)r   rV   r   c              3   4   K   | ]}t          |          V  d S r-   )r  r   s     r   r   zparseContext.<locals>.<genexpr>  s*      ==A}Q======r   c              3   D   K   | ]\  }}|j                  d          V  dS r  r  r	  s      r   r   zparseContext.<locals>.<genexpr>  s2      >>HCS_Q'>>>>>>r   c              3   *   K   | ]\  }}|v 	|V  d S r-   r   )r'   r(   r   firstClassess      r   r   zparseContext.<locals>.<genexpr>  s2      ^^#!AAQ]L]L]AL]L]L]L]^^r   r  rV   c              3      K   | ]}g V  d S r-   r   r   s     r   r   zparseContext.<locals>.<genexpr>  s"      111B111111r   coverage definition begin)r
  inputr  rc  )*r&  rb   r   r   r   r   rL   rM   r  re   r  rO   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  listrh   r?  )rt   r   r?  r   rI   r   r  rw   r  r  firstGlyphsr   r2   r   	coveragesr   r  s                  @@r   parseContextr    s   D{{}}Q"((**7NN$+))"D$+666D$+&&!
%  d
q'--//W
$
$
$d1g
$
$
$	TQqy[	 	 $++b///TQqy[	 	 	KKtAa	kM7JKKK	K	K3
T!AI+,,/
K
K4<<d====u=====+{D11$-q%!56666	ll7 :$+))"D$+666D$+&&!fqy )a!!":;; <	a8378888	9	?	?	A	A3 !BK B()
B	B() 		 	 Y	 	93u C.
 
 #
 
 
 !%U;;;9S> 	a!!":;; < 4###
%  d
q'--//
$
$W
-
-66tAw666	TQqy[	 	 $++b///TQqy[	 	 	==a!)m)<===	=	=3
T!AI+,,/
K
K4<<d>>>>>>>>>,^^^^1:!6!@!F!F!H!H^^^^^+{D11$-q%s<'8'81'<!=!=>>>>	ll: $+))"D$+666D$+&&!11ai 0 011111)a!!"=>> B	a;3:;;;;	<	B	B	D	D3 !BK B() !B() 		 	 Y	 	93u S>ud%@@@AAA 	a!!"=>> B --i   
u++%	Uq	q$	aJ	&	&	&Q	&	&	&	DHani	@	@$	$wD		***	$%%%%C---r   c                 (    t          | |d|          S )NContextSubstr   r  rt   r   r   s      r   parseContextSubstr    s    UD.IFFFFr   c                 (    t          | |d|          S )N
ContextPosr  r  r  s      r   parseContextPosr  
  s    UD,)DDDDr   c                 (    t          | |d|          S )NChainContextSubstr  r  r  s      r   parseChainedSubstr"    s    UD"5KKKKr   c                 (    t          | |d|          S )NChainContextPosr  r  r  s      r   parseChainedPosr%    s    UD"3yIIIIr   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<  r1   s     r   r)   z,parseReverseChainedSubst.<locals>.<listcomp>&  s    ===1GAJ===r   )rb   ReverseChainSingleSubstr   r   r   r   re   r   r  r  rO   r  r  r  r+   r   r   r   r   r   
Substituter  )
rt   r   r   rI   r  r   r2   r   rw   r1   s
            @r   parseReverseChainedSubstr*    s   
"$$"X{{}}Q  !<== A

Q:#9::::;AACC#2'(2'(  	)#e C.eT???@@@ {{}}Q  !<== A $A, 677#A, 677  T	Ta	D		$!W'$q'c',,..11488====(<===t''r   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   rV   rS         r   )singlemultiple	alternater9  contextchainedreversechained   )	r/  r  kernsetcursivezmark to basezmark to ligaturezmark to markr2  r3  GSUBGPOSz
lookup end)
% subtablezsubtable endr   )!expectrL   rM   rb   Lookupr   
LookupFlagMarkFilteringSetr   r   r   r   r  r"  r*  r   r  r
  r  rw  r|  rz  r  r%  
LookupTyper	  r   rO   r   r   SubTablere   SubTableCount)rt   tableTagr   r   rw   _r   r   r,  r   parseLookupSubTable	subtablessubtables                r   parseLookuprH  *  s   XD#&T222
)++/669%& !"=!N#=!#$#$01   	N,,'-.'/"/"
 
+ +* ++* ++''. kk, 
 
)

 233    
**,,  ##E4;;X!44444h **,,                               
 kkmmA888KKK 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 lFO,,
A 
s8   ,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        _                                                                          ||_        |S )Nr8  z
Parsing %s   rc   c                 $    t          |           S r-   )r   )rt   ru   s    r   r=   zparseGSUBGPOS.<locals>.<lambda>i  s    %44 r   r   c                 &    t          |           S r-   )r   )rt   ru   r   s    r   r=   zparseGSUBGPOS.<locals>.<lambda>l  s    !5)Z@@ r   )
LookupListN)zscript table beginzfeature table beginr,  r   Skipping %sr,  zDuplicate lookup name: %sr   )r   getTableClassrE   rL   rM   r&  rb   Versionr   rh   r   r   r   rM  r=  rH  re   r!   rO   r   rQ   table)rt   r   rC  	containerrI   fieldsattrparserr   rD  r   r,  ru   r   s               @@r   parseGSUBGPOSrV  ^  s   *U **,,$$$$$<"""H 44446 @@@@@B	
 
 MMOO  [T&	$dzz||

Q#99]EJJLL)));;;s+$vH__
omooDODO

:1dAxy996y   "="D   $/011IdOOt99DO233333Wc$+FVFV?W5W333?  ((((
$


%
%t
%
%
%
4vve}}%%%+ zz||, 	O < #DO$: ; ;$/!!###""$$$r   c                 $    t          | |d          S )Nr9  rV  rt   r   s     r   	parseGSUBrZ        eT6***r   c                 $    t          | |d          S )Nr:  rX  rY  s     r   	parseGPOSr]    r[  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    ---qCFF---r   r   )rd   r$   r   buildAttachListr   )rt   r   pointsrw   r  s        r   parseAttachListrb    s    
mm%&& . . . .dT!W5
v


u


--DH---6%==.. . . . . . . . . . . . . . .
 	FD$;$;$=$=>>>s   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    ***AQ***r   r   )rd   r$   r!   re   r   buildLigCaretListr   )rt   r   rd  rw   r  num
thisCaretss          r   parseCaretListri    s#   
mmH    dT!W5
v


u


	T!W3**abb***:
Z
 
 
 $
 
 
 6%==               	fb$*A*A*C*CDDDs   A4BB Bc                 D   t          j                    }d|_        dt          |                                           z   |_        d g|j        z  |_        t          |                                           D ]*\  }}t          t          |          |          |j        |<   +|S )Nr   )rb   MarkGlyphSetsDefMarkSetTableFormatr   r   MarkSetCountr   rr   r%  r   r   )setsr   rI   r<  r   s        r   makeMarkFilteringSetsro    s    
TYY[[)))$++4::<<   0 0SQq!#a&&$//$-r   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   )rd   re   r$   r!   rO   ro  )rt   r   rn  rw   r  sts         r   parseMarkFilteringSetsrr    s    
mm$%%    d
d))q...$...T!W5DG2nnDH8??5               	dD)))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   rb   ru  rY  s     r   r=   zparseGDEF.<locals>.<lambda>  s    eT9IJJJ r   
AttachListLigCaretListMarkAttachClassDefc                 :    t          | |t          j                  S rw  )r   rb   rz  rY  s     r   r=   zparseGDEF.<locals>.<lambda>  s    eT9NOOO r   rk  )r   zattachment list beginzcarets beginz&mark attachment class definition beginzmarkfilter set definition beginr   rN  rJ  i  )r   rO  rL   rM   rb   rt  rb  ri  rr  r   rh   r   r   r   r&  rk  rP  rQ  )rt   r   rR  rI   rS  rT  rU  r   s           r   	parseGDEFr|    s   (U ((**>
		 JJL /"N#OOQ ./  MMOO  [T&	$dzz||

Q#99]C   ;;;s+$v	t			$	$d	$	$	$	$ffUD))*** zz|| #3;

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'   fieldrt   s     r   r)   zparseCmap.<locals>.<listcomp>  s9     D D D ueD D Dr   )
platformID
encodingIDformatlanguager   zend subtabler   r   )r   rO  rL   rM   r   r<  re   r   r  	platEncIDr  r~  r   r!   rO   tableVersiontables)
rt   r   rR  r  platIdencIdfmtlangrQ  rw   s
   `         r   	parseCmapr    sW   (U ((**>
zz||,,!CKK/000D D D DBD D D&%d s
C
 
 %%%/%.%*	e$Q>!!"&q'5:c$q'2
u++4 	Q>!! 	-- zz|| r   c                 f    t          |           }||d         k    sJ t          |d                   S )Nr   r   )r   r!   )rt   r  rw   s      r   r  r    s2    UaDG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   rV   zFont Chef TablerS   z7Don't know what table to parse and data doesn't specify)r9  r:  rt  r~  )rL   rM   r   r   joinr   ljustrZ  r]  r|  r  )rt   r   rC  rw   tags        r   
parseTabler    s0   ?GMMOOA*$$Q##	hhtAw}}rr"##'888Q#Ou+++		!#88
c///Hc?///W	



		 	
 	
 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 )NrT   r   )iterr   filenamert   rw   linenostoppersbuffer)rI   frt   s      r   rJ   zTokenizer.__init__  s^    
q''%64==4===E{{$*$)$+$-$+++s    	)c                     | S r-   r   rH   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     	.	.	.!''))	.	.	.r   	r   z!trailing tab found on line %d: %s)r  r   rt   rw   r   re   rL   warningrI   rw   s     r   
_next_linezTokenizer._next_line*  s    ++++$*%%%$	.	.TZZ--	.	.	.$YY!^^DG^Aw	 $r( ;;2dk495MMNNN	 d2h R 
 d2h 	+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_nonempty6  sS    
//

4
 tAw DGAJ#--aL1H1HK	r   c                 X    | j         r| j         }d | _         |S |                                 S r-   )r  r  rI   rets     r   _next_bufferedzTokenizer._next_buffered=  s1    	[  	34;
:




r   c                     |                                  }|d                                         | j        v r|| _        t          |S r  )r  r   r  r  StopIterationr  s     r   __next__zTokenizer.__next__E  s>    					$	!W]]__%%4;		+r   c                 *    |                                  S r-   )r  rH   s    r   r   zTokenizer.nextL  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  rH   s    r   r   zTokenizer.peekO  st    	 %%''DKK
   44	[^t},,
$	s   # 
11c                 6    |                                  }||ndS )N)rT   )r   r  s     r   r   zTokenizer.peeksY  s    		#U*r   c              #      K   |dz   }|dz   }|                      |           | j                            |           d V  | j        d= |                     |dz              d S )Nz beginz endr  )expectendswithr  rO   r<  )rI   r  startends       r   rd   zTokenizer.between]  sq      
.%f#e-s%%%
mB++cFlr   c              #      K   t          |          t          ur|f}| j                            |           d V  | j        t	          |           d = d S r-   )rN   r   r  extendre   )rI   tagss     r   r	  zTokenizer.untilg  sY      	$ZZu'4-t%%%
mSYYJKK   r   c                     t          |           }|d                                         }||k    sJ d|d|d            |S )Nr   z
Expected '', got '')r   r   rI   r#   rw   r  s       r   r<  zTokenizer.expecto  sE    	d$Q#	3337	+r   c                     t          |           }|d                                         }|                    |          sJ d|d|d            |S )Nr   zExpected '*r  r  )r   r   r   r  s       r   r  zTokenizer.expectendswithu  sQ    	d$Q#	a???333????	+r   N)r   r   r   rJ   r  r  r  r  r  r   r   r   r	   rd   r	  r<  r  r   r   r   r  r    s            
 
 
             + + +   . ! ! .!      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_``)
	rC  )r  r  )r  r   rC  rt   s       r   buildr  {  s$      
15$2222r   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TABLErC  z7Table to fill (sniffed from input file if not provided)inputs+zInput FontDame .txt files)r  rN   nargsr  zProcessing %srtzutf-8)encodingr  )	xmlWriter)!sys	fontToolsr  fontTools.misc.testToolsr  argvargparseArgumentParsermain__doc__add_argumentstr
parse_argsr   r   r   r  rL   rM   openr  rC  compile	__class__	decompilefontTools.miscr  	XMLWriterstdoutbegintagnewlinetoXMLendtag)argsr   r  r  r  r  rU  r  rQ  blob
decompiledr  r  writers                 r   r  r    s    ######......L	!""$  

!
!l "  
 XtV&M  O O OYgJ@  B B BXvCs"  $ $ $ 	$L	Y 
,ty
!
!44
(**4
+  Q))OQAtg&&& 2!D4=11152 2 2 2 2 2 2 2 2 2 2 2 2 2 2	t		$  *tT""" '&&&&&#sz**&//#..64   --..# s   EE	E	__main__r-   )NN)\r  r   fontTools.ttLib.tables._c_m_a_pr   fontTools.ttLib.tablesr   rb   fontTools.ttLib.tables.otBaser   r   fontTools.otlLibr   r   
contextlibr	   operatorr
   logging	Exceptionr   r   r   r   	getLoggerrL   r$   r+   r3   r6   rC   r  rE   r   r   r   r   r   r   r   r   r  r
  re  r  r  r!  r)  r5  r]  objectr_  rk  rn  rs  rw  rz  r|  ri   r  r  r  r   r  r  r   r   r  r  r  r  r  r"  r%  r*  rH  rV  rZ  r]  rb  ri  ro  rr  r|  r  r  r  r  r  r  r   r  r  r   r   r   <module>r     sw         8 8 8 8 8 8 1 1 1 1 1 1 L L L L L L L L + + + + + + % % % % % %        " " " " ") " " " / / / / /[ / / / 8 8 8 8 81 8 8 8 7 7 7 7 70 7 7 7 g*++
 
 
" " "
 
 

 
 
! ! !    d   *0 0 0 0d   :  @. . . .0 0 0 01 1 1 10 0 0 0F F F FV V V Vp    9    H H H H       &3 3 3j' ' ' ' ' ' ' '     z       z       :   
> > > >> > > >B B B B= = =: : :p. p. p. p. p.F p. p. p.d    )+     &([ - - - - &([     &([ * * * *. . .4M M M M^G G G GE E E EL L L LJ J J J   22 2 2 2h2 2 2h+ + ++ + +? ? ?
E 
E 
E  * * *  B  .  
   2a a a a a a a aF3 3 3 3(: : : :z z	$$&& r   