o
    a                      @   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rd dlZZZeZ[eX  dS dS )    )ttLib)cmap_classes)otTables)ValueRecordvalueRecordFormatDict)builder)contextmanager)setitemNc                   @      e Zd ZdS )MtiLibErrorN__name__
__module____qualname__ r   r   ;/usr/lib/python3/dist-packages/fontTools/mtiLib/__init__.pyr          r   c                   @   r
   )ReferenceNotFoundErrorNr   r   r   r   r   r      r   r   c                   @   r
   )FeatureNotFoundErrorNr   r   r   r   r   r      r   r   c                   @   r
   )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r'dt| dd   S | ddk s4J d|  | s:J d	| S )
N   )zU zu    z# z	glyph%.5d r   zSpace found in glyph name: %szGlyph name is empty)r   TTFontZ_makeGlyphNameintfind)sr   r   r   	makeGlyph   s   r   c                 C   s   dd | D S )Nc                 S      g | ]}t |qS r   )r   ).0gr   r   r   
<listcomp>%       zmakeGlyphs.<locals>.<listcomp>r   )lr   r   r   
makeGlyphs$      r$   c                 C   s:   |d urz||  }W |S  t y   t| w t| }|S N)KeyErrorr   r   symmappingidxr   r   r   	mapLookup'   s   
r,   c                 C   sF   zt | }W |S  ty"   z||  }W Y |S  ty!   t| w w r&   )r   
ValueErrorr'   r   r(   r   r   r   
mapFeature3   s   
r.   c                    s   z| ||}W n1 t y8 } z%z|d ur)| fdd|| W W Y d }~d S W   ty3   Y  w d }~ww  | 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)   r3   r1   r2   mappeder   r0   r   setReference?   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__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   r;   append)r=   r3   r)   r8   r   r   r   r5   Q   s   z"DeferredMapping.addDeferredMappingc              	   C   sd   | j D ])\}}}td|t|j z| | }W n	 ty!   |w || td| qg | _ d S )Nz,Applying deferred mapping for symbol '%s' %sz	Set to %s)r;   r?   r@   rA   r   r'   )r=   r3   r)   r8   r7   r   r   r   applyDeferredMappingsU   s   
z%DeferredMapping.applyDeferredMappingsN)r   r   r   r>   r5   rC   r   r   r   r   r:   L   s    r:   c              
      s  t  }g }| d | D ]}t|dk r!|d t|dk s|\ }}}td | t  }d |_|rAt	t
||t|d nd|_t|}	dgt|	  |_}
t|	D ]\}}t	t
||t|
| qVt|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 sw   Y  |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!   w   s    z#parseScriptList.<locals>.<listcomp>r   defaultr   c                 S      | j S r&   )
LangSysTagrecr   r   r   r4          z!parseScriptList.<locals>.<lambda>r2   c                 S   rM   r&   rH   rO   r   r   r   r4      rQ   )ot
ScriptListbetweenlenrB   r?   r@   ZLangSysZLookupOrderr9   r.   setattrrF   stripSplitCommaZFeatureIndex	enumerater	   FeatureCountZScriptZScriptRecordrI   ZDefaultLangSysZLangSysRecordZLangSysCountrN   sortedZScriptCount)lines
featureMapr=   recordslineZ
langSysTagZdefaultFeatureZfeaturesZlangSyssymstheListir)   ZscriptZ	scriptRecZ
langSysRecr   rK   r   parseScriptLista   sX   


)rc   c              
   C   sB  t  }g |_| d | D ]z}|\}}}|d ur+||vs$J d| t|j||< zt|t|jks@J d|t|jf W n	 tyJ   Y nw t  }||_t  |_|j	| |j}	d |	_
t|}
d gt|
  |	_}t|
