a
    w=ic                     @   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   j/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/fontTools/mtiLib/__init__.pyr
          r
   c                   @   s   e Zd ZdS )ReferenceNotFoundErrorNr   r   r   r   r   r      r   r   c                   @   s   e Zd ZdS )FeatureNotFoundErrorNr   r   r   r   r   r      r   r   c                   @   s   e Zd ZdS )LookupNotFoundErrorNr   r   r   r   r   r      r   r   zfontTools.mtiLibc                 C   sx   | d d dv r*t jt| dd  dS | d d dkrNdt| dd   S | ddk shJ d|  | stJ d	| S )
N   )zU zu    z# z	glyph%.5d r   zSpace found in glyph name: %szGlyph name is empty)r   TTFontZ_makeGlyphNameintfind)sr   r   r   	makeGlyph   s    r   c                 C   s   dd | D S )Nc                 S   s   g | ]}t |qS r   )r   ).0gr   r   r   
<listcomp>%   r   zmakeGlyphs.<locals>.<listcomp>r   )lr   r   r   
makeGlyphs$   s    r!   c                 C   s>   |d ur2z||  }W q: t y.   t| Y q:0 nt| }|S N)KeyErrorr   r   symmappingidxr   r   r   	mapLookup'   s    r(   c                 C   sL   zt | }W n: tyF   z||  }W n ty@   t| Y n0 Y n0 |S r"   )r   
ValueErrorr#   r   r$   r   r   r   
mapFeature3   s    r*   c                    s   z| ||}W np t y~ } zXz6|d urR| fdd|| W W Y d }~d S W n tyf   Y n0  W Y d }~n
d }~0 0  | d S )Nc                    s    | S r"   r   )ref
collectionkeysetterr   r   <lambda>E   r   zsetReference.<locals>.<lambda>)r   addDeferredMappingAttributeError)Zmapperr&   r%   r/   r-   r.   mappeder   r,   r   setReference?   s    r5   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )DeferredMappingc                 C   s
   g | _ d S r"   )_deferredMappingsselfr   r   r   __init__N   s    zDeferredMapping.__init__c                 C   s*   t d|t|j | j|||f d S )Nz*Adding deferred mapping for symbol '%s' %s)logdebugtyper   r7   append)r9   r/   r%   r4   r   r   r   r1   Q   s    z"DeferredMapping.addDeferredMappingc              	   C   sh   | j D ]V\}}}td|t|j z| | }W n tyF   |Y n0 || td| qg | _ d S )Nz,Applying deferred mapping for symbol '%s' %sz	Set to %s)r7   r;   r<   r=   r   r#   )r9   r/   r%   r4   r3   r   r   r   applyDeferredMappingsU   s    
z%DeferredMapping.applyDeferredMappingsN)r   r   r   r:   r1   r?   r   r   r   r   r6   L   s   r6   c              
      s  t  }g }| d | 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 d    n1 s0    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   r   z#parseScriptList.<locals>.<listcomp>r   r   defaultc                 S   s   | j S r"   )
LangSysTagrecr   r   r   r0      r   z!parseScriptList.<locals>.<lambda>r.   c                 S   s   | j S r"   rD   rJ   r   r   r   r0      r   )ot
ScriptListbetweenlenr>   r;   r<   ZLangSysZLookupOrderr5   r*   setattrrB   stripSplitCommaZFeatureIndex	enumerater	   FeatureCountScriptZScriptRecordrE   ZDefaultLangSysZLangSysRecordZLangSysCountrI   sortedZScriptCount)lines
featureMapr9   recordslineZ
langSysTagZdefaultFeaturefeaturesZlangSyssymstheListir%   scriptZ	scriptRecZ
langSysRecr   rG   r   parseScriptLista   sR    



