a
    èÝEb ”  ã                   @   s*  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
„ 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�d.d/„Z(d‘d0d1„Z)ej*fd2d3„Z+d’d4d5„Z,d6d7„ Z-d8d9„ Z.d:d;„ Z/d<d=„ Z0G d>d?„ d?e1ƒZ2G d@dA„ dAe2ƒZ3G dBdC„ dCe2ƒZ4G dDdE„ dEe2ƒZ5d“dFdG„Z6d”dHdI„Z7d•dJdK„Z8dLdM„ Z9dNdO„ Z:G dPdQ„ dQe1ƒZ;d–dRdS„Z<ej=fdTdU„Z>ej?fdVdW„Z@ej=fdXdY„ZAej=fdZd[„ZBd\d]„ ZCd—d^d_„ZDd˜d`da„ZEd™dbdc„ZFdšddde„ZGd›dfdg„ZHdœdhdi„ZId�djdk„ZJdldm„ ZKdndo„ ZLdpdq„ ZMdrds„ ZNdtdu„ ZOdvdw„ ZPdxdy„ ZQdzd{„ ZRd|d}„ ZSd~d„ ZTdžd€d�„ZUG d‚dƒ„ dƒe1ƒZVdŸd„d…„ZWd d†d‡„ZXeYdˆk�r&d dlZZZeZ [eXƒ ¡ dS )¡é    )ÚttLib)Úcmap_classes)ÚotTables)ÚValueRecordÚvalueRecordFormatDict)Úbuilder)Úcontextmanager)ÚsetitemNc                   @   s   e Zd ZdS )ÚMtiLibErrorN©Ú__name__Ú
__module__Ú__qualname__© r   r   úY/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/fontTools/mtiLib/__init__.pyr
      ó    r
   c                   @   s   e Zd ZdS )ÚReferenceNotFoundErrorNr   r   r   r   r   r      r   r   c                   @   s   e Zd ZdS )ÚFeatureNotFoundErrorNr   r   r   r   r   r      r   r   c                   @   s   e Zd ZdS )ÚLookupNotFoundErrorNr   r   r   r   r   r      r   r   zfontTools.mtiLibc                 C   sx   | d d… dv r*t j t| dd … dƒ¡S | d d… dkrNdt| dd … ƒ S |  d¡dk shJ d|  ƒ‚| stJ 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)Ú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>%   r   zmakeGlyphs.<locals>.<listcomp>r   )Úlr   r   r   Ú
makeGlyphs$   s    r!   c                 C   s>   |d ur2z||  }W q: t y.   t| ƒ‚Y q:0 nt| ƒ}|S ©N)ÚKeyErrorr   r   ©ÚsymÚmappingÚidxr   r   r   Ú	mapLookup'   s    r(   c                 C   sL   zt | ƒ}W n: tyF   z||  }W n ty@   t| ƒ‚Y n0 Y n0 |S r"   )r   Ú
ValueErrorr#   r   r$   r   r   r   Ú
mapFeature3   s    r*   c                    s�   z| ||ƒ}W np t y~ } zXz6|d urR| ‡ ‡‡fdd„||¡ W W Y d }~d S W n tyf   Y n0 ‚ W Y d }~n
d }~0 0 ˆˆ ˆ|ƒ d S )Nc                    s   ˆˆ ˆ| ƒS r"   r   )Úref©Ú
collectionÚkeyÚsetterr   r   Ú<lambda>E   r   zsetReference.<locals>.<lambda>)r   ÚaddDeferredMappingÚAttributeError)Zmapperr&   r%   r/   r-   r.   ÚmappedÚer   r,   r   ÚsetReference?   s    r5   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__N   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   r7   Úappend)r9   r/   r%   r4   r   r   r   r1   Q   s    z"DeferredMapping.addDeferredMappingc              	   C   sh   | j D ]V\}}}t d|t|ƒj¡ z| | }W n tyF   |‚Y n0 ||ƒ t d|¡ qg | _ d S )Nz,Applying deferred mapping for symbol '%s' %sz	Set to %s)r7   r;   r<   r=   r   r#   )r9   r/   r%   r4   r3   r   r   r   ÚapplyDeferredMappingsU   s    
z%DeferredMapping.applyDeferredMappingsN)r   r   r   r:   r1   r?   r   r   r   r   r6   L   s   r6   c              
      sà  t  ¡ }g }|  d¡��p | D �]X}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}n:t  ¡ }ˆ |_t  ¡ |_| |¡ |j}d |_g |_d
|_|dk�r<||_qt  ¡ }|ddt|ƒ   |_||_|j |¡ t|jƒ|_qW d   ƒ n1 �s�0    Y  |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   w   r   z#parseScriptList.<locals>.<listcomp>r   Údefaultr   c                 S   s   | j S r"   )Ú
LangSysTag©Úrecr   r   r   r0   Ž   r   z!parseScriptList.<locals>.<lambda>©r.   c                 S   s   | j S r"   rD   rJ   r   r   r   r0   �   r   )ÚotÚ
ScriptListÚbetweenÚlenr>   r;   r<   ZLangSysZLookupOrderr5   r*   ÚsetattrrB   ÚstripSplitCommaZFeatureIndexÚ	enumerater	   ÚFeatureCountZScriptZScriptRecordrE   ZDefaultLangSysZLangSysRecordZLangSysCountrI   ÚsortedZScriptCount)ÚlinesÚ
featureMapr9   ÚrecordsÚlineZ
langSysTagZdefaultFeatureÚfeaturesZlangSysÚsymsÚtheListÚir%   ÚscriptZ	scriptRecZ
langSysRecr   rG   r   ÚparseScriptLista   sR    



.r_   c              
   C   sF  t  ¡ }g |_|  d¡��
 | D ]ô}|\}}}|d urX||vsJJ d| ƒ‚t|jƒ||< z,t|ƒt|jƒks‚J d|t|jƒf ƒ‚W n ty–   Y n0 t  ¡ }||_t  ¡ |_|j 	|¡ |j}	d |	_
t|ƒ}
d gt|
ƒ  |	_}t|
ƒD ]\}}tt||t||ƒ qìt|	jƒ|	_q W d   ƒ n1 �s,0    Y  t|jƒ|_|S )Nzfeature tablezDuplicate feature name: %sú%d %d)rM   ÚFeatureListZFeatureRecordrO   rP   r   r)   Z
FeatureTagZFeaturer>   ZFeatureParamsrR   ÚLookupListIndexrS   r5   r(   r	   ÚLookupCountrT   )rV   Ú	lookupMaprW   r9   rY   ÚnameZ
featureTagÚlookupsZ
featureRecÚfeaturer[   r\   r]   r%   r   r   r   ÚparseFeatureList“   s2    
,
.rh   c                 C   sÖ   d}d }g d¢}|   ¡ d  ¡ |v rÎt| ƒ}dddddœ |d  ¡ ¡}|r‚|d  ¡ dv shJ |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ÚignoremarksÚmarkattachmenttypeÚmarkfiltertypeé   r   r@   é   )ri   rj   rk   rl   )ÚyesÚnorq   rm   rn   r   )ÚpeeksÚlowerÚnextÚgetr   )rV   ÚflagsÚ	filtersetZallFlagsrY   Úflagr   r   r   ÚparseLookupFlags°   s0    ü
ûrz   c                 C   sD   i }| D ]0}t |ƒdks J |ƒ‚t|ƒ}|d ||d < qt |¡S )Nr   ro   r   )rP   r!   ÚotlZbuildSingleSubstSubtable©rV   ÚfontÚ
_lookupMapr&   rY   r   r   r   ÚparseSingleSubstÐ   s    r   c                 C   s4   i }| D ] }t |ƒ}|dd … ||d < qt |¡S ©Nro   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 J |ƒ‚t|ƒ}|d |t|dd … ƒ< qt |¡S )Nr   r   ro   )rP   r!   Útupler{   ZbuildLigatureSubstSubtabler|   r   r   r   ÚparseLigatureæ   s    r„   c                 C   s¦   i }| D ]Œ}t |ƒdks J |ƒ‚|d  ¡  dd¡}|tv s@J ‚t|d ƒ}t|d ƒ}||vrjtƒ ||< t|| |ƒr„J ||fƒ‚t|| ||ƒ qt	 
|| ¡ ¡S )NrC   r   r   rA   ro   r   )rP   ÚtitleÚreplacer   r   r   r   ÚhasattrrQ   r{   ZbuildSinglePosSubtableÚgetReverseGlyphMap)rV   r}   r~   ÚvaluesrY   Úwr   Úvr   r   r   ÚparseSinglePosî   s    
rŒ   c                 C   s¦  t  ¡ }d |_|_|  ¡ d  ¡ d  ¡ }|dv �r.d|_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,| j|	O  _|d }n| j|	O  _|d }t||ƒ�rZJ ||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 u �sªJ ‚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�sXJ |ƒ‚|d  ¡ d  ¡ }|dv �s~J |ƒ‚|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"J ||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¢J |ƒ‚|S )Nr   ©ÚleftÚrightro   r@   r   rA   rC   rŽ   rL   Úclassr   úclass definition begin)ÚfirstÚsecond©Úklassc                 s   s    | ]}d t |j ¡ ƒ V  qdS ©ro   N)ÚmaxÚ	classDefsr‰   )r   Úcr   r   r   Ú	<genexpr>2  r   zparsePair.<locals>.<genexpr>c                 S   s   g | ]}t  ¡ ‘qS r   )rM   ÚClass1Record©r   r]   r   r   r   r   3  r   zparsePair.<locals>.<listcomp>c                 S   s   g | ]}t  ¡ ‘qS r   )rM   ÚClass2Record)r   Újr   r   r   r   5  r   c                 s   s   | ]}t |ƒV  qd S r"   ©r   ©r   Úxr   r   r   rš   ?  r   )+rM   ZPairPosZValueFormat1ZValueFormat2rs   Úsplitrt   ÚFormatrP   r…   r†   r   r!   r   r   r‡   rQ   ÚmakeCoverageÚsetÚkeysÚCoverageZPairSetÚglyphsZPairValueRecordrU   Ú
getGlyphIDZSecondGlyphZValue1ZValue2r>   ZPairValueCountZPairSetCountÚendswithÚpeekZ	ClassDef1Z	ClassDef2ÚparseClassDefZClass1CountZClass2CountÚranger›   r�   r˜   )rV   r}   r~   r9   Útypr‰   rY   ZsideÚwhatÚmaskZglyph1Zglyph2ÚvalueZrec2ZvrZvalues1ZpairsetrX   Zvalues2Úpairr˜   r'   r•   Zrec1Zclass1Zclass2r   r   r   Ú	parsePairü   sª    

  



þý

 


ÿÿr³   c                 C   s^   |   ¡ d  ¡ d  ¡ }|dv rT|  d¡� t| |ƒW  d   ƒ S 1 sJ0    Y  t| |ƒS )Nr   r�   )zfirstclass definition beginzsecondclass definition begin)rs   r¢   rt   Úuntilr³   )rV   r}   r~   r®   r   r   r   ÚparseKernsetT  s
    (rµ   c                 C   s`   t | ƒdksJ ‚|ƒ }d|_t| d ƒ\|_|_t | ƒdkr\| d dkr\d|_t| d ƒ|_|S )Nr   ro   r   rA   )rP   r£   ÚintSplitCommaZXCoordinateZYCoordinater   ZAnchorPoint)Údatar•   Úanchorr   r   r   Ú