D ]\}}tt||t|| qut|	j|	_qW d    n1 sw   Y  t|j|_|S )Nzfeature tablezDuplicate feature name: %s%d %d)rS   FeatureListZFeatureRecordrU   rV   r   r-   Z
FeatureTagZFeaturerB   ZFeatureParamsrX   LookupListIndexrY   r9   r,   r	   LookupCountrZ   )r\   	lookupMapr]   r=   r_   nameZ
featureTagZlookupsZ
featureRecZfeaturer`   ra   rb   r)   r   r   r   parseFeatureList   s8   
,
rj   c                 C   s   d}d }g d}|   d  |v rpt| }ddddd|d  }|rA|d  dv s4J |d |d  d	kr@||O }q|d  d
krT|t|d d> O }q|d  dkrf|dO }t|d }|   d  |v s||fS )Nr   )righttoleftignorebaseglyphsignoreligaturesignoremarksmarkattachmenttypemarkfiltertype   r   rD      )rk   rl   rm   rn   )yesnors   ro   rp   r   )peekslowernextgetr   )r\   flags	filtersetZallFlagsr_   flagr   r   r   parseLookupFlags   s2   r|   c                 C   sD   i }| D ]}t |dksJ |t|}|d ||d < qt|S )Nr   rq   r   )rV   r$   otlZbuildSingleSubstSubtabler\   font
_lookupMapr*   r_   r   r   r   parseSingleSubst   s   
r   c                 C   4   i }| D ]}t |}|dd  ||d < qt|S Nrq   r   )r$   r}   ZbuildMultipleSubstSubtabler~   r   r   r   parseMultiple   
   
r   c                 C   r   r   )r$   r}   ZbuildAlternateSubstSubtabler~   r   r   r   parseAlternate   r   r   c                 C   sL   i }| D ]}t |dksJ |t|}|d |t|dd  < qt|S )Nr   r   rq   )rV   r$   tupler}   ZbuildLigatureSubstSubtabler~   r   r   r   parseLigature   s   
r   c                 C   s   i }| D ]F}t |dksJ ||d  dd}|tv s J t|d }t|d }||vr5t ||< t|| |rBJ ||ft|| || qt	
|| S )NrG   r   r   rE   rq   r   )rV   titlereplacer   r   r   r   hasattrrW   r}   ZbuildSinglePosSubtablegetReverseGlyphMap)r\   r   r   valuesr_   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rni ||
< |||
 vr~t t f||
 |< ||
 | }|dkr| j|	O  _|d }n| j|	O  _|d }t||rJ ||ft||| q"tt| ||_g |_|jjD ]F}
||
 }t  }g  }|_t| |jd	D ]!}|| }t  }||_|d |_|jr|d nd |_|| qt|j|_|j| qt|j|_|S | d
rMd|_d d g}|  d  drb| ! d d td   }dt j"fdt j#fd| \}}|| d u sOJ t$| ||d||< |  d  ds(|\|_"|_#dd |D \|_%|_&dd t'|j%D |_(|j(D ]}dd t'|j&D |_)|j)D ]}t |_t |_qq| D ]y}t|dksJ ||d  d  }|dv sJ ||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 ]}t|j|j|_|jr8t|j|jnd |_q#qtt|j"j* ||_|S J |)Nr   leftrightrq   rD   r   rE   rG   r   rR   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>2       zparsePair.<locals>.<genexpr>c                 S      g | ]}t  qS r   )rS   Class1Recordr   rb   r   r   r   r!   3  r"   zparsePair.<locals>.<listcomp>c                 S   r   r   )rS   Class2Record)r   jr   r   r   r!   5  r"   c                 s       | ]}t |V  qd S r&   r   r   xr   r   r   r   ?      )+rS   ZPairPosZValueFormat1ZValueFormat2ru   splitrv   FormatrV   r   r   r   r$   r   r   r   rW   makeCoveragesetkeysCoverageZPairSetglyphsZPairValueRecordr[   
getGlyphIDZSecondGlyphZValue1ZValue2rB   ZPairValueCountZPairSetCountendswithpeekZ	ClassDef1Z	ClassDef2parseClassDefZClass1CountZClass2Countranger   r   r   )r\   r   r   r=   typr   r_   ZsideZ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   s^   |   d  d  }|dv r*| d t| |W  d    S 1 s%w   Y  t| |S )Nr   r   )zfirstclass definition beginzsecondclass definition begin)ru   r   rv   untilr   )r\   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   rq   r   rE   )rV   r   intSplitCommaZXCoordinateZYCoordinater   ZAnchorPoint)datar   anchorr   r   r   
makeAnchor[  s   r   c                 C   s   i }| D ]H}t |dv sJ |dtjfdtjfd|d  \}}t|d }||vr1d d g||< || | d u s?J ||ft|dd  ||| |< qt|| S )N)rG   rD   r   rq   )entryexitr   )	rV   rS   ZEntryAnchorZ
ExitAnchorr   r   r}   ZbuildCursivePosSubtabler   )r\   r   r   r^   r_   r+   r   glyphr   r   r   parseCursivee  s   r   c                 C   sF   g }|j D ]}| | \}}| }||_t||j| || q|S r&   )r   ZMarkRecordClassClassrW   Z
MarkAnchorrB   )r   coverager   r^   r   r   r   recordr   r   r   makeMarkRecordst  s   
r   c                 C   s   g }i }|j D ]}t|||< | }d g| }t||j| || q|  D ]"\\}}	}
|||  }t||j}||	 d u sGJ ||	f|
||	< q)|S r&   )r   rV   ZBaseRecordClassrW   Z
BaseAnchorrB   itemsgetattr)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 u rKt  }||| < |	|_dd t|	D |_|jD ]}d g| |_	qB|j|	ksXJ ||j|	f|j|d  j	}|| d u smJ |||f|
||< q|S )Nc                 S   s   i | ]\}}||qS r   r   )r   rb   r    r   r   r   
<dictcomp>  s    z'makeLigatureRecords.<locals>.<dictcomp>c                 S   r   r   )rS   ComponentRecordr   r   r   r   r!     r"   z'makeLigatureRecords.<locals>.<listcomp>rq   )
rV   r   rY   r   rS   LigatureAttachZComponentCountr   r   ZLigatureAnchor)r   r   r   r   r^   r+   r   r   ZcompIdxZ	compCountr   r   ZcompRecr   r   r   r   makeLigatureRecords  s   

r   c                 C   s6  |  }d|_i }i }||jf||jf||jfd}d}| D ]h}|d }	|	dv s*J t|d }
||	 \}}|	dkr<dnd}tdd |dd|  D }t|d|  }t|d| d  |}|	d	krl|
||f}}n	|
|f| |}}||vs}J ||||< 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   r   r&   r   r   r   r   r   r     r   z'parseMarkToSomething.<locals>.<genexpr>rG   r   c                 s   s    | ]	\}}|d  V  qdS r   r   )r   kr   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   rW   Z
MarkRecordZ	MarkCountrV   ZMarkCoverageZ	MarkArrayZ
ClassCountr   r   ZBaseCoverageClassZBaseArrayClassBaser   r   Z
BaseRecordZ	BaseCountZBaseCoverageZ	BaseArray)r\   r   r   r=   ZmarkDataZbaseDataZDataZmaxKlassr_   r   r   r   ZanchorClassZ
extraItemsextrasr   r   r2   r   ZmarkCoverageZ	markArrayZmarkRecordsZbaseCoverageZ	baseArrayZbaseRecordsr   r   r   parseMarkToSomething  sV   
$ 
r   c                   @      e Zd Zdd ZdS )
MarkHelperc                 C   s~   dD ]:}dD ]5}|| }|dkr|dv r|}nt | || }|dkr$d}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   rW   rS   )r=   ZWhichZWhatr2   r   r   r   r   r   r>     s   
zMarkHelper.__init__Nr   r   r   r>   r   r   r   r   r         r   c                   @      e Zd ZdZdZejZdS )MarkToBaseHelperr   r   N)r   r   r   r   r   rS   ZMarkBasePosr   r   r   r   r   r         
r   c                   @   r   )MarkToMarkHelperZMark1ZMark2N)r   r   r   r   r   rS   ZMarkMarkPosr   r   r   r   r   r     r   r   c                   @   r   )MarkToLigatureHelperr   r   N)r   r   r   r   r   rS   Z
MarkLigPosr   r   r   r   r   r     r   r   c                 C      t | |t S r&   )r   r   r\   r   r   r   r   r   parseMarkToBase  r%   r   c                 C   r   r&   )r   r   r   r   r   r   parseMarkToMark  r%   r   c                 C   r   r&   )r   r   r   r   r   r   parseMarkToLigature  r%   r   c                 C      | rdd |  dD S g S )Nc                 S      g | ]}|  qS r   striprJ   r   r   r   r!     r"   z#stripSplitComma.<locals>.<listcomp>,r   r_   r   r   r   rX        rX   c                 C   r   )Nc                 S   r   r   r   r   r   r   r   r!     r"   z!intSplitComma.<locals>.<listcomp>r   r   r   r   r   r   r     r   r   c                   @   r   )ContextHelperc                 C   sl  | dr
d}d}nd}d}|drd}d}d}nd}d}d}|| }|| _|| _|| _|| _|| _|| _|d	 | _|dkrdd
d }	dd }
dd }dd }d }d }dd }dd }dd }dd }nX|dkrdd }	dd }
dd }dd }dd }dd }dd }dd }d d }d!d }n+|dkrd"d }	d#d }
d }d }d }d }d$d }d%d }d&d }d'd }nJ d(| |r|
| _	|| _
|| _|| _|| _n|	| _	|| _
|| _|| _|| _|dkr|d) | _|d* | _|d+ | _|d, | _d-d | _d S |dkr4|d. | _|d/ | _|d0 | _|d1 | _d2d | _|rd3nd4| _|r'dnd| _|r/d5nd6| _d S d S )7NZSubstZSubZPosChainrq   rG   rE   r   LookupRecordc                 S   rM   r&   r   rr   r   r   r4     rQ   z(ContextHelper.__init__.<locals>.<lambda>c                 S   rM   r&   r   r   r   r   r   r4     rQ   c                 S      dS )Nr&   r   r   r   r   r   r4         c                 S   r   )N)NNNr   r   r   r   r   r4      r   c                 S      | j fS r&   )Inputr   r   r   r   r4   #      c                 S      | j | j| jfS r&   	Backtrackr   	LookAheadr   r   r   r   r4   $      c                 S      |\| _ dd |D \| _d S )Nc                 s       | ]	}t |d  V  qdS r   rV   r   r   r   r   r   '  r   >ContextHelper.__init__.<locals>.SetRuleData.<locals>.<genexpr>)r   
GlyphCountr   dr   r   r   SetRuleData%     z+ContextHelper.__init__.<locals>.SetRuleDatac                 S   F   |\| _ | _| _t|d t|d d t|d | _| _| _d S Nr   rq   r   r  r   r  rV   BacktrackGlyphCountInputGlyphCountLookAheadGlyphCountr  r   r   r   ChainSetRuleData(     6z0ContextHelper.__init__.<locals>.ChainSetRuleDatar   c                 S   rM   r&   r   r   r   r   r   r4   ,  rQ   c                 S   rM   r&   r   r   r   r   r   r4   -  rQ   c                 S   r   r&   ClassDefr   r   r   r   r4   .  r  c                 S   r  r&   BacktrackClassDefInputClassDefLookAheadClassDefr   r   r   r   r4   /  s    c                 S   s   |\| _ d S r&   r  r  r   r   r   SetContextData2     z.ContextHelper.__init__.<locals>.SetContextDatac                 S   s   |\| _ | _| _d S r&   r  r  r   r   r   SetChainContextData4  s   z3ContextHelper.__init__.<locals>.SetChainContextDatac                 S   r   r&   )r   r   r   r   r   r4   8  r  c                 S   r  r&   r  r   r   r   r   r4   9  r  c                 S   r  )Nc                 s   r  r   r	  r   r   r   r   r   <  r   r
  )r   r  r  r   r   r   r  :  r  c                 S   r  r  r  r  r   r   r   r  =  r  c                 S   
   | j d S Nr   r   r   r   r   r   r4   A     
 c                 S   r!  r"  )InputCoverager   r   r   r   r4   B  r#  c                 S   rM   r&   r   r   r   r   r   r4   G  rQ   c                 S   s   | j | j | j S r&   )BacktrackCoverager$  LookAheadCoverager   r   r   r   r4   H  s
    c                 S   r  )Nc                 s   r   r&   r	  r   r   r   r   r   M  r   r
  )r   r  r  r   r   r   r  K  r  c                 S   s.   |\| _ | _| _dd |D \| _| _| _d S )Nc                 s   r   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   r4   f  s    Z	ClassRuleZClassRuleCountZClassSetZClassSetCountc                 S   s&   |r| | |S |dkrt| S t S r"  )Zintersect_classr   r+  r   r   r   r4   l  s    r  r  r   r   )r   
startswithTypr   r   ChainTypInputIdxDataLenr   r   ContextDatar  RuleDatar  r'  r(  r)  r*  Z	Intersectr  ZClassDefIndexr   )r=   	klassNamer   r-  r   r   r/  r0  r.  r   ZChainCoverager1  ZChainContextDatar  r   r2  ZChainRuleDatar  r  r   r   r   r>     s   















zContextHelper.__init__Nr   r   r   r   r   r     r   r   c                 C   s   t t|}g }| D ]6}| }t|}t|dksJ |t|d }|dks*J ||d |_tt||d t|d |	| q	|S )Nr   r   rq   rf   )
r   rS   rX   rV   r   ZSequenceIndexr9   r,   rW   rB   )r   r3  rh   r   ZlstitemrP   r+   r   r   r   parseLookupRecordss  s   

r5  c                 C   s   | sd S | }t | |_|S r&   )dictr   )r   r   r   r=   r   r   r   makeClassDef  s   
r7  c                 C   sp   i }|  d# | D ]}t|d }||vsJ |t|d ||< q
W d    n1 s-w   Y  t|||S )Nzclass definitionr   rq   )rU   r   r   r7  )r\   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 )NrR   )
isinstancer   r[   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 w   Y  t|||S )Nzcoverage definitionr   )rU   rB   r   r   )r\   r   r   r   r_   r   r   r   parseCoverage  s   r9  c                    s$  i }|D ]\}}| | j d g t fddt|D |f qg }|D ]W}||vr4|d  q(g }	|| D ](\}}tt j }
 |
| t	|
 j
d t| t	|
 j| |	|
 q:tt j }t	| j|	 t	| jt|	 || q(t	|  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   rb   r   r   r   r   r     s   , z!bucketizeRules.<locals>.<genexpr>r   )
setdefaultr/  rB   r   rY   r   rS   r'  r  rW   r   rV   r   r)  r(  r*  )r=   r   rulesZ
bucketKeysZbucketsseqrecsZrulesetsZ
firstGlyphZ	thisRulesZruleZrulesetr   r;  r   bucketizeRules  s*   8
r@  c                    s  t t| }|  d  d  }|dkrd|_td||j t||j g }| D ]L}|d  dks;J |d t	|d j
 k rR|d t	|d j
 k sDtdd |dd j
  D }t|d j
 d   j|}	|||	f q+t fdd|D }
t|
||_t| ||jj |S |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 u sJ |t| ||d||< |  d ds || g }| D ]Q}|d  d	s J |d t	|d j
 k r9|d t	|d j
 k s*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  |S |drFd|_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 |  d ds &|| t'| } t	| dksJ | d }|d  dks'J |d t|dd   j|}	t(| j)d t	|	 t(| j|	 |S J |)Nr   r   rq   zParsing %s format %srE   c                 s   s    | ]	}t t|V  qd S r&   )r$   rX   r   r   r   r   r     r   zparseContext.<locals>.<genexpr>c                 3   "    | ]\}}| j  d  V  qdS r   Nr:  r   r>  r?  r;  r   r   r     r   r   r   r   )	backtrackrE   	lookahead)rq   rG   r   c                 s   r   r&   )r   r   r   r   r   r     r   c                 3   rA  rB  r:  rC  r;  r   r   r     r   c                 3   s     | ]\}}| v 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     s    coverage definition begin)rD  inputrE  r   )*r   rS   ru   r   rv   r   r?   r@   r   rV   r0  rB   r   r5  r   r   r   r   r@  r   r   r   r  r  r  r  r   r  r,  r/  r   r   r   r   r%  r$  r&  r9  r  listrW   r   )r\   r   r   rh   r=   r   r=  r_   r>  r?  ZfirstGlyphsr   r+   r   	coveragesr   )r   rF  r   parseContext  s   . <
		
 2 "
		
rK  c                 C      t | |d|dS )NZContextSubstrh   rK  r\   r   rh   r   r   r   parseContextSubst     rP  c                 C   rL  )NZ
ContextPosrM  rN  rO  r   r   r   parseContextPos
  rQ  rR  c                 C   rL  )NZChainContextSubstrM  rN  rO  r   r   r   parseChainedSubst  rQ  rS  c                 C   rL  )NZChainContextPosrM  rN  rO  r   r   r   parseChainedPos  rQ  rT  c           	         s0  t  }d|_g g f}|  d drG|  d d td   }dt jfdt j	fd| \}}|| 
t| ||d |  d ds|d |_t|j|_|d |_	t|j	|_i  | D ]}t|dksmJ |t|}|d  |d < qatt  ||_ fdd|jjD |_t|j|_|S )	Nrq   r   rG  )rD  rE  r   r   c                    s   g | ]} | qS r   r   r   r*   r   r   r!   &  r"   z,parseReverseChainedSubst.<locals>.<listcomp>)rS   ZReverseChainSingleSubstr   ru   r   r   rV   rv   r%  r&  rB   r9  r  r  r$   r   r   r   r   r   Z
Substituter  )	r\   r   r   r=   rJ  r   r+   r   r_   r   rU  r   parseReverseChainedSubst  s2   

rV  c                 C   s  |  d}|\}}}td|| t }t| \|_}	|	d ur#|	|_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N g }|  r| d# |  r|
| ||}|j|jksJ || |  swW d    n1 sw   Y  |  d dv rt|  |  smW d    n1 sw   Y  |  d ||_t|j|_ |j dkrd S |S )NlookupzParsing lookup type %s %srq   r   rG   rD         rr   )singleZmultipleZ	alternater   contextchainedZreversechained   )	rZ  r   ZkernsetZcursivezmark to basezmark to ligaturezmark to markr[  r\  GSUBGPOSz
lookup end)
% subtablezsubtable endr   )!expectr?   r@   rS   Lookupr|   Z
LookupFlagZMarkFilteringSetr   r   r   r   rP  rS  rV  r   r   r   r   r   r   r   rR  rT  Z
LookupTyper   r   rB   ru   rw   ZSubTablerV   ZSubTableCount)r\   tableTagr   rh   r_   _ri   r   rW  rz   ZparseLookupSubTableZ	subtablesZsubtabler   r   r   parseLookup*  sh   






rf  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  q8| 
 d ur| 
 d  }||vrbtd| 
  t|  qC|| \}}|dkr|jd u rzt |_g |j_| 
 \}	}
}	t| ||}d ur|
vsJ d|
 t|jj|
< nt|
t|jjksJ d|
t|jf |jj| nt||d u sJ |t	||||  | 
 d usI|jrt|jj|j_d ur   d ur   ||_|S )Nr^  z
Parsing %s   rT   c                    s
   t |  S r&   )rc   r\   )r]   r   r   r4   i  r#  zparseGSUBGPOS.<locals>.<lambda>re   c                    s   t |  S r&   )rj   rh  r]   rh   r   r   r4   l  r   )
LookupListN)zscript table beginzfeature table beginrW  r   Skipping %srW  zDuplicate lookup name: %srd   )r   getTableClassr:   r?   r@   r   rS   Versionr   rW   r   rv   rw   rj  rc  rf  rV   r   rB   rg   rC   table)r\   r   rd  	containerr=   fieldsattrparserr   re  ri   rW  r   ri  r   parseGSUBGPOS^  s\   


*rs  c                 C      t | |dS )Nr_  rs  r\   r   r   r   r   	parseGSUB  r  rw  c                 C   rt  )Nr`  ru  rv  r   r   r   	parseGPOS  r  rx  c                 C   s~   i }|  d( | D ]}t|d }||vsJ |dd |dd  D ||< q
W d    n1 s2w   Y  t|| S )Nzattachment listr   c                 S   r   r   r   r   r   r   r   r!     r"   z#parseAttachList.<locals>.<listcomp>rq   )rU   r   r}   ZbuildAttachListr   )r\   r   Zpointsr_   r   r   r   r   parseAttachList  s   ry  c                 C   s   i }|  d: | D ]/}t|d }||vsJ |t|d }dd |dd  D }|t|ks5J ||||< q
W d    n1 sDw   Y  t|i | S )Ncaretsr   rq   c                 S   r   r   r   r   r   r   r   r!     r"   z"parseCaretList.<locals>.<listcomp>r   )rU   r   r   rV   r}   ZbuildLigCaretListr   )r\   r   rz  r_   r   ZnumZ
thisCaretsr   r   r   parseCaretList  s   
r{  c                 C   s\   t  }d|_dt|   |_d g|j |_t|  D ]\}}t	t
|||j|< q|S )Nrq   )rS   MarkGlyphSetsDefZMarkSetTableFormatr   r   ZMarkSetCountr   r[   r   r   r   )setsr   r=   r   r   r   r   r   makeMarkFilteringSets  s   r~  c                 C   s   i }|  d2 | D ]'}t|dksJ |t|d }t|d }||vr*g ||< || | q
W d    n1 s<w   Y  t||S )Nzset definitionr   r   rq   )rU   rV   r   r   rB   r~  )r\   r   r}  r_   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}|	 D ]
\}}t
||d  q)|  d urq|  d  }||vrQtd| t|  q4|| \}}t||d u sbJ |t
|||| | |  d us:|jd u rxdnd|_||_|S )NGDEFzParsing GDEFGlyphClassDefc                 S      t | |tjdS Nr   )r   rS   r  rv  r   r   r   r4     r  zparseGDEF.<locals>.<lambda>Z
AttachListZLigCaretListMarkAttachClassDefc                 S   r  r  )r   rS   r  rv  r   r   r   r4     r  r|  )r   zattachment list beginzcarets beginz&mark attachment class definition beginzmarkfilter set definition beginr   rk  rg  i  )r   rl  r?   r@   rS   r  ry  r{  r  r   rW   r   rv   rw   r   r|  rm  rn  )r\   r   ro  r=   rp  rq  rr  r   r   r   r   	parseGDEF  s8   
	r  c           
         s   t d }td g }  d urf dt|   fdddD \}}}}t| |}||_||_	||_
