B
    0uf                 @   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dddZ dd d!Z!d"d# Z"dd$d%Z#dd&d'Z$dd(d)Z%dd*d+Z&dd,d-Z'dd.d/Z(dd0d1Z)ej*fd2d3Z+dd4d5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Z5ddFdGZ6ddHdIZ7ddJdKZ8dLdM Z9dNdO Z:G dPdQ dQe1Z;ddRdSZ<ej=fdTdUZ>ej?fdVdWZ@ej=fdXdYZAej=fdZd[ZBd\d] ZCdd^d_ZDdd`daZEddbdcZFddddeZGddfdgZHddhdiZIddjdkZJdldm ZKdndo ZLdpdq ZMdrds ZNdtdu ZOdvdw ZPdxdy ZQdzd{ ZRd|d} ZSd~d ZTdddZUG dd de1ZVdddZWdddZXeYdk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   [/home/ankuromar296_gmail_com/myenv/lib/python3.7/site-packages/fontTools/mtiLib/__init__.pyr
      s    r
   c               @   s   e Zd ZdS )ReferenceNotFoundErrorN)r   r   r   r   r   r   r   r      s    r   c               @   s   e Zd ZdS )FeatureNotFoundErrorN)r   r   r   r   r   r   r   r      s    r   c               @   s   e Zd ZdS )LookupNotFoundErrorN)r   r   r   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>%   s    zmakeGlyphs.<locals>.<listcomp>r   )lr   r   r   
makeGlyphs$   s    r    c             C   s@   |d k	r4y||  }W q< t k
r0   t| Y q<X nt| }|S )N)KeyErrorr   r   )symmappingidxr   r   r   	mapLookup'   s    r%   c             C   sP   yt | }W n> tk
rJ   y||  }W n tk
rD   t| Y nX Y nX |S )N)r   
ValueErrorr!   r   )r"   r#   r$   r   r   r   
mapFeature3   s    r'   c                s   y| ||}W nd t k
rr } zFy*|d k	rH| fdd|| d S W n tk
r^   Y nX  W d d }~X Y nX  | d S )Nc                s    | S )Nr   )ref)
collectionkeysetterr   r   <lambda>E       zsetReference.<locals>.<lambda>)r   addDeferredMappingAttributeError)Zmapperr#   r"   r+   r)   r*   mappeder   )r)   r*   r+   r   setReference?   s    r2   c               @   s$   e Zd Zdd Zdd Zdd ZdS )DeferredMappingc             C   s
   g | _ d S )N)_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   r4   append)r5   r+   r"   r1   r   r   r   r.   Q   s    z"DeferredMapping.addDeferredMappingc          	   C   sn   xb| j D ]X\}}}td|t|j y| | }W n tk
rJ   |Y nX || td| qW g | _ d S )Nz,Applying deferred mapping for symbol '%s' %sz	Set to %s)r4   r7   r8   r9   r   r!   )r5   r+   r"   r1   r0   r   r   r   applyDeferredMappingsU   s    
z%DeferredMapping.applyDeferredMappingsN)r   r   r   r6   r.   r;   r   r   r   r   r3   L   s   r3   c          
      s  t  }g }| d xz| D ]p}xt|dk rB|d q*W |\ }}}td | t  }d |_|rt	t
||t|d nd|_t|}	dgt|	  |_}
x&t|	D ]\}}t	t
||t|
| qW t|j|_ fdd	|D }|r|d
 j}nJt  } ddt    |_t  |_|| |j}d |_g |_d
|_|dkrX||_q"t  }|ddt|   |_||_|j| t|j|_q"W W d Q R X x&|D ]}t|jjdd d|j_qW 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   )	scriptTagr   r   r   w   s    z#parseScriptList.<locals>.<listcomp>r   r   defaultc             S   s   | j S )N)
LangSysTag)recr   r   r   r,      r-   z!parseScriptList.<locals>.<lambda>)r*   c             S   s   | j S )N)r@   )rD   r   r   r   r,      r-   )ot
ScriptListbetweenlenr:   r7   r8   ZLangSysZLookupOrderr2   r'   setattrr>   stripSplitCommaZFeatureIndex	enumerater	   FeatureCountZScriptZScriptRecordr@   ZDefaultLangSysZLangSysRecordZLangSysCountrC   sortedZScriptCount)lines
featureMapr5   recordslineZ
langSysTagZdefaultFeaturefeaturesZlangSyssymstheListir"   scriptZ	scriptRecZ
langSysRecr   )rA   r   parseScriptLista   sR    



