U
    :vhx|                     @   s  d dl Z d dlmZ d dlmZmZ d dlmZ d dlm	Z	m
Z
 ddlmZ dZd	d
dddddd
dddddd
dddddd
dddddd
dddddd
dddddd
dddddd
dddddd
dddddd
ddddd d
dd!ddd"d
dd#ddd$d
dd%ddd&d
dd'ddd(d
dd)ddd*d
dd+ddd,d
dd-ddd.d
dd/ddd0d
dd1ddd2d
dd3ddd4d
dd5ddd6d
dd7ddd8d
dd9ddd:d
dd;ddd<d
dd=ddd>d
dd?ddd@d
ddAdddBd
ddCdddDd
ddEdddFd
ddGdddHd
ddIdddJd
ddKdddLd
ddMdddNd
ddOdddPd
ddQdddRd
ddSdddTd
ddUdddVd
ddWdddXd
ddYdddZd
dd[ddd\d
dd]ddd^d
dd_ddd`d
ddadddbd
ddcddddd
ddedddfd
ddgdddhd
ddidddjd
ddkdddld
ddmdddnd
ddodddpd
ddqdddrd
ddsdddtd
ddudddvd
ddwdddxd
ddydddzd
dd{ddd|d
dd}ddd~d
dddddd
dddddd
dddddd
dddddd
dddddd
dddddd
dddddZG dd dZeG dd dZG dd dZdeeeedddZe	e e	e dddZG dd dZdS )    N)deque)	dataclassreplace)
itemgetter)ListTuple   )TextDirection}   )o)pairtype(c][}{   ༻   ༺   ༽   ༼   ᚜   ᚛   ⁆   ⁅   ⁾   ⁽   ₎   ₍   ⌉   ⌈   ⌋   ⌊   〉   〈   ❩   ❨   ❫   ❪   ❭   ❬   ❯   ❮   ❱   ❰   ❳   ❲   ❵   ❴   ⟆   ⟅   ⟧   ⟦   ⟩   ⟨   ⟫   ⟪   ⟭   ⟬   ⟯   ⟮   ⦄   ⦃   ⦆   ⦅   ⦈   ⦇   ⦊   ⦉   ⦌   ⦋   ⦐   ⦏   ⦎   ⦍   ⦒   ⦑   ⦔   ⦓   ⦖   ⦕   ⦘   ⦗   ⧙   ⧘   ⧛   ⧚   ⧽   ⧼   ⸣   ⸢   ⸥   ⸤   ⸧   ⸦   ⸩   ⸨   ⹖   ⹕   ⹘   ⹗   ⹚   ⹙   ⹜   ⹛   〉   〈   》   《   」   「   』   『   】   【   〕   〔   〗   〖   〙   〘   〛   〚   ﹚   ﹙   ﹜   ﹛   ﹞   ﹝   ）   （   ］   ［   ｝   ｛   ｠   ｟   ｣   ｢)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,   r+   r.   r-   r0   r/   r2   r1   r4   r3   r6   r5   r8   r7   r:   r9   r<   r;   r>   r=   r@   r?   rB   rA   rD   rC   rF   rE   rH   rG   rJ   rI   rN   rM   rL   rK   rP   rO   rR   rQ   rT   rS   rV   rU   rX   rW   rZ   rY   r\   r[   r^   r]   r`   r_   rb   ra   rd   rc   rf   re   rh   rg   rj   ri   rl   rk   rn   rm   rp   ro   rr   rq   rt   rs   rv   ru   rx   rw   rz   ry   r|   r{   r~   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   c                   @   sH   e Zd ZddddddgZeeeeddd	Zd
d Zdd Z	dd Z
dS )BidiCharactercharacter_index	character
bidi_classoriginal_bidi_classembedding_level	direction)r   r   r   debugc                 C   sD   || _ || _|r | r d| _nt|| _| j| _|| _d | _d S )NR)	r   r   isupperr   unicodedatabidirectionalr   r   r   )selfr   r   r   r    r   -/tmp/pip-unpacked-wheel-dvf6lv8i/fpdf/bidi.py__init__   s    zBidiCharacter.__init__c                 C   s   | j d rdS dS )N   r   L)r   r   r   r   r   get_direction_from_level   s    z&BidiCharacter.get_direction_from_levelc                 C   s
   || _ d S N)r   )r   clsr   r   r   	set_class   s    zBidiCharacter.set_classc                 C   s<   d| j  d| j d| j d| j  d| j d| j  S )Nzcharacter_index: z character: z bidi_class: z original_bidi_class: z embedding_level: z direction: )r   r   r   r   r   r   r   r   r   r   __repr__   s    zBidiCharacter.__repr__N)__name__
