U
    »mœd¶  ã                   @   sN  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„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZe d¡Zdd„ Zdd„ Z dd„ Z!dd„ Z"dd„ Z#G dd„ de$ƒZ%d‹d d!„Z&dŒd"d#„Z'd$d%„ Z(d�d&d'„Z)dŽd(d)„Z*d�d*d+„Z+d�d,d-„Z,d‘d.d/„Z-d’d0d1„Z.d“d2d3„Z/ej0fd4d5„Z1d”d6d7„Z2d8d9„ Z3d:d;„ Z4d<d=„ Z5d>d?„ Z6G d@dA„ dAe7ƒZ8G dBdC„ dCe8ƒZ9G dDdE„ dEe8ƒZ:G dFdG„ dGe8ƒZ;d•dHdI„Z<d–dJdK„Z=d—dLdM„Z>dNdO„ Z?dPdQ„ Z@G dRdS„ dSe7ƒZAd˜dTdU„ZBejCfdVdW„ZDejEfdXdY„ZFejCfdZd[„ZGejCfd\d]„ZHd^d_„ ZId™d`da„ZJdšdbdc„ZKd›ddde„ZLdœdfdg„ZMd�dhdi„ZNdždjdk„ZOdŸdldm„ZPdndo„ ZQdpdq„ ZRdrds„ ZSdtdu„ ZTdvdw„ ZUdxdy„ ZVdzd{„ ZWd|d}„ ZXd~d„ ZYd€d�„ ZZd d‚dƒ„Z[G d„d…„ d…e7ƒZ\d¡d†d‡„Z]d¢dˆd‰„Z^e_dŠk�rJd d
l`Z`e` ae^ƒ ¡ d
S )£é    )ÚttLib)Úcmap_classes)ÚotTables)ÚValueRecordÚvalueRecordFormatDict)Úbuilder)Úcontextmanager)ÚnewTable)ÚLOOKUP_DEBUG_ENV_VARÚLOOKUP_DEBUG_INFO_KEY)ÚsetitemNc                   @   s   e Zd ZdS )ÚMtiLibErrorN©Ú__name__Ú
__module__Ú__qualname__© r   r   úR/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/fontTools/mtiLib/__init__.pyr      s   r   c                   @   s   e Zd ZdS )ÚReferenceNotFoundErrorNr   r   r   r   r   r      s   r   c                   @   s   e Zd ZdS )ÚFeatureNotFoundErrorNr   r   r   r   r   r      s   r   c                   @   s   e Zd ZdS )ÚLookupNotFoundErrorNr   r   r   r   r   r   "   s   r   zfontTools.mtiLibc                 C   sx   | d d… dkr*t j t| dd … dƒ¡S | d d… dkrNdt| dd … ƒ S |  d¡dk shtd|  ƒ‚| sttd	ƒ‚| S )
Né   )zU zu é   z# z	glyph%.5dú r   zSpace found in glyph name: %szGlyph name is empty)r   ÚTTFontZ_makeGlyphNameÚintÚfindÚAssertionError)Úsr   r   r   Ú	makeGlyph)   s    r   c                 C   s   dd„ | D ƒS )Nc                 S   s   g | ]}t |ƒ‘qS r   )r   )Ú.0Úgr   r   r   Ú
<listcomp>4   s     zmakeGlyphs.<locals>.<listcomp>r   )Úlr   r   r   Ú
makeGlyphs3   s    r$   c                 C   s@   |d k	r4z||  }W q< t k
r0   t| ƒ‚Y q<X nt| ƒ}|S ©N)ÚKeyErrorr   r   ©ÚsymÚmappingÚidxr   r   r   Ú	mapLookup7   s    r+   c                 C   sP   zt | ƒ}W n> tk
rJ   z||  }W n tk
rD   t| ƒ‚Y nX Y nX |S r%   )r   Ú
ValueErrorr&   r   r'   r   r   r   Ú
mapFeatureD   s    r-   c                    sŒ   z| ||ƒ}W nl t k
rz } zNz2|d k	rP| ‡ ‡‡fdd„||¡ W W Y ¢"d S W n tk
rf   Y nX ‚ W 5 d }~X Y nX ˆˆ ˆ|ƒ d S )Nc                    s   ˆˆ ˆ| ƒS r%   r   )Úref©Ú
collectionÚkeyÚsetterr   r   Ú<lambda>X   ó    zsetReference.<locals>.<lambda>)r   ÚaddDeferredMappingÚAttributeError)Zmapperr)   r(   r2   r0   r1   ÚmappedÚer   r/   r   ÚsetReferenceQ   s      ÿr9   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚDeferredMappingc                 C   s
   g | _ d S r%   )Ú_deferredMappings©Úselfr   r   r   Ú__init__b   s    zDeferredMapping.__init__c                 C   s*   t  d|t|ƒj¡ | j |||f¡ d S )Nz*Adding deferred mapping for symbol '%s' %s)ÚlogÚdebugÚtyper   r;   Úappend)r=   r2   r(   r8   r   r   r   r5   e   s    z"DeferredMapping.addDeferredMappingc              	   C   sj   | j D ]X\}}}t d|t|ƒj¡ z| | }W n tk
rH   |‚Y nX ||ƒ t d|¡ qg | _ d S )Nz,Applying deferred mapping for symbol '%s' %sz	Set to %s)r;   r?   r@   rA   r   r&   )r=   r2   r(   r8   r7   r   r   r   ÚapplyDeferredMappingsi   s      ÿ
z%DeferredMapping.applyDeferredMappingsN)r   r   r   r>   r5   rC   r   r   r   r   r:   a   s   r:   c              
      sÚ  t  ¡ }g }|  d¡��v | D �]h}t|ƒdk r<| d¡ q$|\‰ }}}t dˆ |¡ t  ¡ }d |_|r|t	t
||t|dƒ nd|_t|ƒ}	dgt|	ƒ  |_}
t|	ƒD ]\}}t	t
||t|
|ƒ q¦t|jƒ|_‡ fdd	„|D ƒ}|rð|d
 j}nJt  ¡ }ˆ ddtˆ ƒ   |_t  ¡ |_| |¡ |j}d |_g |_d
|_|dk�rL||_qt  ¡ }|ddt|ƒ   |_||_|j |¡ t|jƒ|_qW 5 Q R X |D ]}t|jjdd„ d�|j_�q˜t|dd„ d�|_t|jƒ|_|S )Nzscript tableé   Ú z#Adding script %s language-system %sÚReqFeatureIndexiÿÿ  é   c                    s   g | ]}|j ˆ kr|‘qS r   ©Ú	ScriptTag©r    r   ©Z	scriptTagr   r   r"   ”   s     
 z#parseScriptList.<locals>.<listcomp>r   r   Údefaultc                 S   s   | j S r%   )Ú
LangSysTag©Úrecr   r   r   r3   ¬   r4   z!parseScriptList.<locals>.<lambda>©r1   c                 S   s   | j S r%   rH   rN   r   r   r   r3   ®   r4   )ÚotÚ
ScriptListÚbetweenÚlenrB   r?   r@   ZLangSysZLookupOrderr9   r-   ÚsetattrrF   ÚstripSplitCommaZFeatureIndexÚ	enumerater   ÚFeatureCountZScriptZScriptRecordrI   ZDefaultLangSysZLangSysRecordZLangSysCountrM   ÚsortedZScriptCount)ÚlinesÚ
featureMapr=   ÚrecordsÚlineZ
langSysTagZdefaultFeatureÚfeaturesZlangSysÚsymsÚtheListÚir(   ÚscriptZ	scriptRecZ
langSysRecr   rK   r   ÚparseScriptListw   sf    
ú	


 ÿrc   c              
   C   s2  t  ¡ }g |_|  d¡�� | D ]ö}|\}}}|d k	rX||ksJtd| ƒ‚t|jƒ||< z,t|ƒt|jƒks‚td|t|jƒf ƒ‚W n tk
r˜   Y nX t  ¡ }||_t  	¡ |_	|j 
|¡ |j	}	d |	_t|ƒ}
d gt|
ƒ  |	_}t|
ƒD ]\}}tt||t||ƒ qît|	jƒ|	_q W 5 Q R X t|jƒ|_|S )Nzfeature tablezDuplicate feature name: %sú%d %d)rQ   ÚFeatureListZFeatureRecordrS   r   rT   r   r,   Z
FeatureTagZFeaturerB   ZFeatureParamsrV   ÚLookupListIndexrW   r9   r+   r   ÚLookupCountrX   )rZ   Ú	lookupMapr[   r=   r]   ÚnameZ
featureTagÚlookupsZ
featureRecÚfeaturer_   r`   ra   r(   r   r   r   ÚparseFeatureList³   s8    
þ
rl   c                 C   sÞ   d}d }ddddddg}|   ¡ d  ¡ |krÖt| ƒ}dd	d
ddœ |d  ¡ ¡}|rŠ|d  ¡ dkspt|d ƒ‚|d  ¡ dkr||O }q|d  ¡ dkr°|t|d ƒd> O }q|d  ¡ dkr|dO }t|d ƒ}q||fS )Nr   ÚrighttoleftÚignorebaseglyphsÚignoreligaturesÚignoremarksZmarkattachmenttypeZmarkfiltertypeé   r   rD   é   )rm   rn   ro   rp   )ÚyesÚnors   r   )ÚpeeksÚlowerÚnextÚgetr   r   )rZ   ÚflagsÚ	filtersetZallFlagsr]   Úflagr   r   r   ÚparseLookupFlagsÔ   s<    úü
ûr|   c                 C   sD   i }| D ]0}t |ƒdks t|ƒ‚t|ƒ}|d ||d < qt |¡S )Nr   rq   r   )rT   r   r$   ÚotlZbuildSingleSubstSubtable©rZ   ÚfontÚ
_lookupMapr)   r]   r   r   r   ÚparseSingleSubstõ   s    r�   c                 C   s4   i }| D ] }t |ƒ}|dd … ||d < qt |¡S ©Nrq   r   )r$   r}   ZbuildMultipleSubstSubtabler~   r   r   r   ÚparseMultipleþ   s
    rƒ   c                 C   s4   i }| D ] }t |ƒ}|dd … ||d < qt |¡S r‚   )r$   r}   ZbuildAlternateSubstSubtabler~   r   r   r   ÚparseAlternate  s
    r„   c                 C   sL   i }| D ]8}t |ƒdks t|ƒ‚t|ƒ}|d |t|dd … ƒ< qt |¡S )Nr   r   rq   )rT   r   r$   Útupler}   ZbuildLigatureSubstSubtabler~   r   r   r   ÚparseLigature  s    r†   c                 C   s¦   i }| D ]Œ}t |ƒdks t|ƒ‚|d  ¡  dd¡}|tks@t‚t|d ƒ}t|d ƒ}||krjtƒ ||< t|| |ƒr„t||fƒ‚t	|| ||ƒ qt
 || ¡ ¡S )NrG   r   r   rE   rq   r   )rT   r   ÚtitleÚreplacer   r   r   r   ÚhasattrrU   r}   ZbuildSinglePosSubtableÚgetReverseGlyphMap)rZ   r   r€   Úvaluesr]   Úwr!   Úvr   r   r   ÚparseSinglePos  s    