rW   c          
   C   s<  t  }g |_| d x| D ]}|\}}}|d k	r\||ksNtd| t|j||< y,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|
  |	_}x&t|
D ]\}}tt||t|| qW t|	j|	_q$W W d Q R X t|j|_|S )Nzfeature tablezDuplicate feature name: %sz%d %d)rE   FeatureListZFeatureRecordrG   r   rH   r   r&   Z
FeatureTagZFeaturer:   ZFeatureParamsrJ   LookupListIndexrK   r2   r%   r	   LookupCountrL   )rN   	lookupMaprO   r5   rQ   nameZ
featureTaglookupsZ
featureRecfeaturerS   rT   rU   r"   r   r   r   parseFeatureList   s2    
,
r_   c             C   s   d}d }ddddddg}x|   d  |krt| }dd	d
dd|d  }|r|d  dksrt|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W ||fS )Nr   righttoleftignorebaseglyphsignoreligaturesignoremarksZmarkattachmenttypeZmarkfiltertype   r   r<      )r`   ra   rb   rc   )yesnorf   r   )peekslowernextgetr   r   )rN   flags	filtersetZallFlagsrQ   flagr   r   r   parseLookupFlags   s6    ro   c             C   sH   i }x8| D ]0}t |dks"t|t|}|d ||d < q
W t|S )Nr   rd   r   )rH   r   r    otlZbuildSingleSubstSubtable)rN   font
_lookupMapr#   rQ   r   r   r   parseSingleSubst   s    
rs   c             C   s8   i }x(| D ] }t |}|dd  ||d < q
W t|S )Nrd   r   )r    rp   ZbuildMultipleSubstSubtable)rN   rq   rr   r#   rQ   r   r   r   parseMultiple   s
    
rt   c             C   s8   i }x(| D ] }t |}|dd  ||d < q
W t|S )Nrd   r   )r    rp   ZbuildAlternateSubstSubtable)rN   rq   rr   r#   rQ   r   r   r   parseAlternate   s
    
ru   c             C   sP   i }x@| D ]8}t |dks"t|t|}|d |t|dd  < q
W t|S )Nr   r   rd   )rH   r   r    tuplerp   ZbuildLigatureSubstSubtable)rN   rq   rr   r#   rQ   r   r   r   parseLigature   s    
rw   c             C   s   i }x| D ]}t |dks"t||d  dd}|tksBtt|d }t|d }||krlt ||< t|| |rt||ft	|| || q
W t
|| S )Nr?   r   r   r=   rd   r   )rH   r   titlereplacer   r   r   r   hasattrrI   rp   ZbuildSinglePosSubtablegetReverseGlyphMap)rN   rq   rr   valuesrQ   wr   vr   r   r   parseSinglePos   s    

r   c             C   s  t  }d |_|_|  d  d  }|dkr>d|_i }x,| D ]"}t|dksbt	||d  d  }|dkst	||d t|d  
 dd}t| d }	t|dd \}
}t|d }|
|kri ||
< |||
 krt t f||
 |< ||
 | }|dkr2| j|	O  _|d }n| j|	O  _|d }t||r`t	||ft||| qHW tt| ||_g |_x|jjD ]}
||
 }t  }g  }|_x\t| |jd	D ]F}|| }t  }||_|d |_|jr|d nd |_|| qW t|j|_|j| qW t|j|_ n|!d