makeAnchor[  s    r¹   c                 C   sª   i }| D ]�}t |ƒdv s J |ƒ‚dtjfdtjfdœ|d  \}}t|d ƒ}||vrbd d g||< || | d u s~J ||fƒ‚t|dd … |ƒ|| |< qt || ¡ ¡S )N)rC   r@   r   ro   )ÚentryÚexitr   )	rP   rM   ZEntryAnchorZ
ExitAnchorr   r¹   r{   ZbuildCursivePosSubtablerˆ   )rV   r}   r~   rX   rY   r'   r•   Úglyphr   r   r   ÚparseCursivee  s    þýr½   c                 C   sF   g }|j D ]6}| | \}}| ¡ }||_t||j|ƒ | |¡ q
|S r"   )r¨   ZMarkRecordClassÚClassrQ   Z
MarkAnchorr>   )r·   Úcoverager™   rX   r¼   r•   r¸   Úrecordr   r   r   ÚmakeMarkRecordst  s    
rÁ   c                 C   sœ   g }i }|j D ]:}t|ƒ||< | ¡ }d g| }t||j|ƒ | |¡ q|  ¡ D ]D\\}}	}
|||  }t||jƒ}||	 d u sŽJ ||	fƒ‚|
||	< qR|S r"   )r¨   rP   ZBaseRecordClassrQ   Z
BaseAnchorr>   ÚitemsÚgetattr)r·   r¿   r™   Ú
classCountrX   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 u r–t ¡  }||| < |	|_dd„ t|	ƒD ƒ|_|jD ]}d g| |_	q„|j|	ks°J ||j|	fƒ‚|j|d  j	}|| d u sÚJ |||fƒ‚|
||< q,|S )Nc                 S   s   i | ]\}}||“qS r   r   )r   r]   r   r   r   r   Ú
<dictcomp>�  r   z'makeLigatureRecords.<locals>.<dictcomp>c                 S   s   g | ]}t  ¡ ‘qS r   )rM   ÚComponentRecordrœ   r   r   r   r   —  r   z'makeLigatureRecords.<locals>.<listcomp>ro   )
rP   r¨   rS   rÂ   rM   ÚLigatureAttachZComponentCountr­   rÈ   ZLigatureAnchor)r·   r¿   r™   rÄ   rX   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v sTJ ‚t|d ƒ}
||	 \}}|	dkrxdnd}tdd„ |dd| … D ƒƒ}t|d|  ƒ}t|d| d … |ƒ}|	d	krØ|
||f }}n|
|f| | }}||vsúJ |ƒ‚|||< 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 )Nro   )ÚmarkÚbaseÚligaturer   rÍ   r   c                 s   s   | ]}t |ƒV  qd S r"   rŸ   rœ   r   r   r   rš   ²  r   z'parseMarkToSomething.<locals>.<genexpr>rC   rË   c                 s   s   | ]\}}|d  V  qdS r–   r   )r   Úkr‹   r   r   r   rš   È  r   c                 S   s   g | ]}|d  ‘qS )r   r   ©r   rÎ   r   r   r   r   É  r   z(parseMarkToSomething.<locals>.<listcomp>ÚLigature)!ÚTyper£   ZMarkAnchorClassZBaseAnchorClassr   rƒ   r   r¹   r—   r¤   r¥   r¦   ZMarkCoverageClassZMarkArrayClassrÁ   rQ   Z
MarkRecordZ	MarkCountrP   ZMarkCoverageZ	MarkArrayZ
ClassCountrÂ   rÄ   ZBaseCoverageClassZBaseArrayClassÚBaserÊ   rÆ   Z
BaseRecordZ	BaseCountZBaseCoverageZ	BaseArray)rV   r}   r™   r9   ZmarkDataZbaseDataZDataZmaxKlassrY   r®   r¼   r·   ZanchorClassZ
extraItemsÚextrasr•   r¸   r.   r±   ZmarkCoverageZ	markArrayZmarkRecordsZbaseCoverageZ	baseArrayZbaseRecordsr   r   r   ÚparseMarkToSomething¡  sV    ý
& 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v r.|}nt | |ƒ| }|dkrHd}t| ||ƒ |dkrt t|ƒ}t| |d |ƒ qqd S )	N)ÚMarkrÒ   )r§   ÚArrayÚCountÚRecordÚAnchorrÖ   )rØ   rÙ   rÚ   ZLigatureRecordrÉ   rØ   r¾   )rÃ   rQ   rM   )r9   ZWhichZWhatr.   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Ò   rM   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Ò   rM   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Ò   rM   Z
MarkLigPosrÑ   r   r   r   r   rÞ   î  s   rÞ   c                 C   s   t | |tƒ ƒS r"   )rÔ   rÜ   ©rV   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   ÚparseMarkToLigature÷  s    râ   c                 C   s   | rdd„ |   d¡D ƒS g S )Nc                 S   s   g | ]}|  ¡ ‘qS r   ©ÚstriprF   r   r   r   r   û  r   z#stripSplitComma.<locals>.<listcomp>ú,©r¢   ©rY   r   r   r   rR   ú  s    rR   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   þ  r   z!intSplitComma.<locals>.<listcomp>rå   ræ   rç   r   r   r   r¶   ý  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‚J 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ÚChainro   rC   rA   r   ÚLookupRecordc                 S   s   | j S r"   ©r§   ©Úrr   r   r   r0     r   z(ContextHelper.__init__.<locals>.<lambda>c                 S   s   | j S r"   rí   rî   r   r   r   r0     r   c                 S   s   dS )Nr"   r   rî   r   r   r   r0     r   c                 S   s   dS )N)NNNr   rî   r   r   r   r0      r   c                 S   s   | j fS r"   )ÚInputrî   r   r   r   r0   #  r   c                 S   s   | j | j| jfS r"   ©Ú	Backtrackrð   Ú	LookAheadrî   r   r   r   r0   $  r   c                 S   s   |\| _ dd„ |D ƒ\| _d S )Nc                 s   s   | ]}t |ƒd  V  qdS r–   ©rP   r    r   r   r   rš   '  r   ú>ContextHelper.__init__.<locals>.SetRuleData.<locals>.<genexpr>)rð   Ú
GlyphCount©rï   Údr   r   r   ÚSetRuleData%  s    z+ContextHelper.__init__.<locals>.SetRuleDatac                 S   sF   |\| _ | _| _t|d ƒt|d ƒd t|d ƒ  | _| _| _d S ©Nr   ro   r   ©rò   rð   ró   rP   ÚBacktrackGlyphCountÚInputGlyphCountÚLookAheadGlyphCountr÷   r   r   r   ÚChainSetRuleData(  s    z0ContextHelper.__init__.<locals>.ChainSetRuleDatar   c                 S   s   | j S r"   rí   rî   r   r   r   r0   ,  r   c                 S   s   | j S r"   rí   rî   r   r   r   r0   -  r   c                 S   s   | j fS r"   ©ÚClassDefrî   r   r   r   r0   .  r   c                 S   s   | j | j| jfS r"   ©ÚBacktrackClassDefÚInputClassDefÚLookAheadClassDefrî   r   r   r   r0   /  s   þc                 S   s   |\| _ d S r"   r   r÷   r   r   r   ÚSetContextData2  s    z.ContextHelper.__init__.<locals>.SetContextDatac                 S   s   |\| _ | _| _d S r"   r  r÷   r   r   r   ÚSetChainContextData4  s
    þþz3ContextHelper.__init__.<locals>.SetChainContextDatac                 S   s   | j fS r"   )r¾   rî   r   r   r   r0   8  r   c                 S   s   | j | j| jfS r"   rñ   rî   r   r   r   r0   9  r   c                 S   s   |\| _ dd„ |D ƒ\| _d S )Nc                 s   s   | ]}t |ƒd  V  qdS r–   rô   r    r   r   r   rš   <  r   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   r0   A  r   c                 S   s
   | j d S r  )ÚInputCoveragerî   r   r   r   r0   B  r   c                 S   s   | j S r"   rí   rî   r   r   r   r0   G  r   c                 S   s   | j | j | j S r"   )ÚBacktrackCoverager	  ÚLookAheadCoveragerî   r   r   r   r0   H  s   ÿþc                 S   s   |\| _ dd„ |D ƒ\| _d S )Nc                 s   s   | ]}t |ƒV  qd S r"   rô   r    r   r   r   rš   M  r   rõ   )r§   rö   r÷   r   r   r   rù   K  s    c                 S   s.   |\| _ | _| _dd„ |D ƒ\| _| _| _d S )Nc                 s   s   | ]}t |ƒV  qd S r"   rô   r    r   r   r   rš   P  r   zCContextHelper.__init__.<locals>.ChainSetRuleData.<locals>.<genexpr>)r
  r	  r  rü   rý   rþ   r÷   r   r   r   rÿ   N  s    zunknown format: %sÚRuleÚ	RuleCountÚRuleSetÚRuleSetCountc                 S   s   || v r|gS g S r"   r   ©r¨   r™   rï   r   r   r   r0   f  r   Z	ClassRuleZClassRuleCountZClassSetZClassSetCountc                 S   s&   |r|  | |¡S |dkr t| ƒS tƒ S r  )Zintersect_classr¥   r  r   r   r   r0   l  s   r  r  rð   r¾   )rª   Ú