rŽ   c                 C   s¦  t  ¡ }d |_|_|  ¡ d  ¡ d  ¡ }|dk�r.d|_i }| D �] }t|ƒdks^t	|ƒ‚|d  ¡ d  ¡ }|dks‚t	|ƒ‚|d t|ƒd …  
¡  dd¡}t| d }	t|dd… ƒ\}
}t|d ƒ}|
|krÞi ||
< |||
 krþtƒ tƒ f||
 |< ||
 | }|dk�r,| j|	O  _|d }n| j|	O  _|d }t||ƒ�rZt	||fƒ‚t|||ƒ qDtt| ¡ ƒ|ƒ|_g |_|jjD ]’}
||
 }t  ¡ }g  }|_t| ¡ |jd	�D ]F}|| }t  ¡ }||_|d |_|j�rî|d nd |_| |¡ �qºt|jƒ|_|j |¡ �qŠt|jƒ|_ �nt| !d
¡�r”d|_d d g}|  ¡ d  !d¡�rÀ|  "¡ d d tdƒ …  ¡ }dt j#fdt j$fdœ| \}}|| d k�sªt	‚t%| ||d�||< �qH|\|_#|_$dd„ |D ƒ\|_&|_'dd„ t(|j&ƒD ƒ|_)|j)D ]:}dd„ t(|j'ƒD ƒ|_*|j*D ]}tƒ |_tƒ |_�q�qþ| D ]ò}t|ƒdk�sXt	|ƒ‚|d  ¡ d  ¡ }|dk�s~t	|ƒ‚|d t|ƒd …  
¡  dd¡}t| d }	dd„ |dd… D ƒ\}}}|j)| j*| }|dk�rö| j|	O  _|j}n| j|	O  _|j}t||ƒ�r"t	||fƒ‚t|||ƒ �q>|j)D ]@}|j*D ]2}t|j|jƒ|_|j�rlt|j|jƒnd |_�qB�q8tt|j#j+ ¡ ƒ|ƒ|_nd�s¢t	|ƒ‚|S )Nr   ©ÚleftÚrightrq   rD   r   rE   rG   r�   rP   Úclassr   úclass definition begin)ÚfirstÚsecond©Úklassc                 s   s    | ]}d t |j ¡ ƒ V  qdS ©rq   N)ÚmaxÚ	classDefsr‹   )r    Úcr   r   r   Ú	<genexpr>^  s    zparsePair.<locals>.<genexpr>c                 S   s   g | ]}t  ¡ ‘qS r   )rQ   ÚClass1Record©r    ra   r   r   r   r"   a  s     zparsePair.<locals>.<listcomp>c                 S   s   g | ]}t  ¡ ‘qS r   )rQ   ÚClass2Record)r    Újr   r   r   r"   c  s     c                 s   s   | ]}t |ƒV  qd S r%   ©r   ©r    Úxr   r   r   rœ   m  s     ),rQ   ZPairPosZValueFormat1ZValueFormat2ru   Úsplitrv   ÚFormatrT   r   r‡   rˆ   r   r$   r   r   r‰   rU   ÚmakeCoverageÚsetÚkeysÚCoverageZPairSetÚglyphsZPairValueRecordrY   Ú
getGlyphIDZSecondGlyphZValue1ZValue2rB   ZPairValueCountZPairSetCountÚendswithÚpeekZ	ClassDef1Z	ClassDef2ÚparseClassDefZClass1CountZClass2CountÚranger�   rŸ   rš   )rZ   r   r€   r=   Útypr‹   r]   ZsideÚwhatÚmaskZglyph1Zglyph2ÚvalueZrec2ZvrZvalues1Zpairsetr\   Zvalues2Úpairrš   r*   r—   Zrec1Zclass1Zclass2r   r   r   Ú	parsePair&  s²    

 