rd|_d d g}xz|  d !dr| " d d td   }dt j#fdt j$fd| \}}|| d kst	t%| ||d||< qZW |\|_#|_$dd |D \|_&|_'dd t(|j&D |_)xH|j)D ]>}dd t(|j'D |_*x |j*D ]}t |_t |_q6W qW x| D ]}t|dksvt	||d  d  }|dkst	||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\W xN|j)D ]D}x<|j*D ]2}t|j|j|_|jrt|j|jnd |_qfW qZW tt|j#j+ ||_ndst	||S )Nr   )leftrightrd   r<   r   r=   r?   r   )r*   classr   zclass definition begin)firstsecond)klassc             s   s    | ]}d t |j  V  qdS )rd   N)max	classDefsr|   )r   cr   r   r   	<genexpr>2  s    zparsePair.<locals>.<genexpr>c             S   s   g | ]}t  qS r   )rE   Class1Record)r   rU   r   r   r   r   3  s    zparsePair.<locals>.<listcomp>c             S   s   g | ]}t  qS r   )rE   Class2Record)r   jr   r   r   r   5  s    c             s   s   | ]}t |V  qd S )N)r   )r   xr   r   r   r   ?  s    ),rE   ZPairPosZValueFormat1ZValueFormat2rh   splitri   FormatrH   r   rx   ry   r   r    r   r   rz   rI   makeCoveragesetkeysCoverageZPairSetglyphsZPairValueRecordrM   
getGlyphIDZSecondGlyphZValue1ZValue2r:   ZPairValueCountZPairSetCountendswithpeekZ	ClassDef1Z	ClassDef2parseClassDefZClass1CountZClass2Countranger   r   r   )rN   rq   rr   r5   typr|   rQ   ZsidewhatmaskZglyph1Zglyph2valueZrec2ZvrZvalues1ZpairsetrP   Zvalues2pairr   r$   r   Zrec1Zclass1Zclass2r   r   r   	parsePair   s    
   





 
(r   c          	   C   sF   |   d  d  }|dkr<| d t| |S Q R X t| |S )Nr   )r   r   )zfirstclass definition beginzsecondclass definition begin)rh   r   ri   untilr   )rN   rq   rr   r   r   r   r   parseKernsetT  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   rd   r   r=   )rH   r   r   intSplitCommaZXCoordinateZYCoordinater   ZAnchorPoint)datar   anchorr   r   r   
makeAnchor[  s    r   c             C   s   i }x| D ]}t |dks"t|dtjfdtjfd|d  \}}t|d }||krdd d g||< || | d kst||ft|dd  ||| |< q
W t||	 S )N)r?   r<   r   rd   )entryexitr   )
rH   r   rE   ZEntryAnchorZ
ExitAnchorr   r   rp   ZbuildCursivePosSubtabler{   )rN   rq   rr   rP   rQ   r$   r   glyphr   r   r   parseCursivee  s    
r   c             C   sJ   g }x@|j D ]6}| | \}}| }||_t||j| || qW |S )N)r   ZMarkRecordClassClassrI   Z
MarkAnchorr:   )r   coverager   rP   r   r   r   recordr   r   r   makeMarkRecordst  s    r   c             C   s   g }i }xD|j D ]:}t|||< | }d g| }t||j| || qW xP|  D ]D\\}}	}
|||  }t||j}||	 d kst||	f|
||	< qXW |S )N)	r   rH   ZBaseRecordClassrI   Z
BaseAnchorr:   itemsgetattrr   )r   r   r   
classCountrP   r$   r   r   anchorsr   r   r   r   r   makeBaseRecords~  s    
r   c             C   s   d gt |j }dd t|jD }x|  D ]\\}}}}	}
|||  }|d krt  }||| < |	|_dd t|	D |_x|jD ]}d g| |_	qW |j|	kst
||j|	f|j|d  j	}|| d kst
|||f|
||< q.W |S )Nc             S   s   i | ]\}}||qS r   r   )r   rU   r   r   r   r   
<dictcomp>  s    z'makeLigatureRecords.<locals>.<dictcomp>c             S   s   g | ]}t  qS r   )rE   ComponentRecord)r   rU   r   r   r   r     s    z'makeLigatureRecords.<locals>.<listcomp>rd   )rH   r   rK   r   rE   LigatureAttachZComponentCountr   r   ZLigatureAnchorr   )r   r   r   r   rP   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}x| D ]}|d }	|	dksVtt|d }
||	 \}}|	dkrzdnd}tdd |dd|  D }t|d|  }t|d| d  |}|	d	kr|
||f }}n|
|f| | }}||k st||||< t	||}q>W 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 )Nrd   )markbaseligaturer   r   r   c             s   s   | ]}t |V  qd S )N)r   )r   rU   r   r   r   r     s    z'parseMarkToSomething.<locals>.<genexpr>r?   r   c             s   s   | ]\}}|d  V  qdS )rd   Nr   )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   rv   r   r   r   r   r   r   ZMarkCoverageClassZMarkArrayClassr   rI   Z
MarkRecordZ	MarkCountrH   ZMarkCoverageZ	MarkArrayZ
ClassCountr   r   ZBaseCoverageClassZBaseArrayClassBaser   r   Z
BaseRecordZ	BaseCountZBaseCoverageZ	BaseArray)rN   rq   r   r5   ZmarkDataZbaseDataDataZmaxKlassrQ   r   r   r   ZanchorClassZ
extraItemsextrasr   r   r*   r   ZmarkCoverageZ	markArrayZmarkRecordsZbaseCoverageZ	baseArrayZbaseRecordsr   r   r   parseMarkToSomething  sT    