startswithÚTyprÑ   rë   ÚChainTypÚInputIdxÚDataLenrì   r§   ÚContextDatar  ÚRuleDatarù   r  r  r  r  Z	Intersectr  ZClassDefIndexrð   )r9   Ú	klassNamer£   r  rÑ   rë   r  r  r  r§   ZChainCoverager  ZChainContextDatar  r  r  ZChainRuleDatarù   rÿ   r   r   r   r:     s     


















zContextHelper.__init__NrÛ   r   r   r   r   rè     s   rè   c                 C   s„   t t|ƒ}g }| D ]l}|ƒ }t|ƒ}t|ƒdks8J |ƒ‚t|d ƒ}|dksTJ |ƒ‚|d |_tt||d t|dƒ | 	|¡ q|S )Nr   r   ro   rb   )
rÃ   rM   rR   rP   r   ZSequenceIndexr5   r(   rQ   r>   )rÂ   r  rd   r•   ÚlstÚitemrK   r'   r   r   r   ÚparseLookupRecordss  s    

r  c                 C   s   | sd S |ƒ }t | ƒ|_|S r"   )Údictr˜   )r˜   r}   r•   r9   r   r   r   ÚmakeClassDef�  s    
r  c                 C   sp   i }|   d¡�F | D ]0}t|d ƒ}||vs4J |ƒ‚t|d ƒ||< qW d   ƒ n1 sZ0    Y  t|||ƒS )Nzclass definitionr   ro   )rO   r   r   r  )rV   r}   r•   r˜   rY   r¼   r   r   r   r¬   ‡  s    0r¬   c                 C   s8   | sd S t | tƒrt| ƒ} |ƒ }tt| ƒ|jd�|_|S )NrL   )Ú
isinstancer¥   rU   r©   r¨   )r¨   r}   r•   r¿   r   r   r   r¤   �  s    
r¤   c                 C   sV   g }|   d¡�, | D ]}| t|d ƒ¡ qW d   ƒ n1 s@0    Y  t|||ƒS )Nzcoverage definitionr   )rO   r>   r   r¤   )rV   r}   r•   r¨   rY   r   r   r   ÚparseCoverage˜  s
    2r  c                    s$  i }|D ]>\}}|  |ˆ j d g ¡ t‡ fdd„t|ƒD ƒƒ|f¡ qg }|D ]®}||v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 )ro   r   N©r  )r   r]   r   ©r™   r   r   rš   ¢  r   z!bucketizeRules.<locals>.<genexpr>rØ   )Ú