i |_t }	|	d dkr[|	d	 |jt|	d d
< t }	|	d dksE||   d usd|_||_|S )NcmapzParsing cmapzcmap subtable %dc                    s   g | ]}t  |qS r   )parseCmapId)r   fieldrh  r   r   r!     s    zparseCmap.<locals>.<listcomp>)
platformIDZ
encodingIDformatlanguager   zend subtablerq   r   )r   rl  r?   r@   r   rb  rV   r   r  Z	platEncIDr  r  rw   r   rB   ZtableVersiontables)
r\   r   ro  r  ZplatIdZencIdZfmtlangrn  r_   r   rh  r   	parseCmap  s.   


r  c                 C   s$   t | }||d ksJ t|d S )Nr   rq   )rw   r   )r\   r  r_   r   r   r   r    s   r  c                 C   s   t d |  }d }|d  d dkr|d  d }nd|d  d d dkr5|d  d }|d urSt|  |d}|d u rI|}n
||ksSJ ||f|d us[J 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)r_  r`  r  r  )r?   r@   ru   r   joinrw   ljustrw  rx  r  r  )r\   r   rd  r_   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   sJ   t |}z|j| _W n   d | _Y t || _d| _d| _g | _d | _d S )NrE   r   )iterri   filenamer\   r_   linenostoppersbuffer)r=   fr\   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r&|d s&|d= |rF|d sFtd| j | jf  |rF|d sF|d= |rF|d r=|S )Nrq   c                 S   r   r   r   rJ   r   r   r   r!   -  r"   z(Tokenizer._next_line.<locals>.<listcomp>	r   z!trailing tab found on line %d: %s)r  rw   r\   r_   r   rV   r?   Zwarningr=   r_   r   r   r   
_next_line*  s   zTokenizer._next_linec                 C   s8   	 |   }|r|d r|d d dks|d dkr|S q)NTr   %ra  )r  r  r   r   r   _next_nonempty6  s
   (zTokenizer._next_nonemptyc                 C   s   | j r| j }d | _ |S |  S r&   )r  r  r=   retr   r   r   _next_buffered=  s
   zTokenizer._next_bufferedc                 C   s(   |   }|d  | jv r|| _t|S r"  )r  rv   r  r  StopIterationr  r   r   r   __next__E  s
   zTokenizer.__next__c                 C   s   |   S r&   )r  r<   r   r   r   rw   L  s   zTokenizer.nextc                 C   sH   | j sz|  | _ W n
 ty   Y d S w | j d  | jv r!d S | j S r"  )r  r  r  rv   r  r<   r   r   r   r   O  s   zTokenizer.peekc                 C   s   |   }|d ur
|S dS )N)rE   )r   r  r   r   r   ru   Y  s   zTokenizer.peeksc                 c   sH    |d }|d }|  | | j| d V  | jd= | |d  d S )Nz beginz endr  )expectendswithr  rB   rb  )r=   r  startendr   r   r   rU   ]  s   
zTokenizer.betweenc                 c   s<    t |tur
|f}| j| d V  | jt| d = d S r&   )rA   r   r  extendrV   )r=   Z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')rw   rv   r=   r   r_   r  r   r   r   rb  o  s   zTokenizer.expectc                 C   s2   t | }|d  }||sJ d||f |S )Nr   zExpected '*%s', got '%s')rw   rv   r   r  r   r   r   r  u  s   zTokenizer.expectendswithN)r   r   r   r>   r  r  r  r  r  rw   r   ru   r   rU   r   rb  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_``)
	rd  )r  r  )r  r   rd  r\   r   r   r   build{  s   r  c              	   C   s  ddl }ddlm} ddlm} | du r|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 sw   Y  ||}	| }
|
|	| ddlm} |j}||j}|| |  |
|| | | |  qad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-fZFILEr   zDInput TTF files (used for glyph classes and sorting coverage tables))metavardesthelpz--tablez-tZTABLErd  z7Table to fill (sniffed from input file if not provided)inputs+zInput FontDame .txt files)r  rA   nargsr  zProcessing %sZ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  rd  compile	__class__Z	decompileZfontTools.miscr  Z	XMLWriterstdoutZbegintagnewlineZtoXMLZendtag)argsr   r  r  r  r  rr  r  rn  ZblobZ
decompiledr  r  writerr   r   r   r    sT   





r  __main__r&   )NN)\r  r   ZfontTools.ttLib.tables._c_m_a_pr   ZfontTools.ttLib.tablesr   rS   ZfontTools.ttLib.tables.otBaser   r   ZfontTools.otlLibr   r}   
contextlibr   operatorr	   Zlogging	Exceptionr   r   r   r   Z	getLoggerr?   r   r$   r,   r.   r9   r6  r:   rc   rj   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   objectr   r   r   r   r   r   r   rX   r   r   r5  r   r7  r  r   r   r9  r@  rK  rP  rR  rS  rT  rV  rf  rs  rw  rx  ry  r{  r~  r  r  r  r  r  r  r  r  r   r  r   r   r   r   r   <module>   s   
	

2
 





X

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