& r   c               @   s   e Zd Zdd ZdS )
MarkHelperc             C   s   xdD ]x}xrdD ]j}|| }|dkr2|dkr2|}nt | || }|dkrLd}t| || |dkrt t|}t| |d | qW qW d S )	N)Markr   )r   ZArrayCountRecordAnchorr   )r   r   r   ZLigatureRecordr   r   r   )r   rI   rE   )r5   ZWhichZWhatr*   r   r   r   r   r   r6     s    


zMarkHelper.__init__N)r   r   r   r6   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   rE   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   rE   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   rE   Z
MarkLigPosr   r   r   r   r   r     s   r   c             C   s   t | |t S )N)r   r   )rN   rq   rr   r   r   r   parseMarkToBase  s    r   c             C   s   t | |t S )N)r   r   )rN   rq   rr   r   r   r   parseMarkToMark  s    r   c             C   s   t | |t S )N)r   r   )rN   rq   rr   r   r   r   parseMarkToLigature  s    r   c             C   s   | rdd |  dD S g S )Nc             S   s   g | ]}|  qS r   )strip)r   r   r   r   r   r     s    z#stripSplitComma.<locals>.<listcomp>,)r   )rQ   r   r   r   rJ     s    rJ   c             C   s   | rdd |  dD S g S )Nc             S   s   g | ]}t |qS r   )r   )r   rU   r   r   r   r     s    z!intSplitComma.<locals>.<listcomp>r   )r   )rQ   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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Chainrd   r?   r=   r   LookupRecordc             S   s   | j S )N)r   )rr   r   r   r,     r-   z(ContextHelper.__init__.<locals>.<lambda>c             S   s   | j S )N)r   )r   r   r   r   r,     r-   c             S   s   dS )N)Nr   )r   r   r   r   r,     r-   c             S   s   dS )N)NNNr   )r   r   r   r   r,      r-   c             S   s   | j fS )N)Input)r   r   r   r   r,   #  r-   c             S   s   | j | j| jfS )N)	Backtrackr   	LookAhead)r   r   r   r   r,   $  r-   c             S   s   |\| _ dd |D \| _d S )Nc             s   s   | ]}t |d  V  qdS )rd   N)rH   )r   r   r   r   r   r   '  s    z>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   rd   r   )r   r   r   rH   BacktrackGlyphCountInputGlyphCountLookAheadGlyphCount)r   r   r   r   r   ChainSetRuleData(  s    z0ContextHelper.__init__.<locals>.ChainSetRuleDatar   c             S   s   | j S )N)r   )r   r   r   r   r,   ,  r-   c             S   s   | j S )N)r   )r   r   r   r   r,   -  r-   c             S   s   | j fS )N)ClassDef)r   r   r   r   r,   .  r-   c             S   s   | j | j| jfS )N)BacktrackClassDefInputClassDefLookAheadClassDef)r   r   r   r   r,   /  s   c             S   s   |\| _ d S )N)r   )r   r   r   r   r   SetContextData2  s    z.ContextHelper.__init__.<locals>.SetContextDatac             S   s   |\| _ | _| _d S )N)r   r   r   )r   r   r   r   r   SetChainContextData4  s    z3ContextHelper.__init__.<locals>.SetChainContextDatac             S   s   | j fS )N)r   )r   r   r   r   r,   8  r-   c             S   s   | j | j| jfS )N)r   r   r   )r   r   r   r   r,   9  r-   c             S   s   |\| _ dd |D \| _d S )Nc             s   s   | ]}t |d  V  qdS )rd   N)rH   )r   r   r   r   r   r   <  s    z>ContextHelper.__init__.<locals>.SetRuleData.<locals>.<genexpr>)r   r   )r   r   r   r   r   r   :  s    c             S   sF   |\| _ | _| _t|d t|d d t|d   | _| _| _d S )Nr   rd   r   )r   r   r   rH   r   r   r   )r   r   r   r   r   r   =  s    c             S   s
   | j d S )Nr   )r   )r   r   r   r   r,   A  r-   c             S   s
   | j d S )Nr   )InputCoverage)r   r   r   r   r,   B  r-   c             S   s   | j S )N)r   )r   r   r   r   r,   G  r-   c             S   s   | j | j | j S )N)BacktrackCoverager   LookAheadCoverage)r   r   r   r   r,   H  s    