þýÿ

 


ÿýrµ   c              
   C   sR   |   ¡ d  ¡ d  ¡ }|dkrH|  d¡� t| |ƒW  5 Q R £ S Q R X t| |ƒS )Nr   r�   )zfirstclass definition beginzsecondclass definition begin)ru   r¤   rv   Úuntilrµ   )rZ   r   r€   r°   r   r   r   ÚparseKernset†  s    ÿr·   c                 C   s`   t | ƒdkst‚|ƒ }d|_t| d ƒ\|_|_t | ƒdkr\| d dkr\d|_t| d ƒ|_|S )Nr   rq   r   rE   )rT   r   r¥   ÚintSplitCommaZXCoordinateZYCoordinater   ZAnchorPoint)Údatar—   Úanchorr   r   r   Ú
makeAnchor�  s    r»   c                 C   sª   i }| D ]�}t |ƒdks t|ƒ‚dtjfdtjfdœ|d  \}}t|d ƒ}||krbd d g||< || | d ks~t||fƒ‚t|dd … |ƒ|| |< qt || 	¡ ¡S )N)rG   rD   r   rq   )ÚentryÚexitr   )
rT   r   rQ   ZEntryAnchorZ
ExitAnchorr   r»   r}   ZbuildCursivePosSubtablerŠ   )rZ   r   r€   r\   r]   r*   r—   Úglyphr   r   r   ÚparseCursive›  s    þýr¿   c                 C   sF   g }|j D ]6}| | \}}| ¡ }||_t||j|ƒ | |¡ q
|S r%   )rª   ZMarkRecordClassÚClassrU   Z
MarkAnchorrB   )r¹   Úcoverager›   r\   r¾   r—   rº   Úrecordr   r   r   ÚmakeMarkRecords«  s    
rÃ   c                 C   sœ   g }i }|j D ]:}t|ƒ||< | ¡ }d g| }t||j|ƒ | |¡ q|  ¡ D ]D\\}}	}
|||  }t||jƒ}||	 d ksŽt||	fƒ‚|
||	< qR|S r%   )	rª   rT   ZBaseRecordClassrU   Z
BaseAnchorrB   ÚitemsÚgetattrr   )r¹   rÁ   r›   Ú
classCountr\   r*   r¾   rÂ   Úanchorsr—   rº   r   r   r   ÚmakeBaseRecords¶  s    


rÈ   c                 C   sè   d gt |jƒ }dd„ t|jƒD ƒ}|  ¡ D ]¶\\}}}}	}
|||  }|d kr–t ¡  }||| < |	|_dd„ t|	ƒD ƒ|_|jD ]}d g| |_	q„|j|	ks°t
||j|	fƒ‚|j|d  j	}|| d ksÚt
|||fƒ‚|
||< q,|S )Nc                 S   s   i | ]\}}||“qS r   r   )r    ra   r!   r   r   r   Ú
<dictcomp>É  s      z'makeLigatureRecords.<locals>.<dictcomp>c                 S   s   g | ]}t  ¡ ‘qS r   )rQ   ÚComponentRecordrž   r   r   r   r"   Ð  s     z'makeLigatureRecords.<locals>.<listcomp>rq   )rT   rª   rW   rÄ   rQ   ÚLigatureAttachZComponentCountr¯   rÊ   ZLigatureAnchorr   )r¹   rÁ   r›   rÆ   r\   r*   r¾   r—   ZcompIdxZ	compCountrº   rÂ   ZcompRecrÇ   r   r   r   ÚmakeLigatureRecordsÇ  s&    
ý
rÌ   c                 C   s:  |  ¡ }d|_i }i }||jf||jf||jfdœ}d}| D ]Ð}|d }	|	dksTt‚t|d ƒ}
||	 \}}|	dkrxdnd}tdd„ |dd| … D ƒƒ}t|d|  ƒ}t|d| d … |ƒ}|	d	krØ|
||f }}n|
|f| | }}||ksút|ƒ‚|||< t	||ƒ}q<t
t| ¡ ƒ||jƒ}| ¡ }t|||ƒ}t||j|ƒ t||jt|ƒƒ t||j|ƒ t||j|ƒ |d |_|�sˆdndt	d
d„ | ¡ D ƒƒ |_t
tdd„ | ¡ D ƒƒ||jƒ}| ¡ }|jdk�rêt||||jƒ}nt||||jƒ}t||j|ƒ t||jt|ƒƒ t||j |ƒ t||j!|ƒ |S )Nrq   )ÚmarkÚbaseÚligaturer   rÏ   r   c                 s   s   | ]}t |ƒV  qd S r%   r¡   rž   r   r   r   rœ   ð  s     z'parseMarkToSomething.<locals>.<genexpr>rG   rÍ   c                 s   s   | ]\}}|d  V  qdS r˜   r   )r    Úkr�   r   r   r   rœ     s     c                 S   s   g | ]}|d  ‘qS )r   r   ©r    rÐ   r   r   r   r"     s     z(parseMarkToSomething.<locals>.<listcomp>ÚLigature)"ÚTyper¥   ZMarkAnchorClassZBaseAnchorClassr   r   r…   r   r»   r™   r¦   r§   r¨   ZMarkCoverageClassZMarkArrayClassrÃ   rU   Z
MarkRecordZ	MarkCountrT   ZMarkCoverageZ	MarkArrayZ
ClassCountrÄ   rÆ   ZBaseCoverageClassZBaseArrayClassÚBaserÌ   rÈ   Z
BaseRecordZ	BaseCountZBaseCoverageZ	BaseArray)rZ   r   r›   r=   ZmarkDataZbaseDataÚDataZmaxKlassr]   r°   r¾   r¹   ZanchorClassZ
extraItemsÚextrasr—   rº   r1   r³   ZmarkCoverageZ	markArrayZmarkRecordsZbaseCoverageZ	baseArrayZbaseRecordsr   r   r   ÚparseMarkToSomethingß  s^    ý
&  ÿr×   c                   @   s   e Zd Zdd„ ZdS )Ú
MarkHelperc                 C   s~   dD ]t}dD ]j}|| }|dkr.|dkr.|}nt | |ƒ| }|dkrHd}t| ||ƒ |dkrt t|ƒ}t| |d |ƒ qqd S )	N)ÚMarkrÔ   )r©   ZArrayÚCountÚRecordÚAnchorrÙ   )rÚ   rÛ   rÜ   ZLigatureRecordrË   rÚ   rÀ   )rÅ   rU   rQ   )r=   ZWhichZWhatr1   r³   r—   r   r   r   r>     s    
zMarkHelper.__init__N©r   r   r   r>   r   r   r   r   rØ     s   rØ   c                   @   s   e Zd ZdZdZejZdS )ÚMarkToBaseHelperrÙ   rÔ   N)r   r   r   rÙ   rÔ   rQ   ZMarkBasePosrÓ   r   r   r   r   rÞ   (  s   rÞ   c                   @   s   e Zd ZdZdZejZdS )ÚMarkToMarkHelperZMark1ZMark2N)r   r   r   rÙ   rÔ   rQ   ZMarkMarkPosrÓ   r   r   r   r   rß   .  s   rß   c                   @   s   e Zd ZdZdZejZdS )ÚMarkToLigatureHelperrÙ   rÒ   N)r   r   r   rÙ   rÔ   rQ   Z
MarkLigPosrÓ   r   r   r   r   rà   4  s   rà   c                 C   s   t | |tƒ ƒS r%   )r×   rÞ   ©rZ   r   r€   r   r   r   ÚparseMarkToBase:  s    râ   c                 C   s   t | |tƒ ƒS r%   )r×   rß   rá   r   r   r   ÚparseMarkToMark>  s    rã   c                 C   s   t | |tƒ ƒS r%   )r×   rà   rá   r   r   r   ÚparseMarkToLigatureB  s    rä   c                 C   s   | rdd„ |   d¡D ƒS g S )Nc                 S   s   g | ]}|  ¡ ‘qS r   ©ÚstriprJ   r   r   r   r"   G  s     z#stripSplitComma.<locals>.<listcomp>ú,©r¤   ©r]   r   r   r   rV   F  s    rV   c                 C   s   | rdd„ |   d¡D ƒS g S )Nc                 S   s   g | ]}t |ƒ‘qS r   r¡   rž   r   r   r   r"   K  s     z!intSplitComma.<locals>.<listcomp>rç   rè   ré   r   r   r   r¸   J  s    r¸   c                   @   s   e Zd Zdd„ ZdS )ÚContextHelperc                 C   st  |  d¡rd}d}nd}d}| d¡r4d}d}d}nd}d}d}|| }|| _|| _|| _|| _|| _|| _|d	 | _|dkrÈd
d„ }	dd„ }
dd„ }dd„ }d }d }dd„ }dd„ }dd„ }dd„ }nº|dk�r$dd„ }	dd„ }
dd„ }dd„ }dd„ }dd„ }dd„ }dd„ }d d„ }d!d„ }n^|dk�rpd"d„ }	d#d„ }
d }d }d }d }d$d„ }d%d„ }d&d„ }d'd„ }nd�s‚t	d(| ƒ‚|�r¨|
| _
|| _|| _|| _|| _n|	| _
|| _|| _|| _|| _|dk�r|d) | _|d* | _|d+ | _|d, | _d-d„ | _nl|dk�rp|d. | _|d/ | _|d0 | _|d1 | _d2d„ | _|�rJd3nd4| _|�rZdnd| _|�rjd5nd6| _d S )7NZSubstÚSubÚPosÚChainrq   rG   rE   r   ÚLookupRecordc                 S   s   | j S r%   ©r©   ©Úrr   r   r   r3   k  r4   z(ContextHelper.__init__.<locals>.<lambda>c                 S   s   | j S r%   rï   rð   r   r   r   r3   l  r4   c                 S   s   dS )Nr%   r   rð   r   r   r   r3   m  r4   c                 S   s   dS )N)NNNr   rð   r   r   r   r3   n  r4   c                 S   s   | j fS r%   )ÚInputrð   r   r   r   r3   q  r4   c                 S   s   | j | j| jfS r%   ©Ú	Backtrackrò   Ú	LookAheadrð   r   r   r   r3   r  r4   c                 S   s   |\| _ dd„ |D ƒ\| _d S )Nc                 s   s   | ]}t |ƒd  V  qdS r˜   ©rT   r¢   r   r   r   rœ   v  s     ú>ContextHelper.__init__.<locals>.SetRuleData.<locals>.<genexpr>)rò   Ú
GlyphCount©rñ   Údr   r   r   ÚSetRuleDatat  s    z+ContextHelper.__init__.<locals>.SetRuleDatac                 S   sF   |\| _ | _| _t|d ƒt|d ƒd t|d ƒ  | _| _| _d S ©Nr   rq   r   ©rô   rò   rõ   rT   ÚBacktrackGlyphCountÚInputGlyphCountÚLookAheadGlyphCountrù   r   r   r   ÚChainSetRuleDatax  s    $üýz0ContextHelper.__init__.<locals>.ChainSetRuleDatar   c                 S   s   | j S r%   rï   rð   r   r   r   r3   �  r4   c                 S   s   | j S r%   rï   rð   r   r   r   r3   ‚  r4   c                 S   s   | j fS r%   ©ÚClassDefrð   r   r   r   r3   ƒ  r4   c                 S   s   | j | j| jfS r%   ©ÚBacktrackClassDefÚInputClassDefÚLookAheadClassDefrð   r   r   r   r3   „  s    ýc                 S   s   |\| _ d S r%   r  rù   r   r   r   ÚSetContextDataŠ  s    z.ContextHelper.__init__.<locals>.SetContextDatac                 S   s   |\| _ | _| _d S r%   r  rù   r   r   r   ÚSetChainContextData�  s    z3ContextHelper.__init__.<locals>.SetChainContextDatac                 S   s   | j fS r%   )rÀ   rð   r   r   r   r3   �  r4   c                 S   s   | j | j| jfS r%   ró   rð   r   r   r   r3   ‘  r4   c                 S   s   |\| _ dd„ |D ƒ\| _d S )Nc                 s   s   | ]}t |ƒd  V  qdS r˜   rö   r¢   r   r   r   rœ   •  s     r÷   )rÀ   rø   rù   r   r   r   rû   “  s    c                 S   sF   |\| _ | _| _t|d ƒt|d ƒd t|d ƒ  | _| _| _d S rü   rý   rù   r   r   r   r  —  s    $üýc                 S   s
   | j d S ©Nr   rï   rð   r   r   r   r3      r4   c                 S   s
   | j d S r
  )ÚInputCoveragerð   r   r   r   r3   ¡  r4   c                 S   s   | j S r%   rï   rð   r   r   r   r3   ¦  r4   c                 S   s   | j | j | j S r%   )ÚBacktrackCoverager  ÚLookAheadCoveragerð   r   r   r   r3   §  s    c                 S   s   |\| _ dd„ |D ƒ\| _d S )Nc                 s   s   | ]}t |ƒV  qd S r%   rö   r¢   r   r   r   rœ   ­  s     r÷   )r©   rø   rù   r   r   r   rû   «  s    c                 S   s.   |\| _ | _| _dd„ |D ƒ\| _| _| _d S )Nc                 s   s   | ]}t |ƒV  qd S r%   rö   r¢   r   r   r   rœ   µ  s     zCContextHelper.__init__.<locals>.ChainSetRuleData.<locals>.<genexpr>)r  r  r  rþ   rÿ   r   rù   r   r   r   r  ¯  s    üýzunknown format: %sÚRuleÚ	RuleCountÚRuleSetÚRuleSetCountc                 S   s   || kr|gS g S r%   r   ©rª   r›   rñ   r   r   r   r3   Ì  r4   Z	ClassRuleZClassRuleCountZClassSetZClassSetCountc                 S   s&   |r|  | |¡S |dkr t| ƒS tƒ S r
  )Zintersect_classr§   r  r   r   r   r3   Ò  s    ÿr  r  rò   rÀ   )r¬   Ú
startswithÚTyprÓ   rí   ÚChainTypÚInputIdxÚDataLenrî   r   r©   ÚContextDatar  ÚRuleDatarû   r  r  r  r  Z	Intersectr  ZClassDefIndexrò   )r=   Ú	klassNamer¥   r  rÓ   rí   r  r  r  r©   ZChainCoverager  ZChainContextDatar  r	  r  ZChainRuleDatarû   r  r   r   r   r>   P  s     







	










zContextHelper.__init__NrÝ   r   r   r   r   rê   O  s   rê   c                 C   s„   t t|ƒ}g }| D ]l}|ƒ }t|ƒ}t|ƒdks8t|ƒ‚t|d ƒ}|dksTt|ƒ‚|d |_tt||d t	|dƒ | 
|¡ q|S )Nr   r   rq   rf   )rÅ   rQ   rV   rT   r   r   ZSequenceIndexr9   r+   rU   rB   )rÄ   r  rh   r—   ÚlstÚitemrO   r*   r   r   r   ÚparseLookupRecordsÝ  s    

r  c                 C   s   | sd S |ƒ }t | ƒ|_|S r%   )Údictrš   )rš   r   r—   r=   r   r   r   ÚmakeClassDefì  s
    
r  c              	   C   s\   i }|   d¡�< | D ]0}t|d ƒ}||ks4t|ƒ‚t|d ƒ||< qW 5 Q R X t|||ƒS )Nzclass definitionr   rq   )rS   r   r   r   r  )rZ   r   r—   rš   r]   r¾   r   r   r   r®   ô  s    r®   c                 C   s8   | sd S t | tƒrt| ƒ} |ƒ }tt| ƒ|jd�|_|S )NrP   )Ú
isinstancer§   rY   r«   rª   )rª   r   r—   rÁ   r   r   r   r¦   þ  s    
r¦   c              	   C   sB   g }|   d¡�" | D ]}| t|d ƒ¡ qW 5 Q R X t|||ƒS )Nzcoverage definitionr   )rS   rB   r   r¦   )rZ   r   r—   rª   r]   r   r   r   ÚparseCoverage  s
    r!  c                    s$  i }|D ]>\}}|  |ˆ j d g ¡ t‡ fdd„t|ƒD ƒƒ|f¡ qg }|D ]®}||krh| d ¡ qPg }	|| D ]P\}}ttˆ jƒƒ }
ˆ  |
|¡ t	|
ˆ j
d t|ƒƒ t	|
ˆ j|ƒ |	 |
¡ qtttˆ jƒƒ }t	|ˆ j|	ƒ t	|ˆ jt|	ƒƒ | |¡ qPt	| ˆ j|ƒ t	| ˆ jt|ƒƒ d S )Nr   c                 3   s,   | ]$\}}||ˆ j krd ndd… V  qdS )rq   r   N©r  )r    ra   r   ©r›   r   r   rœ     s     z!bucketizeRules.<locals>.<genexpr>rÚ   )Ú
setdefaultr  rB   r…   rW   rÅ   rQ   r  rû   rU   rÓ   rT   rî   r  r  r  )r=   r›   ÚrulesZ
bucketKeysZbucketsÚseqÚrecsZrulesetsZ
firstGlyphZ	thisRulesÚruleZrulesetr   r#  r   ÚbucketizeRules  s.    ÿ
r)  c                    sb  t t|ƒƒ }|  ¡ d  ¡ d  ¡ }|dk�rd|_t d||j¡ t||jƒ‰ g }| D ]ˆ}|d  ¡ dksxt	|d ƒ‚t
|ƒdˆ j k r–| d¡ qxtdd„ |ddˆ j … D ƒƒ}t|dˆ j d … ˆ j|ƒ}	| ||	f¡ qXt‡ fdd„|D ƒƒ}
t|
|ƒ|_t|ˆ ||jjƒ �nD| d	¡�rød
|_t d||j¡ t||jƒ‰ d gˆ j }|  ¡ 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 | \}}|| d k�sØt	|ƒ‚t| ||d�||< �qTˆ  ||¡ g }| D ]’}|d  ¡  d	¡�s&t	|d ƒ‚t
|ƒdˆ j k �rH| d¡ �q&tdd„ |ddˆ j … D ƒƒ}t|dˆ j d … ˆ j|ƒ}	| ||	f¡ �qt‡ fdd„|D ƒƒ‰t‡fdd„|ˆ j j  ¡ D ƒƒ}
t|
|ƒ|_t|ˆ |t!t"ˆƒd ƒƒ �nf| d¡�rPd|_t d||j¡ t||jƒ‰ tdd„ t!ˆ 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 | \}}||  t&| ||d�¡ �q>ˆ  '||¡ t(| ƒ} t
| ƒdk�sît	‚| d }|d  ¡ dk�st	|d ƒ‚t|dd … ˆ j|ƒ}	t)|ˆ j*d t
|	ƒƒ t)|ˆ j|	ƒ nd�s^t	|ƒ‚|S )Nr   r¾   rq   zParsing %s format %srE   c                 s   s   | ]}t t|ƒƒV  qd S r%   )r$   rV   rž   r   r   r   rœ   9  s     zparseContext.<locals>.<genexpr>c                 3   s    | ]\}}|ˆ j  d  V  qdS ©r   Nr"  ©r    r&  r'  r#  r   r   rœ   =  s     r’   r   r“   )Ú	backtrackrE   Ú	lookahead)rq   rG   r–   c                 s   s   | ]}t |ƒV  qd S r%   )r¸   rž   r   r   r   rœ   Y  s     c                 3   s    | ]\}}|ˆ j  d  V  qdS r*  r"  r+  r#  r   r   rœ   \  s     c                 3   s   | ]\}}|ˆ kr|V  qd S r%   r   )r    r!   r›   )ÚfirstClassesr   r   rœ   ]  s     rÁ   rG   c                 s   s   | ]
}g V  qd S r%   r   rž   r   r   r   rœ   f  s     úcoverage definition begin)r,  Úinputr-  rÚ   )+rÅ   rQ   ru   r¤   rv   r¥   r?   r@   rê   r   rT   r  rB   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û   ÚlistrU   rÓ   )rZ   r   rÓ   rh   r=   r°   r%  r]   r&  r'  ZfirstGlyphsrš   r*   r—   Ú	coveragesr   )r›   r.  r   ÚparseContext-  s¦    
  ÿýü	÷	÷
  ÿ ÿýü	÷	÷
r3  c                 C   s   t | |d|d�S )NZContextSubst©rh   ©r3  ©rZ   r   rh   r   r   r   ÚparseContextSubst�  s    r7  c                 C   s   t | |d|d�S )NZ
ContextPosr4  r5  r6  r   r   r   ÚparseContextPos…  s    r8  c                 C   s   t | |d|d�S )NZChainContextSubstr4  r5  r6  r   r   r   ÚparseChainedSubst‰  s    r9  c                 C   s   t | |d|d�S )NZChainContextPosr4  r5  r6  r   r   r   ÚparseChainedPos�  s    r:  c           	         s   t  ¡ }d|_g g f}|  ¡ d  d¡r~|  ¡ d d tdƒ …  ¡ }dt jfdt j	fdœ| \}}||  
t| ||d�¡ q|d |_t|jƒ|_|d |_	t|j	ƒ|_i ‰ | D ]0}t|ƒdksÊt|ƒ‚t|ƒ}|d ˆ |d < q²ttˆ  ¡ ƒ|ƒ|_‡ fdd„|jjD ƒ|_t|jƒ|_|S )	Nrq   r   r/  )r,  r-  r–   r   c                    s   g | ]}ˆ | ‘qS r   r   rÑ   ©r)   r   r   r"   ¦  s     z,parseReverseChainedSubst.<locals>.<listcomp>)rQ   ZReverseChainSingleSubstr¥   ru   r¬   r­   rT   rv   r  r  rB   r!  rþ   r   r   r$   r¦   r§   r¨   r©   rª   Z
Substituterø   )	rZ   r   r€   r=   r2  r°   r*   r—   r]   r   r;  r   ÚparseReverseChainedSubst‘  s0    þý

r<  c                 C   sz  |   d¡}|\}}}t d||¡ t ¡ }t| ƒ\|_}	|	d k	rF|	|_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¡�x g }|  ¡ �r@|  d¡�: |  ¡ �r|
| ||ƒ}|j|jk�st‚| |¡ qèW 5 Q R X |  ¡ d dkrÒt| ƒ qÒW 5 Q R X |   d¡ ||_t |jƒ|_!|j!dk�rvd S |S )NÚlookupzParsing lookup type %s %srq   r   rG   rD   é   é   rr   )ÚsingleZmultipleZ	alternaterÏ   ÚcontextÚchainedZreversechainedé   )	r@  r´   ZkernsetZcursivezmark to basezmark to ligaturezmark to markrA  rB  ©ÚGSUBÚGPOSz
lookup end)ú
% subtablezsubtable endr   )"Úexpectr?   r@   rQ   ÚLookupr|   Z
LookupFlagZMarkFilteringSetr�   rƒ   r„   r†   r7  r9  r<  rŽ   rµ   r·   r¿   râ   rä   rã   r8  r:  Z
LookupTyper¶   r­   r   rB   ru   rw   ZSubTablerT   ZSubTableCount)rZ   ÚtableTagr   rh   r]   Ú_ri   r°   r=  rz   ZparseLookupSubTableZ	subtablesZsubtabler   r   r   ÚparseLookup«  s\    

ù
÷öëë



rL  c                    sV  t  |¡ƒ }tƒ ‰tƒ ‰ |dks$t‚t d|¡ tt|ƒƒ }d|_d‡ fdd„fd‡ ‡fdd„fd	d
œ}| 	¡ D ]\}}t
||d ƒ qp|  ¡ d k	�r¬|  ¡ d  ¡ }||krÆt d|  ¡ ¡ t| ƒ q†|| \}}|dk�r‚|jd krøt ¡ |_g |j_|  ¡ \}	}
}	t| ||ˆƒ}ˆd k	�rF|
ˆk�s4td|
 ƒ‚t|jjƒˆ|
< n,t|
ƒt|jjƒk�srtd|
t|jƒf ƒ‚|jj |¡ q†t||ƒd k�sšt|ƒ‚t
|||| ƒƒ q†|j�rÄt|jjƒ|j_ˆd k	�rLˆ ¡  tj t¡�rDd|k�rtdƒ|d< i |d _|d j ti ¡ |i ¡}ˆ ¡ D ]\}
}d|
dg|t|ƒ< �q&ˆ  ¡  ||_ |S )NrD  z
Parsing %sé   rR   c                    s
   t | ˆ ƒS r%   )rc   ©rZ   )r[   r   r   r3   ë  r4   zparseGSUBGPOS.<locals>.<lambda>re   c                    s   t | ˆˆ ƒS r%   )rl   rN  ©r[   rh   r   r   r3   ï  r4   )Ú
LookupListN)zscript table beginzfeature table beginr=  r   úSkipping %sr=  zDuplicate lookup name: %srd   ZDebgrE   )!r   ÚgetTableClassr:   r   r?   r@   rÅ   rQ   ÚVersionr‹   rU   r­   rv   rw   rP  rI  rL  rT   r   rB   rg   rC   ÚosÚenvironrx   r
   r	   r¹   r$  r   rÄ   ÚstrÚtable)rZ   r   rJ  Ú	containerr=   ÚfieldsÚattrÚparserr°   rK  ri   r=  r@   r   rO  r   ÚparseGSUBGPOSà  sz    
þþ÷



þ



 ÿ þÿr\  c                 C   s   t | |dƒS )NrE  ©r\  ©rZ   r   r   r   r   Ú	parseGSUB#  s    r_  c                 C   s   t | |dƒS )NrF  r]  r^  r   r   r   Ú	parseGPOS'  s    r`  c              	   C   sj   i }|   d¡�F | D ]:}t|d ƒ}||ks4t|ƒ‚dd„ |dd … D ƒ||< qW 5 Q R X t || ¡ ¡S )Nzattachment listr   c                 S   s   g | ]}t |ƒ‘qS r   r¡   rž   r   r   r   r"   1  s     z#parseAttachList.<locals>.<listcomp>rq   )rS   r   r   r}   ZbuildAttachListrŠ   )rZ   r   Zpointsr]   r¾   r   r   r   ÚparseAttachList+  s    &ra  c              	   C   s�   i }|   d¡�j | D ]^}t|d ƒ}||ks4t|ƒ‚t|d ƒ}dd„ |dd … D ƒ}|t|ƒksjt|ƒ‚|||< qW 5 Q R X t |i | ¡ ¡S )NÚcaretsr   rq   c                 S   s   g | ]}t |ƒ‘qS r   r¡   rž   r   r   r   r"   <  s     z"parseCaretList.<locals>.<listcomp>r   )rS   r   r   r   rT   r}   ZbuildLigCaretListrŠ   )rZ   r   rb  r]   r¾   ÚnumZ