setdefaultr  r>   rƒ   rS   rÃ   rM   r  rù   rQ   rÑ   rP   rì   r  r  r  )r9   r™   ÚrulesZ
bucketKeysZbucketsÚseqÚrecsZrulesetsZ
firstGlyphZ	thisRulesÚruleZrulesetr   r!  r   ÚbucketizeRulesŸ  s*    8
r'  c                    sb  t t|ƒƒ }|  ¡ d  ¡ d  ¡ }|dk�rd|_t d||j¡ t||jƒ‰ g }| D ]ˆ}|d  ¡ dksxJ |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 u �sØJ |ƒ‚t| ||d�||< �qTˆ  ||¡ g }| D ]’}|d  ¡  d	¡�s&J |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îJ ‚| d }|d  ¡ dk�sJ |d ƒ‚t|dd … ˆ j|ƒ}	t(|ˆ j)d t	|	ƒƒ t(|ˆ j|	ƒ nd�s^J |ƒ‚|S )Nr   r¼   ro   zParsing %s format %srA   c                 s   s   | ]}t t|ƒƒV  qd S r"   )r!   rR   rœ   r   r   r   rš   Ä  r   zparseContext.<locals>.<genexpr>c                 3   s    | ]\}}|ˆ j  d  V  qdS ©r   Nr   ©r   r$  r%  r!  r   r   rš   È  r   r�   r   r‘   )Ú	backtrackrA   Ú	lookahead)ro   rC   r”   c                 s   s   | ]}t |ƒV  qd S r"   )r¶   rœ   r   r   r   rš   ã  r   c                 3   s    | ]\}}|ˆ j  d  V  qdS r(  r   r)  r!  r   r   rš   æ  r   c                 3   s   | ]\}}|ˆ v r|V  qd S r"   r   )r   r   r™   )ÚfirstClassesr   r   rš   ç  r   r¿   rC   c                 s   s   | ]
}g V  qd S r"   r   rœ   r   r   r   rš   î  r   úcoverage definition begin)r*  Úinputr+  rØ   )*rÃ   rM   rs   r¢   rt   r£   r;   r<   rè   rP   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  r  rù   ÚlistrQ   rÑ   )rV   r}   rÑ   rd   r9   r®   r#  rY   r$  r%  ZfirstGlyphsr˜   r'   r•   Ú	coveragesr   )r™   r,  r   ÚparseContext¹  sš    
 