__module____qualname__	__slots__intstrboolr   r   r   r   r   r   r   r   r      s   
   r   c                   @   s0   e Zd ZU dddgZeed< eed< eed< dS )DirectionalStatusr   directional_override_statusdirectional_isolate_statusN)r   r   r   r   r   __annotations__r   r   r   r   r   r   r      s   
r   c                   @   sp   e Zd ZdddgZee eedddZddd	d
Zee	e
e
f  dddZddddZddddZdS )IsolatingRun
charactersprevious_directionnext_directionr   soseosc                 C   s.   || _ || _|| _|   |   |   d S r   )r   r   r   resolve_weak_typesresolve_neutral_typesresolve_implicit_levels)r   r   r   r   r   r   r   r      s    zIsolatingRun.__init__Nreturnc                    sB  t jD ]V\}}|jdkr
|dkr2|j q
|j|d  jdkrNdnj|d  j q
j}jD ]D}|jdkr|j}|jdkr|d |jd	krn|dkrn|d
 qnt jD ]\}}|dtjd fkrq|jdkr j|d  jd	kr j|d  jd	kr |d	 |jdkrj|d  jdkrj|d  jj|d  jkr|j|d  j qttdfddttd fdd t jD ]J\}}|jdkrވ|sԈ |r|d	 |jdkr|d qj}jD ]8}|jdkr|j}|jd	kr|dkr|d qd S )NNSMr   r   )LRIRLIFSIPDION)r   r   ALr   r   ENANESCSr   r   )ir   c                    s@   | dkrdS j | d  jdkr, | d S j | d  jdkS )Nr   Fr   ETr   )r   r   r   )
prev_is_enr   r   r   r     s
    z3IsolatingRun.resolve_weak_types.<locals>.prev_is_enc                    sJ   | t jd krdS j| d  jdkr6 | d S j| d  jdkS )Nr   Fr   r   )lenr   r   r   )
next_is_enr   r   r   r     s
    z3IsolatingRun.resolve_weak_types.<locals>.next_is_enr   )r   r   r   r   )	enumerater   r   r   r   r   r   r   )r   r   	bidi_charZlast_strong_typer   )r   r   r   r   r      sh    







zIsolatingRun.resolve_weak_typesc           	      C   s  g }d}g }t | jD ]\}}|jtkr|jdkrt|j d dkrl|dkrTg   S ||j|f |d7 }t|j d dkr|dkrqt|ddD ]j}||d  \}}t| d	 |jkst| d	 d
kr|jd
kr|||f |d|d  }|d } qqqt|tddS )a  
        Calculate all the bracket pairs on an isolate run, to be used on rule N0
        How to calculate bracket pairs:
        - Basic definitions 14, 15 and 16: http://www.unicode.org/reports/tr9/#BD14
        - BIDI brackets for dummies: https://www.unicode.org/notes/tn39/
        r   r   r   r   ?   r   r   r   )rm   r%   N)key)	r   r   r   BIDI_BRACKETSr   appendrangesortedr   )	r   Zopen_bracketsZopen_bracket_countZbracket_pairsindexcharZcurrent_open_bracketZ	open_charZ
