U
    md                     @   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%dd d!Z&dd"d#Z'd$d% Z(dd&d'Z)dd(d)Z*dd*d+Z+dd,d-Z,dd.d/Z-dd0d1Z.dd2d3Z/ej0fd4d5Z1dd6d7Z2d8d9 Z3d:d; Z4d<d= Z5d>d? Z6G d@dA dAe7Z8G dBdC dCe8Z9G dDdE dEe8Z:G dFdG dGe8Z;ddHdIZ<ddJdKZ=ddLdMZ>dNdO Z?dPdQ Z@G dRdS dSe7ZAddTdUZBejCfdVdWZDejEfdXdYZFejCfdZd[ZGejCfd\d]ZHd^d_ ZIdd`daZJddbdcZKddddeZLddfdgZMddhdiZNddjdkZOddldmZPdndo ZQdpdq ZRdrds ZSdtdu ZTdvdw ZUdxdy ZVdzd{ ZWd|d} ZXd~d ZYdd ZZdddZ[G dd de7Z\dddZ]dddZ^e_dk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|
| qt|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_qt|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st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|| qt|	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rt| }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|| |rt||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st	||d t|d  
 dd}t| d }	t|dd \}
}t|d }|
|kri ||
< |||
 krt 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 |_|| qt|j|_|j| qt|j|_ nt|!d
rd|_d d g}|  d !dr| " d d td   }dt j#fdt j$fd| \}}|| d kst	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st	||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st||	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rt  }||| < |	|_dd t|	D |_|jD ]}d g| |_	q|j|	kst
||j|	f|j|d  j	}|| d kst
|||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st||||< t	||}q<t
t| ||j}| }t|||}t||j| t||jt| t||j| t||j| |d |_|sdndt	d
d | D  |_t
tdd | D ||j}| }|jdkrt||||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rd
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st	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	rd
|_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st	|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st	| 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st|t|}|d  |d < qt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|| qW 5 Q R X |  d dkrt|  qW 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rtd|   t|  q|| \}}|dkr|jd krt |_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| qt||d kst|t
||||  q|jrt|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rtd| t|  qh|| \}}t||d kst|t
|||| | qh|jd krd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	rt|  |d}|d kr|}n||kst||f|d k	st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 st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rt| j}n| }| jD ]}td| t|ddd}t||| jd}W 5 Q R X ||}	| }
|
|	| ddlm} |j}||j}|| |  |
|| | | |  qd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)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