ÿýü	÷	÷
 " "
ÿýü	÷	÷
r1  c                 C   s   t | |d|d�S )NZContextSubst©rd   ©r1  ©rV   r}   rd   r   r   r   ÚparseContextSubst  s    r5  c                 C   s   t | |d|d�S )NZ
ContextPosr2  r3  r4  r   r   r   ÚparseContextPos
  s    r6  c                 C   s   t | |d|d�S )NZChainContextSubstr2  r3  r4  r   r   r   ÚparseChainedSubst  s    r7  c                 C   s   t | |d|d�S )NZChainContextPosr2  r3  r4  r   r   r   ÚparseChainedPos  s    r8  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ÊJ |ƒ‚t|ƒ}|d ˆ |d < q²ttˆ  ¡ ƒ|ƒ|_‡ fdd„|jjD ƒ|_t|jƒ|_|S )	Nro   r   r-  )r*  r+  r”   r   c                    s   g | ]}ˆ | ‘qS r   r   rÏ   ©r&   r   r   r   &  r   z,parseReverseChainedSubst.<locals>.<listcomp>)rM   ZReverseChainSingleSubstr£   rs   rª   r«   rP   rt   r
  r  r>   r  rü   rþ   r!   r¤   r¥   r¦   r§   r¨   Z