c             S   s   |\| _ dd |D \| _d S )Nc             s   s   | ]}t |V  qd S )N)rH   )r   r   r   r   r   r   M  s    z>ContextHelper.__init__.<locals>.SetRuleData.<locals>.<genexpr>)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 )N)rH   )r   r   r   r   r   r   P  s    zCContextHelper.__init__.<locals>.ChainSetRuleData.<locals>.<genexpr>)r   r   r   r   r   r   )r   r   r   r   r   r   N  s    zunknown format: %sRule	RuleCountRuleSetRuleSetCountc             S   s   || kr|gS g S )Nr   )r   r   r   r   r   r   r,   f  r-   Z	ClassRuleZClassRuleCountZClassSetZClassSetCountc             S   s&   |r| | |S |dkr t| S t S )Nr   )Zintersect_classr   )r   r   r   r   r   r   r,   l  s   r   r   r   r   )r   
startswithTypr   r   ChainTypInputIdxDataLenr   r   r   ContextDatar   RuleDatar   r   r   r   r   Z	Intersectr   ZClassDefIndexr   )r5   	klassNamer   r   r   r   r   r   r   r   ZChainCoverager   ZChainContextDatar   r   r   ZChainRuleDatar   r   r   r   r   r6     s    


















zContextHelper.__init__N)r   r   r   r6   r   r   r   r   r     s   r   c             C   s   t t|}g }xt| D ]l}| }t|}t|dks:t|t|d }|dksVt||d |_tt||d t	|d |
| qW |S )Nr   r   rd   rY   )r   rE   rJ   rH   r   r   ZSequenceIndexr2   r%   rI   r:   )r   r   r[   r   lstitemrD   r$   r   r   r   parseLookupRecordss  s    


r   c             C   s   | sd S | }t | |_|S )N)dictr   )r   rq   r   r5   r   r   r   makeClassDef  s
     