open_indexr   r   r   pair_brackets#  s2    zIsolatingRun.pair_bracketsc                    s  t dfddt d fdd  }|rjd  }|D ]6}d}d}d }t|d |d D ]p}j| jd	kr|d	ksj| jd
kr|dkrd} qވj| jd	kr|dks؈j| jd
krl|d	krld}ql|r|}n2|r|dkrd	nd}|d |kr|}n|}|rH|j|d  _|j|d  _tj|d d krHj|d d  }	|	jdkrH|	jdkrH||	_qHtjD ]>\}
}|jdkr|
 |
kr|
|_n
| |_qd S )Nr   c                    sJ   | dkrj S j| d  jdkr&dS j| d  jdkr>dS  | d S )Nr   r   r   r   r   r   r   )r   r   r   r   )previous_strongr   r   r   r   D  s    z;IsolatingRun.resolve_neutral_types.<locals>.previous_strongc                    sT   | t jd krjS j| d  jdkr0dS j| d  jdkrHdS  | d S )Nr   r   r   r   )r   r   r   r   r   )next_strongr   r   r   r   M  s    z7IsolatingRun.resolve_neutral_types.<locals>.next_strongr   Fr   r   r   r   Tr   r   )BSWSr   r   r   r   r   )	r   r   r   r   r   r   r   r   r   )r   ZbracketsZembedding_directionbZstrong_same_directionZstrong_opposite_directionZresulting_directionr   Zopposite_directionZ	next_charr   r   r   )r   r   r   r   r   C  sf    	

z"IsolatingRun.resolve_neutral_typesc                 C   sh   | j D ]\}|jd dkrJ|jdkr0| jd7  _|jdkrb| jd7  _q|jdkr| jd7  _qd S )Nr   r   r   r   r   )r   r   r   )r   r   r   )r   r   r   r   r   r     s    



z$IsolatingRun.resolve_implicit_levels)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s   
Q Rr   F)stringstop_at_pdir   r   c                 C   s   d}| D ]}t |}|r&| r&d}|dkrD|dkrD|rDtj  S |dkrT|d7 }|dkrl|dkrl|d8 }|dkr|dkrtj  S |dkr|dkrtj  S qtjS )aH  
    This function applies rules P2 and P3 to detect the direction of a paragraph, retuning
    the first strong direction and skipping over isolate sequences.
    P1 must be applied before calling this function (breaking into paragraphs)
    stop_at_pdi can be set to True to get the direction of a single isolate sequence
    r   r   r   r   r   r   r   )r   r   r   )r   r   r   r	   LTRRTL)r   r   r   Zisolater   r   r   r   r   auto_detect_base_direction  s     



r   )	paragraphr   c                 C   s  g }g }| d j }| D ]4}|j |kr@|||dd g }|j }|| q|||dd ttddd}t|D ]\}}|d rqv|dkr||d }n|t|d ||d	  d }|t|d	 kr||d }n>|d
 d jdkr||d }n|t|d ||d	  d }||d< ||d< qvg }	t|D ]\}}|d rLq6|d }|d }|d
 }
d|d< |d
 d jdkr||d	 d  D ]j}|d |d kr|d
 d jdkr|d
  |d
 7  < d|d< |d }|d
 d jdkr qq|	t|
||d q6|	S )Nr   F)leveltextcomplete)r   r   c                 S   s   | d dkrdS dS )Nr   r   r   r   r   )r   r   r   r   level_to_direction  s    z2calculate_isolate_runs.<locals>.level_to_directionr   r   r   r   r   r   r   r   Tr   r   )	r   r   r   r   r   maxr   r   r   )r   Z	level_runlrZlr_embedding_levelr   r   r   r   r   Zisolate_runsZir_charsZnlrr   r   r   calculate_isolate_runs  sb    