thisCaretsr   r   r   ÚparseCaretList5  s    rd  c                 C   s\   t  ¡ }d|_dt|  ¡ ƒ |_d g|j |_t|  ¡ ƒD ]\}}t	t
|ƒ|ƒ|j|< q:|S )Nrq   )rQ   ÚMarkGlyphSetsDefZMarkSetTableFormatr™   r¨   ZMarkSetCountr©   rY   rÄ   r¦   r§   )Úsetsr   r=   rÐ   r�   r   r   r   ÚmakeMarkFilteringSetsB  s    rg  c              	   C   sx   i }|   d¡�Z | D ]N}t|ƒdks,t|ƒ‚t|d ƒ}t|d ƒ}||krTg ||< ||  |¡ qW 5 Q R X t||ƒS )Nzset definitionr   r   rq   )rS   rT   r   r   r   rB   rg  )rZ   r   rf  r]   r¾   Ústr   r   r   ÚparseMarkFilteringSetsL  s    ri  c                 C   sö   t  d¡ƒ }t d¡ t ¡ }ddd„ fdtfdtfdd	d„ fd
tfdœ}| 	¡ D ]\}}t
||d ƒ qR|  ¡ d k	rØ|  ¡ d  ¡ }||kr¢t d|¡ t| ƒ qh|| \}}t||ƒd ksÄt|ƒ‚t
|||| |ƒƒ qh|jd krædnd|_||_|S )NÚGDEFzParsing GDEFÚGlyphClassDefc                 S   s   t | |tjd�S ©Nr–   )r®   rQ   rk  r^  r   r   r   r3   a  r4   zparseGDEF.<locals>.<lambda>Z
AttachListZLigCaretListÚMarkAttachClassDefc                 S   s   t | |tjd�S rl  )r®   rQ   rm  r^  r   r   r   r3   g  r4   re  )r“   zattachment list beginzcarets beginz&mark attachment class definition beginzmarkfilter set definition beginr   rQ  rM  i  )r   rR  r?   r@   rQ   rj  ra  rd  ri  r‹   rU   r­   rv   rw   rÅ   r   re  rS  rW  )rZ   r   rX  r=   rY  rZ  r[  r°   r   r   r   Ú	parseGDEFZ  s6    
þþõrn  c           
         sÈ   t  d¡ƒ }t d¡ g }ˆ  ¡ d k	r¸ˆ  dt|ƒ ¡ ‡ fdd„dD ƒ\}}}}t| |ƒ}||_||_	||_