Substituterö   )	rV   r}   r~   r9   r0  r®   r'   r•   rY   r   r9  r   ÚparseReverseChainedSubst  s0    þý

r:  c                 C   s¦  |   d¡}|\}}}t d||¡ t ¡ }t| ƒ\|_}	|	d u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¡�˜ g }|  ¡ �rV|  d¡�D |  ¡ �r|
| ||ƒ}|j|jk�sJ ‚| |¡ qèW d   ƒ n1 �s20    Y  |  ¡ d dv rÒt| ƒ qÒW d   ƒ n1 �sl0    Y  |   d¡ ||_t|jƒ|_ |j dk�r¢d S |S )NÚlookupzParsing lookup type %s %sro   r   rC   r@   é   é   rp   )ÚsingleÚmultipleÚ	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<   rM   ÚLookuprz   Z
LookupFlagZMarkFilteringSetr   r�   r‚   r„   r5  r7  r:  rŒ   r³   rµ   r½   rà   râ   rá   r6  r8  Z
LookupTyper´   r«   r>   rs   ru   ZSubTablerP   ZSubTableCount)rV   ÚtableTagr}   rd   rY   Ú_re   r®   r;  rx   ZparseLookupSubTableZ	subtablesZsubtabler   r   r   ÚparseLookup*  s\    

ù
÷öëë


,*
rL  c                    sò  t  |¡ƒ }tƒ ‰tƒ ‰ |dv s$J ‚t d|¡ tt|ƒƒ }d|_d‡ fdd„fd‡ ‡fdd„fd	d
œ}| ¡ D ]\}}t	||d ƒ qp|  
¡ d u�r¬|  
¡ d  ¡ }||vrÆt d|  
¡ ¡ t| ƒ q†|| \}}|dk�r‚|jd u røt ¡ |_g |j_|  
¡ \}	}
}	t| ||ˆƒ}ˆd u�rF|
ˆv�s4J d|
 ƒ‚t|jjƒˆ|
< n,t|
ƒt|jjƒk�srJ d|
t|jƒf ƒ‚|jj |¡ q†t||ƒd u �sšJ |ƒ‚t	|||| ƒƒ q†|j�rÄt|jjƒ|j_ˆd u�rÖˆ ¡  ˆ d u�rèˆ  ¡  ||_|S )NrD  z
Parsing %sé   rN   c                    s
   t | ˆ ƒS r"   )r_   ©rV   )rW   r   r   r0   i  r   zparseGSUBGPOS.<locals>.<lambda>ra   c                    s   t | ˆˆ ƒS r"   )rh   rN  ©rW   rd   r   r   r0   l  r   )Ú