r   c          	   C   s`   i }|  d@ x8| D ]0}t|d }||ks6t|t|d ||< qW W d Q R X t|||S )Nzclass definitionr   rd   )rG   r   r   r   r   )rN   rq   r   r   rQ   r   r   r   r   r     s    
r   c             C   s8   | sd S t | trt| } | }tt| |jd|_|S )N)r*   )
isinstancer   rM   r   r   )r   rq   r   r   r   r   r   r     s     
r   c          	   C   sF   g }|  d& x| D ]}|t|d  qW W d Q R X t|||S )Nzcoverage definitionr   )rG   r:   r   r   )rN   rq   r   r   rQ   r   r   r   parseCoverage  s
    
 r   c                s0  i }xF|D ]>\}}| | j d g t fddt|D |f q
W g }x|D ]}||krn|d  qVg }	x\|| D ]P\}}tt j }
 |
| t	|
 j
d t| t	|
 j| |	|
 q|W tt j }t	| j|	 t	| jt|	 || qVW t	|  j| t	|  jt| d S )Nr   c             3   s,   | ]$\}}|| j krd ndd V  qdS )rd   r   N)r   )r   rU   r   )r   r   r   r     s    z!bucketizeRules.<locals>.<genexpr>r   )
setdefaultr   r:   rv   rK   r   rE   r   r   rI   r   rH   r   r   r   r   )r5   r   rulesZ
bucketKeysZbucketsseqrecsZrulesetsZ
firstGlyphZ	thisRulesruleZrulesetr   )r   r   bucketizeRules  s*    :

r   c                sz  t t| }|  d  d  }|dkr"d|_td||j t||j g }x| D ]}|d  dkszt	|d x t
|d j k r|d q|W tdd |dd j  D }t|d j d   j|}	|||	f qZW t fdd|D }
t|
||_t| ||jj nT|d	rd
|_td||j t||j d g j }x|  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||< q^W  || g }x| D ]}|d  d	s4t	|d x$t
|d j k rX|d q6W tdd |dd j  D }t|d j d   j|}	|||	f qW t fdd|D tfdd| j j  D }
t|
||_t| |t!t"d  nj|drhd|_td||j t||j tdd t! jD }x|  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 qTW  '|| 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svt	||S )Nr   r   rd   zParsing %s format %sr=   c             s   s   | ]}t t|V  qd S )N)r    rJ   )r   rU   r   r   r   r     s    zparseContext.<locals>.<genexpr>c             3   s    | ]\}}| j  d  V  qdS )r   N)r   )r   r   r   )r   r   r   r     s    r   r   zclass definition begin)	backtrackr=   	lookahead)rd   r?   )r   c             s   s   | ]}t |V  qd S )N)r   )r   rU   r   r   r   r     s    c             3   s    | ]\}}| j  d  V  qdS )r   N)r   )r   r   r   )r   r   r   r     s    c             3   s   | ]\}}| kr|V  qd S )Nr   )r   r   r   )firstClassesr   r   r     s    r   r?   c             s   s   | ]
}g V  qd S )Nr   )r   rU   r   r   r   r     s    zcoverage definition begin)r   inputr  r   )+r   rE   rh   r   ri   r   r7   r8   r   r   rH   r   r:   rv   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   listrI   r   )rN   rq   r   r[   r5   r   r   rQ   r   r   ZfirstGlyphsr   r$   r   	coveragesr   )r   r  r   parseContext  s    

  
   "r  c             C   s   t | |d|dS )NZContextSubst)r[   )r  )rN   rq   r[   r   r   r   parseContextSubst  s    r  c             C   s   t | |d|dS )NZ
ContextPos)r[   )r  )rN   rq   r[   r   r   r   parseContextPos
  s    r  c             C   s   t | |d|dS )NZChainContextSubst)r[   )r  )rN   rq   r[   r   r   r   parseChainedSubst  s    r	  c             C   s   t | |d|dS )NZChainContextPos)r[   )r  )rN   rq   r[   r   r   r   parseChainedPos  s    r
  c       	         s(  t  }d|_g g f}xj|  d dr|  d d td   }dt jfdt j	fd| \}}|| 
t| ||d qW |d |_t|j|_|d |_	t|j	|_i  x8| D ]0}t|dkst|t|}|d  |d < qW tt  ||_ fdd|jjD |_t|j|_|S )	Nrd   r   zcoverage definition begin)r   r  )r   r   c                s   g | ]} | qS r   r   )r   r   )r#   r   r   r   &  s    z,parseReverseChainedSubst.<locals>.<listcomp>)rE   ZReverseChainSingleSubstr   rh   r   r   rH   ri   r   r   r:   r   r   r   r   r    r   r   r   r   r   Z
Substituter   )	rN   rq   rr   r5   r  r   r$   r   rQ   r   )r#   r   parseReverseChainedSubst  s,    



r  c             C   s  |  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 g }xt|  rF| d> x6|  r |
| ||}|j|jkst|| qW W d Q R X |  d dkrt|  qW W d Q R X |  d ||_t |j|_!|j!dkr~d S |S )NlookupzParsing lookup type %s %srd   r   r?   r<         re   )singleZmultipleZ	alternater   contextchainedZreversechained   )	r  r   ZkernsetZcursivezmark to basezmark to ligaturezmark to markr  r  )GSUBGPOSz
lookup end)z
% subtablezsubtable endr   )"expectr7   r8   rE   Lookupro   Z
LookupFlagZMarkFilteringSetrs   rt   ru   rw   r  r	  r  r   r   r   r   r   r   r   r  r
  Z
LookupTyper   r   r   r:   rh   rj   ZSubTablerH   ZSubTableCount)rN   tableTagrq   r[   rQ   _r\   r   r  rm   ZparseLookupSubTableZ	subtablesZsubtabler   r   r   parseLookup*  sP    



r  c                s  t | }t t  |dks$ttd| tt| }d|_d fddfd fddfd	d
}x |	 D ]\}}t
||d  qrW x*|  d k	r|  d  }||krtd|   t|  q|| \}}|dkr|jd krt |_g |j_|  \}	}
}	t| ||}d k	rP|
ks>td|
 t|jj|
< n,t|
t|jjks|td|
t|jf |jj| qt||d kst|t
||||  qW |jrt|jj|j_d k	r   d k	r   ||_|S )N)r  r  z
Parsing %si   rF   c                s
   t |  S )N)rW   )rN   )rO   r   r   r,   i  r-   zparseGSUBGPOS.<locals>.<lambda>rX   c                s   t |  S )N)r_   )rN   )rO   r[   r   r   r,   l  r-   )
LookupListN)zscript table beginzfeature table beginr  r   zSkipping %sr  zDuplicate lookup name: %sz%d %d)r   getTableClassr3   r   r7   r8   r   rE   Versionr|   rI   r   ri   rj   r  r  r  rH   r   r:   rZ   r;   table)rN   rq   r  	containerr5   fieldsattrparserr   r  r\   r  r   )rO   r[   r   parseGSUBGPOS^  sT    


,

r"  c             C   s   t | |dS )Nr  )r"  )rN   rq   r   r   r   	parseGSUB  s    r#  c             C   s   t | |dS )Nr  )r"  )rN   rq   r   r   r   	parseGPOS  s    r$  c          	   C   sn   i }|  dJ xB| D ]:}t|d }||ks6t|dd |dd  D ||< qW W d Q R X t|| S )Nzattachment listr   c             S   s   g | ]}t |qS r   )r   )r   rU   r   r   r   r     s    z#parseAttachList.<locals>.<listcomp>rd   )rG   r   r   rp   ZbuildAttachListr{   )rN   rq   ZpointsrQ   r   r   r   r   parseAttachList  s    
(r%  c          	   C   s   i }|  dn xf| D ]^}t|d }||ks6t|t|d }dd |dd  D }|t|kslt||||< qW W d Q R X t|i | S )Ncaretsr   rd   c             S   s   g | ]}t |qS r   )r   )r   rU   r   r   r   r     s    z"parseCaretList.<locals>.<listcomp>r   )rG   r   r   r   rH   rp   ZbuildLigCaretListr{   )rN   rq   r&  rQ   r   numZ
thisCaretsr   r   r   parseCaretList  s    
r(  c             C   s`   t  }d|_dt|   |_d g|j |_x,t|  D ]\}}t	t
|||j|< q<W |S )Nrd   )rE   MarkGlyphSetsDefZMarkSetTableFormatr   r   ZMarkSetCountr   rM   r   r   r   )setsrq   r5   r   r~   r   r   r   makeMarkFilteringSets  s    r+  c          	   C   s|   i }|  d^ xV| D ]N}t|dks.t|t|d }t|d }||krVg ||< || | qW W d Q R X t||S )Nzset definitionr   r   rd   )rG   rH   r   r   r   r:   r+  )rN   rq   r*  rQ   r   str   r   r   parseMarkFilteringSets  s    
r-  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}x |	 D ]\}}t
||d  qTW xr|  d k	r|  d  }||krtd| t|  qn|| \}}t||d kst|t
|||| | qnW |jd krdnd|_||_|S )NGDEFzParsing GDEFGlyphClassDefc             S   s   t | |tjdS )N)r   )r   rE   r/  )rN   rq   r   r   r   r,     r-   zparseGDEF.<locals>.<lambda>Z
AttachListZLigCaretListMarkAttachClassDefc             S   s   t | |tjdS )N)r   )r   rE   r0  )rN   rq   r   r   r   r,     r-   r)  )zclass definition beginzattachment list beginzcarets beginz&mark attachment class definition beginzmarkfilter set definition beginr   zSkipping %si   i  )r   r  r7   r8   rE   r.  r%  r(  r-  r|   rI   r   ri   rj   r   r   r)  r  r  )rN   rq   r  r5   r  r   r!  r   r   r   r   	parseGDEF  s0    
r1  c       
         s   t d }td g }x  d k	r dt|   fdddD \}}}}t| |}||_||_	||_