i |_tˆ ƒ}	|	d dkr¬|	d	 |jt|	d d
ƒ< tˆ ƒ}	q~| |¡ qd|_||_|S )NÚcmapzParsing cmapzcmap subtable %dc                    s   g | ]}t ˆ |ƒ‘qS r   )ÚparseCmapId)r    ÚfieldrN  r   r   r"   �  s   ÿzparseCmap.<locals>.<listcomp>)Ú
platformIDZ
encodingIDÚformatÚlanguager   zend subtablerq   r   )r   rR  r?   r@   r­   rH  rT   r   rr  Z	platEncIDrt  ro  rw   r   rB   ZtableVersionÚtables)
rZ   r   rX  ru  ZplatIdZencIdÚfmtÚlangrW  r]   r   rN  r   Ú	parseCmap{  s*    

þ
rx  c                 C   s$   t | ƒ}||d kst‚t|d ƒS )Nr   rq   )rw   r   r   )rZ   rq  r]   r   r   r   rp  ”  s    rp  c                 C   sÎ   t  d¡ |  ¡ }d }|d  ¡ d dkr<|d  ¡ d }n.d |d  ¡ d d… ¡dkrj|d  ¡ d }|d k	r¦t| ƒ | d¡}|d kr’|}n||ks¦t||fƒ‚|d k	s¶td	ƒ‚tt	t
td
œ| | |ƒS )NzParsing tabler   ZFontDamerq   r   rG   zFont Chef TablerD   z7Don't know what table to parse and data doesn't specify)rE  rF  rj  ro  )r?   r@   ru   r¤   Újoinrw   Úljustr   r_  r`  rn  rx  )rZ   r   rJ  r]   Útagr   r   r   Ú
parseTableš  s6    

ÿþüû ûr|  c                   @   s|   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zedd„ ƒZedd„ ƒZdd„ Zdd„ ZdS )Ú	Tokenizerc                 C   sN   t |ƒ}z|j| _W n   d | _Y nX t |ƒ| _d| _d| _g | _d | _d S )NrE   r   )Úiterri   ÚfilenamerZ   r]   ÚlinenoÚstoppersÚbuffer)r=   ÚfrZ   r   r   r   r>   ·  s    
zTokenizer.__init__c                 C   s   | S r%   r   r<   r   r   r   Ú__iter__Ä  s    zTokenizer.__iter__c                 C   s†   |  j d7  _ t| jƒ }| _dd„ | d¡D ƒ}t|ƒdkrL|d sL|d= |r‚|d s‚t d| j | jf ¡ |r‚|d s‚|d= qn|S )Nrq   c                 S   s   g | ]}|  ¡ ‘qS r   rå   rJ   r   r   r   r"   Ê  s     z(Tokenizer._next_line.<locals>.<listcomp>ú	r   éÿÿÿÿz!trailing tab found on line %d: %s)r€  rw   rZ   r]   r¤   rT   r?   Úwarning©r=   r]   r   r   r   Ú
_next_lineÇ  s    zTokenizer._next_linec                 C   s:   |   ¡ }|r |d r |d d dks0|d dkr |S q d S )Nr   ú%rG  )r‰  rˆ  r   r   r   Ú_next_nonemptyÓ  s    (zTokenizer._next_nonemptyc                 C   s"   | j r| j }d | _ |S |  ¡ S d S r%   )r‚  r‹  ©r=   Úretr   r   r   Ú_next_bufferedÚ  s
    zTokenizer._next_bufferedc                 C   s(   |   ¡ }|d  ¡ | jkr$|| _t‚|S r
  )rŽ  rv   r�  r‚  ÚStopIterationrˆ  r   r   r   Ú__next__â  s
    zTokenizer.__next__c                 C   s   |   ¡ S r%   )r�  r<   r   r   r   rw   é  s    zTokenizer.nextc                 C   sJ   | j s,z|  ¡ | _ W n tk
r*   Y d S X | j d  ¡ | jkrDd S | j S r
  )r‚  r‹  r�  rv   r�  r<   r   r   r   r­   ì  s    zTokenizer.peekc                 C   s   |   ¡ }|d k	r|S dS )N)rE   )r­   rŒ  r   r   r   ru   ö  s    zTokenizer.peeksc                 c   sF   |d }|d }|   |¡ | j |¡ d V  | jd= |  |d ¡ d S )Nz beginz endr†  )Úexpectendswithr�  rB   rH  )r=   r{  ÚstartÚendr   r   r   rS   ú  s    
zTokenizer.betweenc                 c   s:   t |ƒtk	r|f}| j |¡ d V  | jt|ƒ d …= d S r%   )rA   r…   r�  ÚextendrT   )r=   Útagsr   r   r   r¶     s
    zTokenizer.untilc                 C   s0   t | ƒ}|d  ¡ }||ks,td||f ƒ‚|S )Nr   zExpected '%s', got '%s')rw   rv   r   ©r=   r   r]   r{  r   r   r   rH    s    zTokenizer.expectc                 C   s2   t | ƒ}|d  ¡ }| |¡s.td||f ƒ‚|S )Nr   zExpected '*%s', got '%s')rw   rv   r¬   r   r–  r   r   r   r‘    s    zTokenizer.expectendswithN)r   r   r   r>   r„  r‰  r‹  rŽ  r�  rw   r­   ru   r   rS   r¶   rH  r‘  r   r   r   r   r}  ¶  s   

	
r}  c                 C   s   t | ƒ}t|||d�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_``)
    ©rJ  )r}  r|  )rƒ  r   rJ  rZ   r   r   r   Úbuild  s    r˜  c              
   C   sn  ddl }ddlm} ddlm} | dkr6|jdd… } |ƒ  ddl}|jdtj	d�}|j
dd	d
ddd� |j
dddddd� |j
dd
tddd� | | ¡} |dkr¼| jr¶t | j¡}n|ƒ }| jD ]¦}t d|¡ t|ddd��}t||| jd�}W 5 Q R X | |¡}	| ¡ }
|
 |	|¡ ddlm} |j}| |j¡}| |¡ | ¡  |
 ||¡ |  |¡ | ¡  qÂdS )z©Convert a FontDame OTL file to TTX XML

    Writes XML output to stdout.

    Args:
            args: Command line arguments (``--font``, ``--table``, input files).
    r   N)ÚconfigLogger)ÚMockFontrq   zfonttools mtiLib)Údescriptionz--fontz-fÚFILEr   zDInput TTF files (used for glyph classes and sorting coverage tables))ÚmetavarÚdestÚhelpz--tablez-tZTABLErJ  z7Table to fill (sniffed from input file if not provided)Úinputsú+zInput FontDame .txt files)r�  rA   ÚnargsrŸ  zProcessing %sÚrtzutf-8)Úencodingr—  )Ú	xmlWriter)!ÚsysÚ	fontToolsr™  ZfontTools.misc.testToolsrš  ÚargvÚargparseÚArgumentParserÚmainÚ__doc__Úadd_argumentrV  Ú
parse_argsr   r   r   r   r?   r@   Úopenr˜  rJ  ÚcompileÚ	__class__Z	decompileZfontTools.miscr¥  Z	XMLWriterÚstdoutZbegintagÚnewlineZtoXMLZendtag)Úargsr   r¦  r™  rš  r©  r[  rƒ  rW  ZblobZ
decompiledr¥  r{  Úwriterr   r   r   r«  -  sh    þûû    ÿ




r«  Ú__main__)N)NN)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)NN)br§  r   ZfontTools.ttLib.tables._c_m_a_pr   ZfontTools.ttLib.tablesr   rQ   ZfontTools.ttLib.tables.otBaser   r   ZfontTools.otlLibr   r}   Ú
contextlibr   ZfontTools.ttLibr	   Z fontTools.feaLib.lookupDebugInfor
   r   Úoperatorr   rT  ÚloggingÚ	Exceptionr   r   r   r   Ú	getLoggerr?   r   r$   r+   r-   r9   r  r:   rc   rl   r|   r�   rƒ   r„   r†   rŽ   rµ   r·   rÜ   r»   r¿   rÃ   rÈ   rÌ   r×   ÚobjectrØ   rÞ   rß   rà   râ   rã   rä   rV   r¸   rê   r  r©   r  r  r®   r¦   r!  r)  r3  r7  r8  r9  r:  r<  rL  r\  r_  r`  ra  rd  rg  ri  rn  rx  rp  r|  r}  r˜  r«  r   r¦  r½   r   r   r   r   Ú<module>	   sœ   


<
!!
	


	

`


8


 



T





5C

!
c

J