LookupListN)zscript table beginzfeature table beginr;  r   úSkipping %sr;  zDuplicate lookup name: %sr`   )r   ÚgetTableClassr6   r;   r<   rÃ   rM   ÚVersionr‰   rQ   r«   rt   ru   rP  rI  rL  rP   r   r>   rc   r?   Útable)rV   r}   rJ  Ú	containerr9   ÚfieldsÚattrÚparserr®   rK  re   r;  r   rO  r   ÚparseGSUBGPOS^  sZ    
ÿÿø



,

rY  c                 C   s   t | |dƒS )NrE  ©rY  ©rV   r}   r   r   r   Ú	parseGSUB’  s    r\  c                 C   s   t | |dƒS )NrF  rZ  r[  r   r   r   Ú	parseGPOS”  s    r]  c                 C   s~   i }|   d¡�P | D ]:}t|d ƒ}||vs4J |ƒ‚dd„ |dd … D ƒ||< qW d   ƒ n1 sd0    Y  t || ¡ ¡S )Nzattachment listr   c                 S   s   g | ]}t |ƒ‘qS r   rŸ   rœ   r   r   r   r   �  r   z#parseAttachList.<locals>.<listcomp>ro   )rO   r   r{   ZbuildAttachListrˆ   )rV   r}   ZpointsrY   r¼   r   r   r   ÚparseAttachList—  s    :r^  c                 C   s¤   i }|   d¡�t | D ]^}t|d ƒ}||vs4J |ƒ‚t|d ƒ}dd„ |dd … D ƒ}|t|ƒksjJ |ƒ‚|||< qW d   ƒ n1 sˆ0    Y  t |i | ¡ ¡S )NÚcaretsr   ro   c                 S   s   g | ]}t |ƒ‘qS r   rŸ   rœ   r   r   r   r   §  r   z"parseCaretList.<locals>.<listcomp>r   )rO   r   r   rP   r{   ZbuildLigCaretListrˆ   )rV   r}   r_  rY   r¼   ÚnumZ
thisCaretsr   r   r   ÚparseCaretList   s    (ra  c                 C   s\   t  ¡ }d|_dt|  ¡ ƒ |_d g|j |_t|  ¡ ƒD ]\}}t	t
|ƒ|ƒ|j|< q:|S )Nro   )rM   ÚMarkGlyphSetsDefZMarkSetTableFormatr—   r¦   ZMarkSetCountr§   rU   rÂ   r¤   r¥   )Úsetsr}   r9   rÎ   r‹   r   r   r   ÚmakeMarkFilteringSets¬  s    rd  c                 C   sŒ   i }|   d¡�d | D ]N}t|ƒdks,J |ƒ‚t|d ƒ}t|d ƒ}||vrTg ||< ||  |¡ qW d   ƒ n1 sx0    Y  t||ƒS )Nzset definitionr   r   ro   )rO   rP   r   r   r>   rd  )rV   r}   rc  rY   r¼   Ústr   r   r   ÚparseMarkFilteringSetsµ  s    .rf  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 urØ|  ¡ d  ¡ }||vr¢t d|¡ t| ƒ qh|| \}}t||ƒd u sÄJ |ƒ‚t
|||| |ƒƒ qh|jd u rædnd|_||_|S )NÚGDEFzParsing GDEFÚGlyphClassDefc                 S   s   t | |tjd�S ©Nr”   )r¬   rM   rh  r[  r   r   r   r0   É  r   zparseGDEF.<locals>.<lambda>Z
AttachListZLigCaretListÚMarkAttachClassDefc                 S   s   t | |tjd�S ri  )r¬   rM   rj  r[  r   r   r   r0   Ð  r   rb  )r‘   zattachment list beginzcarets beginz&mark attachment class definition beginzmarkfilter set definition beginr   rQ  rM  i  )r   rR  r;   r<   rM   rg  r^  ra  rf  r‰   rQ   r«   rt   ru   rÃ   rb  rS  rT  )rV   r}   rU  r9   rV  rW  rX  r®   r   r   r   Ú	parseGDEFÂ  s6    
ÿÿôrk  c           
         sÈ   t  d¡ƒ }t d¡ g }ˆ  ¡ d u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 subtablero   r   )r   rR  r;   r<   r«   rH  rP   r   ro  Z	platEncIDrq  rl  ru   r   r>   ZtableVersionÚtables)
rV   r}   rU  rr  ZplatIdZencIdÚfmtÚlangrT  rY   r   rN  r   Ú	parseCmapã  s*    

þ
ru  c                 C   s$   t | ƒ}||d ksJ ‚t|d ƒS )Nr   ro   )ru   r   )rV   rn  rY   r   r   r   rm  ú  s    rm  c                 C   sÎ   t  d¡ |  ¡ }d }|d  ¡ d dkr<|d  ¡ d }n.d |d  ¡ d d… ¡dkrj|d  ¡ d }|d ur¦t| ƒ | d¡}|d u r’|}n||ks¦J ||fƒ‚|d us¶J d	ƒ‚ttt	t
d
œ| | |ƒS )NzParsing tabler   ZFontDamero   r   rC   zFont Chef Tabler@   z7Don't know what table to parse and data doesn't specify)rE  rF  rg  rl  )r;   r<   rs   r¢   Újoinru   Úljustr\  r]  rk  ru  )rV   r}   rJ  rY   Útagr   r   r   Ú
parseTableÿ  s.    

üûûry  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0 t |ƒ| _d| _d| _g | _d | _d S )NrA   r   )Úiterre   ÚfilenamerV   rY   ÚlinenoÚstoppersÚbuffer)r9   ÚfrV   r   r   r   r:     s    
zTokenizer.__init__c                 C   s   | S r"   r   r8   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 )Nro   c                 S   s   g | ]}|  ¡ ‘qS r   rã   rF   r   r   r   r   -  r   z(Tokenizer._next_line.<locals>.<listcomp>ú	r   éÿÿÿÿz!trailing tab found on line %d: %s)r}  ru   rV   rY   r¢   rP   r;   Úwarning©r9   rY   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_nonempty6  s    (zTokenizer._next_nonemptyc                 C   s"   | j r| j }d | _ |S |  ¡ S d S r"   )r  rˆ  ©r9   Úretr   r   r   Ú_next_buffered=  s
    zTokenizer._next_bufferedc                 C   s(   |   ¡ }|d  ¡ | jv r$|| _t‚|S r  )r‹  rt   r~  r  ÚStopIterationr…  r   r   r   Ú__next__E  s
    zTokenizer.__next__c                 C   s   |   ¡ S r"   )r�  r8   r   r   r   ru   L  s    zTokenizer.nextc                 C   sH   | j s*z|  ¡ | _ W n ty(   Y d S 0 | j d  ¡ | jv rBd S | j S r  )r  rˆ  rŒ  rt   r~  r8   r   r   r   r«   O  s    zTokenizer.peekc                 C   s   |   ¡ }|d ur|S dS )N)rA   )r«   r‰  r   r   r   rs   Y  s    zTokenizer.peeksc                 c   sF   |d }|d }|   |¡ | j |¡ d V  | jd= |  |d ¡ d S )Nz beginz endrƒ  )Úexpectendswithr~  r>   rH  )r9   rx  ÚstartÚendr   r   r   rO   ]  s    
zTokenizer.betweenc                 c   s:   t |ƒtur|f}| j |¡ d V  | jt|ƒ d …= d S r"   )r=   rƒ   r~  ÚextendrP   )r9   Útagsr   r   r   r´   g  s
    zTokenizer.untilc                 C   s0   t | ƒ}|d  ¡ }||ks,J d||f ƒ‚|S )Nr   zExpected '%s', got '%s')ru   rt   ©r9   r   rY   rx  r   r   r   rH  o  s    zTokenizer.expectc                 C   s2   t | ƒ}|d  ¡ }| |¡s.J d||f ƒ‚|S )Nr   zExpected '*%s', got '%s')ru   rt   rª   r“  r   r   r   rŽ  u  s    zTokenizer.expectendswithN)r   r   r   r:   r�  r†  rˆ  r‹  r�  ru   r«   rs   r   rO   r´   rH  rŽ  r   r   r   r   rz    s   

	
rz  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  )rz  ry  )r€  r}   rJ  rV   r   r   r   Úbuild{  s    r•  c              	   C   s„  ddl }ddlm} ddlm} | du 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u r¼| jr¶t | j¡}n|ƒ }| jD ]¼}t d|¡ t|ddd�� }t||| jd�}W d  ƒ n1 �s0    Y  | |¡}	| ¡ }
|
 |	|¡ 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)ÚMockFontro   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š  r=   Únargsrœ  zProcessing %sÚrtzutf-8)Úencodingr”  )Ú	xmlWriter)!ÚsysÚ	fontToolsr–  ZfontTools.misc.testToolsr—  ÚargvÚargparseÚArgumentParserÚmainÚ__doc__Úadd_argumentÚstrÚ
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¦  rX  r€  rT  ZblobZ
decompiledr¢  rx  Úwriterr   r   r   r¨  �  sP    þÿÿÿ

0


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)\r¤  r   ZfontTools.ttLib.tables._c_m_a_pr   ZfontTools.ttLib.tablesr   rM   ZfontTools.ttLib.tables.otBaser   r   ZfontTools.otlLibr   r{   Ú
contextlibr   Úoperatorr	   ÚloggingÚ	Exceptionr
   r   r   r   Ú	getLoggerr;   r   r!   r(   r*   r5   r  r6   r_   rh   rz   r   r�   r‚   r„   rŒ   r³   rµ   rÚ   r¹   r½   rÁ   rÆ   rÊ   rÔ   ÚobjectrÕ   rÜ   rÝ   rÞ   rà   rá   râ   rR   r¶   rè   r  r§   r  r  r¬   r¤   r  r'  r1  r5  r6  r7  r8  r:  rL  rY  r\  r]  r^  ra  rd  rf  rk  ru  rm  ry  rz  r•  r¨  r   r£  r»   r   r   r   r   Ú<module>	   s”   
	
2
 





X



5


r
	
O





44		!
c

=