i |_t }	x0|	d dkr|	d	 |jt|	d d
< t }	qW || qW d|_||_|S )NcmapzParsing cmapzcmap subtable %dc                s   g | ]}t  |qS r   )parseCmapId)r   field)rN   r   r   r     s   zparseCmap.<locals>.<listcomp>)
platformIDZ
encodingIDformatlanguager   zend subtablerd   r   )r   r  r7   r8   r   r  rH   r   r5  Z	platEncIDr7  r2  rj   r   r:   ZtableVersiontables)
rN   rq   r  r8  ZplatIdZencIdfmtlangr  rQ   r   )rN   r   	parseCmap  s(    

r;  c             C   s$   t | }||d kstt|d S )Nr   rd   )rj   r   r   )rN   r4  rQ   r   r   r   r3    s    r3  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FontDamerd   r   r?   zFont Chef Tabler<   z7Don't know what table to parse and data doesn't specify)r  r  r.  r2  )r7   r8   rh   r   joinrj   ljustr   r#  r$  r1  r;  )rN   rq   r  rQ   tagr   r   r   
parseTable  s&    

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 |}y|j| _W n   d | _Y nX t || _d| _d| _g | _d | _d S )Nr=   r   )iterr\   filenamerN   rQ   linenostoppersbuffer)r5   frN   r   r   r   r6     s    
zTokenizer.__init__c             C   s   | S )Nr   )r5   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  x|r|d s|d= qpW |S )Nrd   c             S   s   g | ]}|  qS r   )r   )r   r   r   r   r   r   -  s    z(Tokenizer._next_line.<locals>.<listcomp>	r   z!trailing tab found on line %d: %s)rC  rj   rN   rQ   r   rH   r7   warning)r5   rQ   r   r   r   
_next_line*  s    
zTokenizer._next_linec             C   s>   x8|   }|r|d r|d d dks2|d dkr|S qW d S )Nr   %z
% subtable)rK  )r5   rQ   r   r   r   _next_nonempty6  s    (zTokenizer._next_nonemptyc             C   s"   | j r| j }d | _ |S |  S d S )N)rE  rM  )r5   retr   r   r   _next_buffered=  s
    zTokenizer._next_bufferedc             C   s(   |   }|d  | jkr$|| _t|S )Nr   )rO  ri   rD  rE  StopIteration)r5   rQ   r   r   r   __next__E  s
    zTokenizer.__next__c             C   s   |   S )N)rQ  )r5   r   r   r   rj   L  s    zTokenizer.nextc             C   sH   | j s*y|  | _ W n tk