r   c                   @   s   e Zd ZdZdeeedddZee	 ddd	Z
ee	 dd
dZee	 dddZdd Zdd Zdd Zee	 dddZdd Zdd ZdS )BidiParagraph)r   base_directionr   base_embedding_levelr   NF)r   r   r   c                 C   sJ   || _ |st| j |n|| _|| _| jtjkr2dnd| _g | _|   d S )Nr   r   )	r   r   r   r   r	   r   r   r   get_bidi_characters)r   r   r   r   r   r   r   r     s    zBidiParagraph.__init__r   c                 C   s   | j S r   )r   r   r   r   r   get_characters  s    zBidiParagraph.get_charactersc                 C   s   |    | jS r   )reorder_resolved_levelsr   r   r   r   r   #get_characters_with_embedding_level   s    z1BidiParagraph.get_characters_with_embedding_levelc                 C   s   |   S r   )r   r   r   r   r   get_reordered_characters&  s    z&BidiParagraph.get_reordered_charactersc                 C   s   | j |  fS r   )r   r   r   r   r   r   get_all)  s    zBidiParagraph.get_allc                 C   s   d dd |  D S )zUsed for conformance validation c                 s   s   | ]}|j V  qd S r   )r   ).0r   r   r   r   	<genexpr>.  s     z5BidiParagraph.get_reordered_string.<locals>.<genexpr>)joinr   r   r   r   r   get_reordered_string,  s    z"BidiParagraph.get_reordered_stringc                 C   s   |   S r   )split_bidi_fragmentsr   r   r   r   get_bidi_fragments0  s    z BidiParagraph.get_bidi_fragmentsc                 C   s  t  }t| jddd}|t| d}d}d}g }t| jD ]\}}t|||j| j	}	d }
|	j
dkrt| j|d d  d| j	dtjkrd	nd
|	_
|	j
dkr|	j
d dkr|jd dB }n|jd d@ }|	j
d dkr|jdkr|j}
|tkrf|dkrf|dkrf||_|	j
d dkr*|	j
d nd|_|	j
d dkrP|d7 }d|_nd|_|t| n,|	j
d dkr|d7 }n|dkr|d7 }|	j
dkr|jdkr|j}
|	j
dkrD|dkr|d8 }nJ|dkrd}|d js|  qސqq|  t|d }|d8 }t|ts*t|j|	_|jdkrD|j}
|	j
dkr|dkr|dkrn|d8 }n*|jst|dkr|  t|d }|
r|
|	_
|	j
dkr>|	j
dkr| j|	_n|	jdkr|j|	_||	 q>|sg | _d S || _t| d S )NNF)r   r   r   r   r   r   T)r   r   r   r   )RLELRERLOLROr   r   r   r   IO)	r   BNr  r  r  r  PDFr   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   	MAX_DEPTHr   pop
isinstanceAssertionErrorr   r   r   r   )r   stackZcurrent_statusZoverflow_isolate_countZoverflow_embedding_countZvalid_isolate_countresultsr   r   r   Znew_bidi_classZnew_embedding_levelr   r   r   r   3  s       
  	










z!BidiParagraph.get_bidi_charactersc                 C   s   g }t | jdkrdS d}d}| jD ]H}| |krb|rV|||dkrLtjntjf d}| }||j7 }q$|r|||dkrtjntjf t|S )Nr   r   r   r   )	r   r   r   r   r	   r   r   r   tuple)r   Zbidi_fragmentsZcurrent_fragmentZcurrent_directionr   r   r   r   r     s6    


z"BidiParagraph.split_bidi_fragmentsc           
      C   s  d}d}d}d}t | jD ]n}|jdkr6| j|_d}n$|jdkrR|sH|rZ| j|_nd}d}|j|krj|j}|jd dkr|j|k r|j}q| j }t||d d	D ]h}g }g }	|D ]<}|j|kr|	| q|	r|	  ||	7 }g }	|| q|	r|	  ||	7 }|}qt	|S )
NTr   i  )r   r   )r
  r   r   r   r   r   Fr   r   r   )
reversedr   r   r   r   copyr   r   reverser  )
r   Zbefore_separatorend_of_lineZ	max_levelZmin_odd_levelr   Zreordered_paragraphr   Ztemp_resultsrevr   r   r   r     sJ    





z%BidiParagraph.reorder_resolved_levels)NF)r   r   r   r   r   r	   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   r   r     s$   	      
#r   )FF)r   collectionsr   dataclassesr   r   operatorr   typingr   r   enumsr	   r  r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s.   % `     C