.r`   c              
   C   sF  t  }g |_| d
 | D ]}|\}}}|d urX||vsJJ d| t|j||< z,t|t|jksJ d|t|jf W n ty   Y n0 t  }||_t  |_|j	| |j}	d |	_
t|}
d gt|
  |	_}t|
D ]\}}tt||t|| qt|	j|	_q W d    n1 s,0    Y  t|j|_|S )Nzfeature tablezDuplicate feature name: %s%d %d)rM   FeatureListZFeatureRecordrO   rP   r   r)   Z
FeatureTagZFeaturer>   ZFeatureParamsrR   LookupListIndexrS   r5   r(   r	   LookupCountrT   )rW   	lookupMaprX   r9   rZ   nameZ
featureTaglookupsZ
featureRecfeaturer\   r]   r^   r%   r   r   r   parseFeatureList   s2    
,
.ri   c                 C   s   d}d }g d}|   d  |v rt| }ddddd|d  }|r|d  dv shJ |d |d  d	kr||O }q|d  d
kr|t|d d> O }q|d  dkr|dO }t|d }q||fS )Nr   )righttoleftignorebaseglyphsignoreligaturesignoremarksmarkattachmenttypemarkfiltertype   r   r@      )rj   rk   rl   rm   )yesnorr   rn   ro   r   )peekslowernextgetr   )rW   flags	filtersetZallFlagsrZ   flagr   r   r   parseLookupFlags   s0    
r{   c                 C   sD   i }| D ]0}t |dks J |t|}|d ||d < qt|S )Nr   rp   r   )rP   r!   otlZbuildSingleSubstSubtablerW   font
_lookupMapr&   rZ   r   r   r   parseSingleSubst   s    r   c                 C   s4   i }| D ] }t |}|dd  ||d < qt|S Nrp   r   )r!   r|   ZbuildMultipleSubstSubtabler}   r   r   r   parseMultiple   s
    r   c                 C   s4   i }| D ] }t |}|dd  ||d < qt|S r   )r!   r|   ZbuildAlternateSubstSubtabler}   r   r   r   parseAlternate   s
    r   c                 C   sL   i }| D ]8}t |dks J |t|}|d |t|dd  < qt|S )Nr   r   rp   )rP   r!   tupler|   ZbuildLigatureSubstSubtabler}   r   r   r   parseLigature   s    r   c                 C   s   i }| D ]}t |dks J ||d  dd}|tv s@J t|d }t|d }||vrjt ||< t|| |rJ ||ft|| || qt	
|| S )NrC   r   r   rA   rp   r   )rP   titlereplacer   r   r   r   hasattrrQ   r|   ZbuildSinglePosSubtablegetReverseGlyphMap)rW   r~   r   valuesrZ   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 sJ ||d t|d  	 
dd}t| d }	t|dd \}
}t|d }|
|vri ||
< |||
 vrt t f||
 |< ||
 | }|dkr,| j|	O  _|d }n| j|	O  _|d }t||rZJ ||ft||| qDtt| ||_g |_|jjD ]}
||
 }t  }g  }|_t| |jd	D ]F}|| }t  }||_|d |_|jr|d nd |_|| 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 u sJ t$| ||d||< qH|\|_"|_#dd |D \|_%|_&dd t'|j%D |_(|j(D ]:}dd t'|j&D |_)|j)D ]}t |_t |_qq| D ]}t|dksXJ ||d  d  }|dv s~J ||d t|d  	 
dd}t| d }	dd |dd D \}}}|j(| j)| }|dkr| j|	O  _|j}n| j|	O  _|j}t||r"J ||ft||| q>|j(D ]@}|j)D ]2}t|j|j|_|jrlt|j|jnd |_qBq8tt|j"j* ||_ndsJ ||S )Nr   leftrightrp   r@   r   rA   rC   r   rL   classr   class definition begin)firstsecondklassc                 s   s    | ]}d t |j  V  qdS rp   N)max	classDefsr   )r   cr   r   r   	<genexpr>2  r   zparsePair.<locals>.<genexpr>c                 S   s   g | ]}t  qS r   )rM   Class1Recordr   r^   r   r   r   r   3  r   zparsePair.<locals>.<listcomp>c                 S   s   g | ]}t  qS r   )rM   Class2Record)r   jr   r   r   r   5  r   c                 s   s   | ]}t |V  qd S r"   r   r   xr   r   r   r   ?  r   )+rM   ZPairPosZValueFormat1ZValueFormat2rt   splitru   FormatrP   r   r   r   r!   r   r   r   rQ   makeCoveragesetkeysCoverageZPairSetglyphsZPairValueRecordrV   
getGlyphIDZSecondGlyphZValue1ZValue2r>   ZPairValueCountZPairSetCountendswithpeekZ	ClassDef1Z	ClassDef2parseClassDefZClass1CountZClass2Countranger   r   r   )rW   r~   r   r9   typr   rZ   sidewhatmaskZglyph1Zglyph2valueZrec2ZvrZvalues1ZpairsetrY   Zvalues2pairr   r'   r   Zrec1Zclass1Zclass2r   r   r   	parsePair   s    

  





 


r   c                 C   s^   |   d  d  }|dv rT| d t| |W  d    S 1 sJ0    Y  t| |S )Nr   r   )zfirstclass definition beginzsecondclass definition begin)rt   r   ru   untilr   )rW   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   rp   r   rA   )rP   r   intSplitCommaZXCoordinateZYCoordinater   ZAnchorPoint)datar   anchorr   r   r   
makeAnchor[  s    r   c                 C   s   i }| D ]}t |dv s J |dtjfdtjfd|d  \}}t|d }||vrbd d g||< || | d u s~J ||ft|dd  ||| |< qt|| S )N)rC   r@   r   rp   )entryexitr   )	rP   rM   ZEntryAnchorZ
ExitAnchorr   r   r|   ZbuildCursivePosSubtabler   )rW   r~   r   rY   rZ   r'   r   glyphr   r   r   parseCursivee  s    r   c                 C   sF   g }|j D ]6}| | \}}| }||_t||j| || q
|S r"   )r   ZMarkRecordClassClassrQ   Z
MarkAnchorr>   )r   coverager   rY   r   r   r   recordr   r   r   makeMarkRecordst  s    
r   c                 C   s   g }i }|j D ]:}t|||< | }d g| }t||j| || q|  D ]D\\}}	}
|||  }t||j}||	 d u sJ ||	f|
||	< qR|S r"   )r   rP   ZBaseRecordClassrQ   Z
BaseAnchorr>   itemsgetattr)r   r   r   
classCountrY   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 rt  }||| < |	|_dd t|	D |_|jD ]}d g| |_	q|j|	ksJ ||j|	f|j|d  j	}|| d u sJ |||f|
||< q,|S )Nc                 S   s   i | ]\}}||qS r   r   )r   r^   r   r   r   r   
<dictcomp>  r   z'makeLigatureRecords.<locals>.<dictcomp>c                 S   s   g | ]}t  qS r   )rM   ComponentRecordr   r   r   r   r     r   z'makeLigatureRecords.<locals>.<listcomp>rp   )
rP   r   rS   r   rM   LigatureAttachZComponentCountr   r   ZLigatureAnchor)r   r   r   r   rY   r'   r   r   ZcompIdxZ	compCountr   r   ZcompRecr   r   r   r   makeLigatureRecords  s    

r   c                 C   s:  |  }d|_i }i }||jf||jf||jfd}d}| D ]}|d }	|	dv sTJ t|d }
||	 \}}|	dkrxdnd}tdd |dd|  D }t|d|  }t|d| d  |}|	d	kr|
||f }}n|
|f| | }}||vsJ ||||< 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 )Nrp   )markbaseligaturer   r   r   c                 s   s   | ]}t |V  qd S r"   r   r   r   r   r   r     r   z'parseMarkToSomething.<locals>.<genexpr>rC   r   c                 s   s   | ]\}}|d  V  qdS r   r   )r   kr   r   r   r   r     r   c                 S   s   g | ]}|d  qS )r   r   r   r   r   r   r   r     r   z(parseMarkToSomething.<locals>.<listcomp>Ligature)!Typer   ZMarkAnchorClassZBaseAnchorClassr   r   r   r   r   r   r   r   ZMarkCoverageClassZMarkArrayClassr   rQ   Z
MarkRecordZ	MarkCountrP   ZMarkCoverageZ	MarkArrayZ
ClassCountr   r   ZBaseCoverageClassZBaseArrayClassBaser   r   Z
BaseRecordZ	BaseCountZBaseCoverageZ	BaseArray)rW   r~   r   r9   ZmarkDataZbaseDataZDataZmaxKlassrZ   r   r   r   ZanchorClassZ
extraItemsextrasr   r   r.   r   ZmarkCoverageZ	markArrayZmarkRecordsZbaseCoverageZ	baseArrayZbaseRecordsr   r   r   parseMarkToSomething  sV    
& r   c                   @   s   e Zd Zdd ZdS )
MarkHelperc                 C   s~   dD ]t}dD ]j}|| }|dkr.|dv r.|}nt | || }|dkrHd}t| || |dkrt t|}t| |d | qqd S )	N)Markr   )r   ArrayCountRecordAnchorr   )r   r   r   ZLigatureRecordr   r   r   )r   rQ   rM   )r9   ZWhichZWhatr.   r   r   r   r   r   r:     s    
zMarkHelper.__init__Nr   r   r   r:   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZejZdS )MarkToBaseHelperr   r   N)r   r   r   r   r   rM   ZMarkBasePosr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZejZdS )MarkToMarkHelperZMark1ZMark2N)r   r   r   r   r   rM   ZMarkMarkPosr   r   r   r   r   r     s   r   c                   @   s   e Zd ZdZdZejZdS )MarkToLigatureHelperr   r   N)r   r   r   r   r   rM   Z
MarkLigPosr   r   r   r   r   r     s   r   c                 C   s   t | |t S r"   )r   r   rW   r~   r   r   r   r   parseMarkToBase  s    r   c                 C   s   t | |t S r"   )r   r   r   r   r   r   parseMarkToMark  s    r   c                 C   s   t | |t S r"   )r   r   r   r   r   r   parseMarkToLigature  s    r   c                 C   s   | rdd |  dD S g S )Nc                 S   s   g | ]}|  qS r   striprF   r   r   r   r     r   z#stripSplitComma.<locals>.<listcomp>,r   rZ   r   r   r   rR     s    rR   c                 C   s   | rdd |  dD S g S )Nc                 S   s   g | ]}t |qS r   r   r   r   r   r   r     r   z!intSplitComma.<locals>.<listcomp>r   r   r   r   r   r   r     s    r   c                   @   s   e Zd Zdd ZdS )ContextHelperc                 C   st  | drd}d}nd}d}|dr4d}d}d}nd}d}d}|| }|| _|| _|| _|| _|| _|| _|d	 | _|dk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sJ 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Chainrp   rC   rA   r   LookupRecordc                 S   s   | j S r"   r   rr   r   r   r0     r   z(ContextHelper.__init__.<locals>.<lambda>c                 S   s   | j S r"   r   r   r   r   r   r0     r   c                 S   s   dS )Nr"   r   r   r   r   r   r0     r   c                 S   s   dS )N)NNNr   r   r   r   r   r0      r   c                 S   s   | j fS r"   )Inputr   r   r   r   r0   #  r   c                 S   s   | j | j| jfS r"   	Backtrackr   	LookAheadr   r   r   r   r0   $  r   c                 S   s   |\| _ dd |D \| _d S )Nc                 s   s   | ]}t |d  V  qdS r   rP   r   r   r   r   r   '  r   >ContextHelper.__init__.<locals>.SetRuleData.<locals>.<genexpr>)r   
GlyphCountr   dr   r   r   SetRuleData%  s    z+ContextHelper.__init__.<locals>.SetRuleDatac                 S   sF   |\| _ | _| _t|d t|d d t|d   | _| _| _d S Nr   rp   r   r   r   r   rP   BacktrackGlyphCountInputGlyphCountLookAheadGlyphCountr   r   r   r   ChainSetRuleData(  s    z0ContextHelper.__init__.<locals>.ChainSetRuleDatar   c                 S   s   | j S r"   r   r   r   r   r   r0   ,  r   c                 S   s   | j S r"   r   r   r   r   r   r0   -  r   c                 S   s   | j fS r"   ClassDefr   r   r   r   r0   .  r   c                 S   s   | j | j| jfS r"   BacktrackClassDefInputClassDefLookAheadClassDefr   r   r   r   r0   /  s   c                 S   s   |\| _ d S r"   r  r   r   r   r   SetContextData2  s    z.ContextHelper.__init__.<locals>.SetContextDatac                 S   s   |\| _ | _| _d S r"   r  r   r   r   r   SetChainContextData4  s
    z3ContextHelper.__init__.<locals>.SetChainContextDatac                 S   s   | j fS r"   )r   r   r   r   r   r0   8  r   c                 S   s   | j | j| jfS r"   r   r   r   r   r   r0   9  r   c                 S   s   |\| _ dd |D \| _d S )Nc                 s   s   | ]}t |d  V  qdS r   r   r   r   r   r   r   <  r   r   )r   r   r   r   r   r   r   :  s    c                 S   sF   |\| _ | _| _t|d t|d d t|d   | _| _| _d S r   r   r   r   r   r   r  =  s    c                 S   s
   | j d S Nr   r   r   r   r   r   r0   A  r   c                 S   s
   | j d S r
  )InputCoverager   r   r   r   r0   B  r   c                 S   s   | j S r"   r   r   r   r   r   r0   G  r   c                 S   s   | j | j | j S r"   )BacktrackCoverager  LookAheadCoverager   r   r   r   r0   H  s   c                 S   s   |\| _ dd |D \| _d S )Nc                 s   s   | ]}t |V  qd S r"   r   r   r   r   r   r   M  r   r   )r   r   r   r   r   r   r   K  s    c                 S   s.   |\| _ | _| _dd |D \| _| _| _d S )Nc                 s   s   | ]}t |V  qd S r"   r   r   r   r   r   r   P  r   zCContextHelper.__init__.<locals>.ChainSetRuleData.<locals>.<genexpr>)r  r  r  r   r   r   r   r   r   r   r  N  s    zunknown format: %sRule	RuleCountRuleSetRuleSetCountc                 S   s   || v r|gS g S r"   r   r   r   r   r   r   r   r0   f  r   Z	ClassRuleZClassRuleCountZClassSetZClassSetCountc                 S   s&   |r| | |S |dkr t| S t S r
  )Zintersect_classr   r  r   r   r   r0   l  s   r  r  r   r   )r   
startswithTypr   r   ChainTypInputIdxDataLenr   r   ContextDatar  RuleDatar   r  r  r  r  Z	Intersectr  ZClassDefIndexr   )r9   	klassNamer   r  r   r   r  r  r  r   ZChainCoverager  ZChainContextDatar  r	  r  ZChainRuleDatar   r  r   r   r   r:     s    


















zContextHelper.__init__Nr   r   r   r   r   r     s   r   c                 C   s   t t|}g }| D ]l}| }t|}t|dks8J |t|d }|dksTJ ||d |_tt||d t|d |	| q|S )Nr   r   rp   rc   )
r   rM   rR   rP   r   ZSequenceIndexr5   r(   rQ   r>   )r   r  re   r   lstitemrK   r'   r   r   r   parseLookupRecordss  s    

r  c                 C   s   | sd S | }t | |_|S r"   )dictr   )r   r~   r   r9   r   r   r   makeClassDef  s    
r  c                 C   sp   i }|  dF | D ]0}t|d }||vs4J |t|d ||< qW d    n1 sZ0    Y  t|||S )Nzclass definitionr   rp   )rO   r   r   r  )rW   r~   r   r   rZ   r   r   r   r   r     s    0r   c                 C   s8   | sd S t | trt| } | }tt| |jd|_|S )NrL   )
isinstancer   rV   r   r   )r   r~   r   r   r   r   r   r     s    
r   c                 C   sV   g }|  d, | D ]}|t|d  qW d    n1 s@0    Y  t|||S )Nzcoverage definitionr   )rO   r>   r   r   )rW   r~   r   r   rZ   r   r   r   parseCoverage  s
    2r!  c                    s$  i }|D ]>\}}| | j d g t fddt|D |f qg }|D ]}||vrh|d  qPg }	|| D ]P\}}tt j }
 |
| t	|
 j
d t| t	|
 j| |	|
 qttt j }t	| j|	 t	| jt|	 || qPt	|  j| t	|  jt| d S )Nr   c                 3   s,   | ]$\}}|| j krd ndd V  qdS )rp   r   Nr  )r   r^   r   r   r   r   r     r   z!bucketizeRules.<locals>.<genexpr>r   )
setdefaultr  r>   r   rS   r   rM   r  r   rQ   r   rP   r   r  r  r  )r9   r   rulesZ
bucketKeysZbucketsseqrecsZrulesetsZ
firstGlyphZ	thisRulesruleZrulesetr   r#  r   bucketizeRules  s*    8
r)  c                    sb  t t| }|  d  d  }|dkrd|_td||j t||j g }| D ]}|d  dksxJ |d t	|d j
 k r|d qxtdd |dd j
  D }t|d j
 d   j|}	|||	f qXt fdd|D }
t|
||_t| ||jj nD|d	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||< qT || g }| D ]}|d  d	s&J |d t	|d j
 k rH|d q&tdd |dd j
  D }t|d j
 d   j|}	|||	f qt fdd|D tfdd| j j D }
t|
||_t| |t t!d  nf|drPd|_td||j t||j tdd t  j
D }|  d dr|  d d t	d   }ddtjfidtj"fdtj#fd
tj$fdd j
 | \}}|| t%| ||d q> &|| t'| } t	| dksJ | d }|d  dksJ |d t|dd   j|}	t(| j)d t	|	 t(| j|	 nds^J ||S )Nr   r   rp   zParsing %s format %srA   c                 s   s   | ]}t t|V  qd S r"   )r!   rR   r   r   r   r   r     r   zparseContext.<locals>.<genexpr>c                 3   s    | ]\}}| j  d  V  qdS r   Nr"  r   r&  r'  r#  r   r   r     r   r   r   r   )	backtrackrA   	lookahead)rp   rC   r   c                 s   s   | ]}t |V  qd S r"   )r   r   r   r   r   r     r   c                 3   s    | ]\}}| j  d  V  qdS r*  r"  r+  r#  r   r   r     r   c                 3   s   | ]\}}| v r|V  qd S r"   r   )r   r   r   )firstClassesr   r   r     r   r   rC   c                 s   s   | ]
}g V  qd S r"   r   r   r   r   r   r     r   coverage definition begin)r,  inputr-  r   )*r   rM   rt   r   ru   r   r;   r<   r   rP   r  r>   r   r  r   r   r   r   r)  r   r   r   r  r  r  r  r   r  r  r  r   r   r   r   r  r  r  r!  r   listrQ   r   )rW   r~   r   re   r9   r   r%  rZ   r&  r'  ZfirstGlyphsr   r'   r   	coveragesr   )r   r.  r   parseContext  s    
 
		
 " "
		
r3  c                 C   s   t | |d|dS )NZContextSubstre   r3  rW   r~   re   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sJ |t|}|d  |d < qtt  ||_ fdd|jjD |_t|j|_|S )	Nrp   r   r/  )r,  r-  r   r   c                    s   g | ]} | qS r   r   r   r&   r   r   r   &  r   z,parseReverseChainedSubst.<locals>.<listcomp>)rM   ZReverseChainSingleSubstr   rt   r   r   rP   ru   r  r  r>   r!  r   r   r!   r   r   r   r   r   Z
Substituter   )	rW   r~   r   r9   r2  r   r'   r   rZ   r   r;  r   parseReverseChainedSubst  s0    

r<  c                 C   s  |  d}|\}}}td|| t }t| \|_}	|	d urF|	|_dtfdt	fdt
fdtfdtfdtfd	tfd
dtfdtfdtfdtfdtfdtfdtfdtfd	tfd	d| | \|_}
| d g }|  rV| dD |  r|
| ||}|j|jksJ || qW d    n1 s20    Y  |  d dv rt|  qW d    n1 sl0    Y  |  d ||_t|j|_ |j dkrd S |S )NlookupzParsing lookup type %s %srp   r   rC   r@         rq   )singlemultiple	alternater   contextchainedZreversechained   )	r@  r   ZkernsetZcursivezmark to basezmark to ligaturezmark to markrC  rD  GSUBGPOSz
lookup end)
% subtablezsubtable endr   )!expectr;   r<   rM   Lookupr{   Z
LookupFlagZMarkFilteringSetr   r   r   r   r7  r9  r<  r   r   r   r   r   r   r   r8  r:  Z
LookupTyper   r   r>   rt   rv   ZSubTablerP   ZSubTableCount)rW   tableTagr~   re   rZ   _rf   r   r=  ry   ZparseLookupSubTableZ	subtablesZsubtabler   r   r   parseLookup*  s\    





,*
rN  c                    s  t | }t t  |dv s$J td| tt| }d|_d fddfd fddfd	d
}| D ]\}}t	||d  qp| 
 d ur| 
 d  }||vrtd| 
  t|  q|| \}}|dkr|jd u rt |_g |j_| 
 \}	}
}	t| ||}d urF|
vs4J d|
 t|jj|
< n,t|
t|jjksrJ d|
t|jf |jj| qt||d u sJ |t	||||  q|jrt|jj|j_d urֈ   d ur   ||_|S )NrF  z
Parsing %s   rN   c                    s
   t |  S r"   )r`   rW   )rX   r   r   r0   i  r   zparseGSUBGPOS.<locals>.<lambda>rb   c                    s   t |  S r"   )ri   rP  rX   re   r   r   r0   l  r   )