r(   d S X | j d  | jkrBd S | j S )Nr   )rE  rM  rP  ri   rD  )r5   r   r   r   r   O  s    zTokenizer.peekc             C   s   |   }|d k	r|S dS )N)r=   )r   )r5   rN  r   r   r   rh   Y  s    zTokenizer.peeksc             c   sF   |d }|d }|  | | j| d V  | jd= | |d  d S )Nz beginz endrI  )expectendswithrD  r:   r  )r5   r>  startendr   r   r   rG   ]  s    
zTokenizer.betweenc             c   s:   t |tk	r|f}| j| d V  | jt| d = d S )N)r9   rv   rD  extendrH   )r5   tagsr   r   r   r   g  s
    zTokenizer.untilc             C   s0   t | }|d  }||ks,td||f |S )Nr   zExpected '%s', got '%s')rj   ri   r   )r5   r   rQ   r>  r   r   r   r  o  s    zTokenizer.expectc             C   s2   t | }|d  }||s.td||f |S )Nr   zExpected '*%s', got '%s')rj   ri   r   r   )r5   r   rQ   r>  r   r   r   rR  u  s    zTokenizer.expectendswithN)r   r   r   r6   rG  rK  rM  rO  rQ  rj   r   rh   r   rG   r   r  rR  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_``)
	)r  )r@  r?  )rF  rq   r  rN   r   r   r   build{  s    rW  c          
   C   sr  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| }x| jD ]}td| t|ddd}t||| jd}W dQ R X ||}	| }
|
|	| ddlm} |j}||j}|| |  |
|| | | |  qW dS )zConvert a FontDame OTL file to TTX XML

	Writes XML output to stdout.

	Args:
		args: Command line arguments (``--font``, ``--table``, input files).
	r   N)configLogger)MockFontrd   zfonttools mtiLib)descriptionz--fontz-fFILErq   zDInput TTF files (used for glyph classes and sorting coverage tables))metavardesthelpz--tablez-tZTABLEr  z7Table to fill (sniffed from input file if not provided)inputs+zInput FontDame .txt files)r\  r9   nargsr^  zProcessing %srtzutf-8)encoding)r  )	xmlWriter)!sys	fontToolsrX  ZfontTools.misc.testToolsrY  argvargparseArgumentParsermain__doc__add_argumentstr
parse_argsrq   r   r   r_  r7   r8   openrW  r  compile	__class__Z	decompileZfontTools.miscrd  Z	XMLWriterstdoutZbegintagnewlineZtoXMLZendtag)argsrq   re  rX  rY  rh  r!  rF  r  ZblobZ
decompiledrd  r>  writerr   r   r   rj    sH    




rj  __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)\rf  r   ZfontTools.ttLib.tables._c_m_a_pr   ZfontTools.ttLib.tablesr   rE   ZfontTools.ttLib.tables.otBaser   r   ZfontTools.otlLibr   rp   
contextlibr   operatorr	   logging	Exceptionr
   r   r   r   	getLoggerr7   r   r    r%   r'   r2   r   r3   rW   r_   ro   rs   rt   ru   rw   r   r   r   r   r   r   r   r   r   r   objectr   r   r   r   r   r   r   rJ   r   r   r   r   r   r   r   r   r   r   r  r  r  r	  r
  r  r  r"  r#  r$  r%  r(  r+  r-  r1  r;  r3  r?  r@  rW  rj  r   re  r   r   r   r   r   <module>	   s   
	
2
 





X


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