LookupListN)zscript table beginzfeature table beginr=  r   Skipping %sr=  zDuplicate lookup name: %sra   )r   getTableClassr6   r;   r<   r   rM   Versionr   rQ   r   ru   rv   rR  rK  rN  rP   r   r>   rd   r?   table)rW   r~   rL  	containerr9   fieldsattrparserr   rM  rf   r=  r   rQ  r   parseGSUBGPOS^  sZ    




,

r[  c                 C   s   t | |dS )NrG  r[  rW   r~   r   r   r   	parseGSUB  s    r^  c                 C   s   t | |dS )NrH  r\  r]  r   r   r   	parseGPOS  s    r_  c                 C   s~   i }|  dP | D ]:}t|d }||vs4J |dd |dd  D ||< qW d    n1 sd0    Y  t|| S )Nzattachment listr   c                 S   s   g | ]}t |qS r   r   r   r   r   r   r     r   z#parseAttachList.<locals>.<listcomp>rp   )rO   r   r|   ZbuildAttachListr   )rW   r~   ZpointsrZ   r   r   r   r   parseAttachList  s    :r`  c                 C   s   i }|  dt | D ]^}t|d }||vs4J |t|d }dd |dd  D }|t|ksjJ ||||< qW d    n1 s0    Y  t|i | S )Ncaretsr   rp   c                 S   s   g | ]}t |qS r   r   r   r   r   r   r     r   z"parseCaretList.<locals>.<listcomp>r   )rO   r   r   rP   r|   ZbuildLigCaretListr   )rW   r~   ra  rZ   r   numZ
thisCaretsr   r   r   parseCaretList  s    (rc  c                 C   s\   t  }d|_dt|   |_d g|j |_t|  D ]\}}t	t
|||j|< q:|S )Nrp   )rM   MarkGlyphSetsDefZMarkSetTableFormatr   r   ZMarkSetCountr   rV   r   r   r   )setsr~   r9   r   r   r   r   r   makeMarkFilteringSets  s    rf  c                 C   s   i }|  dd | D ]N}t|dks,J |t|d }t|d }||vrTg ||< || | qW d    n1 sx0    Y  t||S )Nzset definitionr   r   rp   )rO   rP   r   r   r>   rf  )rW   r~   re  rZ   r   str   r   r   parseMarkFilteringSets  s    .rh  c                 C   s   t d }td t }ddd fdtfdtfdd	d fd
tfd}|	 D ]\}}t
||d  qR|  d ur|  d  }||vrtd| t|  qh|| \}}t||d u sJ |t
|||| | qh|jd u rdnd|_||_|S )NGDEFzParsing GDEFGlyphClassDefc                 S   s   t | |tjdS Nr   )r   rM   rj  r]  r   r   r   r0     r   zparseGDEF.<locals>.<lambda>Z
AttachListZLigCaretListMarkAttachClassDefc                 S   s   t | |tjdS rk  )r   rM   rl  r]  r   r   r   r0     r   rd  )r   zattachment list beginzcarets beginz&mark attachment class definition beginzmarkfilter set definition beginr   rS  rO  i  )r   rT  r;   r<   rM   ri  r`  rc  rh  r   rQ   r   ru   rv   r   rd  rU  rV  )rW   r~   rW  r9   rX  rY  rZ  r   r   r   r   	parseGDEF  s6    
rm  c           
         s   t d }td g }  d ur dt|   fdddD \}}}}t| |}||_||_	||_
i |_t }	|	d dkr|	d	 |jt|	d d
< t }	q~|| qd|_||_|S )NcmapzParsing cmapzcmap subtable %dc                    s   g | ]}t  |qS r   )parseCmapId)r   fieldrP  r   r   r     s   zparseCmap.<locals>.<listcomp>)
platformIDZ
encodingIDformatlanguager   zend subtablerp   r   )r   rT  r;   r<   r   rJ  rP   r   rq  Z	platEncIDrs  rn  rv   r   r>   ZtableVersiontables)
rW   r~   rW  rt  ZplatIdZencIdfmtlangrV  rZ   r   rP  r   	parseCmap  s*    


rw  c                 C   s$   t | }||d ksJ t|d S )Nr   rp   )rv   r   )rW   rp  rZ   r   r   r   ro    s    ro  c                 C   s   t d |  }d }|d  d dkr<|d  d }n.d|d  d d dkrj|d  d }|d urt|  |d}|d u r|}n||ksJ ||f|d usJ d	ttt	t
d
| | |S )NzParsing tabler   ZFontDamerp   r   rC   zFont Chef Tabler@   z7Don't know what table to parse and data doesn't specify)rG  rH  ri  rn  )r;   r<   rt   r   joinrv   ljustr^  r_  rm  rw  )rW   r~   rL  rZ   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 |}z|j| _W n   d | _Y n0 t || _d| _d| _g | _d | _d S )NrA   r   )iterrf   filenamerW   rZ   linenostoppersbuffer)r9   frW   r   r   r   r:     s    
zTokenizer.__init__c                 C   s   | S r"   r   r8   r   r   r   __iter__'  s    zTokenizer.__iter__c                 C   s   |  j d7  _ t| j }| _dd |dD }t|dkrL|d sL|d= |r|d std| j | jf  |r|d s|d= qn|S )Nrp   c                 S   s   g | ]}|  qS r   r   rF   r   r   r   r   -  r   z(Tokenizer._next_line.<locals>.<listcomp>	r   z!trailing tab found on line %d: %s)r  rv   rW   rZ   r   rP   r;   warningr9   rZ   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   %rI  )r  r  r   r   r   _next_nonempty6  s    (zTokenizer._next_nonemptyc                 C   s"   | j r| j }d | _ |S |  S d S r"   )r  r  r9   retr   r   r   _next_buffered=  s
    zTokenizer._next_bufferedc                 C   s(   |   }|d  | jv r$|| _t|S r
  )r  ru   r  r  StopIterationr  r   r   r   __next__E  s
    zTokenizer.__next__c                 C   s   |   S r"   )r  r8   r   r   r   rv   L  s    zTokenizer.nextc                 C   sH   | j s*z|  | _ W n ty(   Y d S 0 | j d  | jv rBd S | j S r
  )r  r  r  ru   r  r8   r   r   r   r   O  s    zTokenizer.peekc                 C   s   |   }|d ur|S dS )N)rA   )r   r  r   r   r   rt   Y  s    zTokenizer.peeksc                 c   sF   |d }|d }|  | | j| d V  | jd= | |d  d S )Nz beginz endr  )expectendswithr  r>   rJ  )r9   rz  startendr   r   r   rO   ]  s    
zTokenizer.betweenc                 c   s:   t |tur|f}| j| d V  | jt| d = d S r"   )r=   r   r  extendrP   )r9   tagsr   r   r   r   g  s
    zTokenizer.untilc                 C   s0   t | }|d  }||ks,J d||f |S )Nr   zExpected '%s', got '%s')rv   ru   r9   r   rZ   rz  r   r   r   rJ  o  s    zTokenizer.expectc                 C   s2   t | }|d  }||s.J d||f |S )Nr   zExpected '*%s', got '%s')rv   ru   r   r  r   r   r   r  u  s    zTokenizer.expectendswithN)r   r   r   r:   r  r  r  r  r  rv   r   rt   r   rO   r   rJ  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_``)
	rL  )r|  r{  )r  r~   rL  rW   r   r   r   build{  s    r  c              	   C   s  ddl }ddlm} ddlm} | du r6|jdd } |  ddl}|jdtj	d}|j
dd	d
ddd |j
dddddd |j
dd
tddd || } |du r| jrt| j}n| }| jD ]}td| t|ddd }t||| jd}W d   n1 s0    Y  ||}	| }
|
|	| ddlm} |j}||j}|| |  |
|| | | |  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)MockFontrp   zfonttools mtiLib)descriptionz--fontz-fFILEr~   zDInput TTF files (used for glyph classes and sorting coverage tables))metavardesthelpz--tablez-tZTABLErL  z7Table to fill (sniffed from input file if not provided)inputs+zInput FontDame .txt files)r  r=   nargsr  zProcessing %srtzutf-8)encodingr  )	xmlWriter)!sys	fontToolsr  ZfontTools.misc.testToolsr  argvargparseArgumentParsermain__doc__add_argumentstr
parse_argsr~   r   r   r  r;   r<   openr  rL  compile	__class__Z	decompileZfontTools.miscr  Z	XMLWriterstdoutZbegintagnewlineZtoXMLZendtag)argsr~   r  r  r  r  rZ  r  rV  ZblobZ
decompiledr  rz  writerr   r   r   r    sP    

0


r  __main__)N)NN)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)NN)\r  r   ZfontTools.ttLib.tables._c_m_a_pr   ZfontTools.ttLib.tablesr   rM   ZfontTools.ttLib.tables.otBaser   r   ZfontTools.otlLibr   r|   
contextlibr   operatorr	   logging	Exceptionr
   r   r   r   	getLoggerr;   r   r!   r(   r*   r5   r  r6   r`   ri   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   objectr   r   r   r   r   r   r   rR   r   r   r  r   r  r  r   r   r!  r)  r3  r7  r8  r9  r:  r<  rN  r[  r^  r_  r`  rc  rf  rh  rm  rw  ro  r{  r|  r  r  r   r  r   r   r   r   r   <module>	   s   
	
2
 





X


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