U
    g?S                     @   s>  d Z ddlZddlZddlmZ ddlmZmZ ddlZddl	m
Z
 ddddZdZd	d
 Zdd ZedfedfedfedfdZee dddg Zee ddg Zdd ZejdkZd\ZZd5ddZd6ddZd7ddZd8d d!Zd"d# Zd9d$d%Zd&d' Zd(d) Z d*d+ Z!d,d- Z"d.d/ Z#d0d1 Z$d:d3d4Z%dS );z&bidirectional algorithm implementation    Ndeque)bidirectionalmirrored   )MIRRORED)LALR>   c                 C   s   | d dB S )Nr    xr   r   2/tmp/pip-unpacked-wheel-nh04upgo/bidi/algorithm.py_LEAST_GREATER_ODD"   s    r   c                 C   s   | d d@ S )N   r   r   r   r   r   _LEAST_GREATER_EVEN&   s    r   Nr
   r   )ZRLEZLREZRLOZLROBNPDFBc                 C   s   d| d  S )Nr   r
   r   r   r   r   r   r   _embedding_direction6   s    r   i  )i   i  FTc              	      s\  ddl }ddl}ddl}tjr4|| |j}n|j}t	 d d }|
d|  |r|
d| d   |
d| d	   |r|
d
t| d   |rXd}	| d D ]"}
|
dkr|	|
d 7 }	q|	d7 }	q|
|	d  dddd | d D  }	|
|	 dd | d D }tdD ]8  r.d}	nd}	|
|	d fdd|D   qdS )z)Display debug information for the storager   Nr      zin %s
z  base level  : %d

base_levelz  base dir    : %s
base_dirz  runs        : %s
runsz  Chars       : chars
chCz  Res. levels : %s
 c                 S   s   g | ]}t |d  qS )level)six	text_type.0_chr   r   r   
<listcomp>^   s     z!debug_storage.<locals>.<listcomp>c                 S   s   g | ]}|d   dqS )typer   )ljustr&   r   r   r   r)   a   s     z                %s
z  Res. types  : %s
c                    s   g | ]}|  qS r   r   )r'   Z_tir   r   r)   h   s     )codecslocalesysr$   PY2	getwritergetpreferredencodingstderrinspectstackwritelistjoinrange)storage	base_infor   r   r.   r/   r0   r4   Zcalleroutputr(   _typesr   r,   r   debug_storage>   s<    

r?   c                 C   s   d}d}| D ]z}t r8tt|  kr,tkr8n n|}qn|rH|| }d}|r\| r\d} qt|}|dkrvd} qq|dkrd} qq|dkrd}|S )zGet the paragraph base embedding level. Returns 0 for LTR,
    1 for RTL.

    `text` a unicode object.

    Set `upper_is_rtl` to True to treat upper case chars as strong 'R'
    for debugging (default: False).

    NFr   )r	   r
   r   r   )_IS_UCS2_SURROGATE_MINord_SURROGATE_MAXisupperr   )textupper_is_rtlr   prev_surrogater(   	bidi_typer   r   r   get_base_levelk   s,     rI   c                 C   s   d}|d }| D ]n}t r<tt|  kr0tkr<n n|}qn|rL|| }d}|r^| r^d}nt|}|d ||||d q|rt|dd dS )	z_Get the paragraph base embedding level and direction,
    set the storage to the array of charsFr   r
   r   )r    r#   r*   origT)r<   N)r@   rA   rB   rC   rD   r   appendr?   )rE   r;   rF   debugrG   r   r(   rH   r   r   r   get_embedding_levels   s(     
rM   c                 C   sj  d }}d}t  }| d }| d D ]}|d }t|d\}	}
|	r|dkrV|d7 }q"|	|}|tk r|||f ||
 }}n|td kr|d7 }n|d7 }q"|tkr||d	< |dkr||d< q"|d
kr|r|d8 }n,|r|td kr|d8 }n|r4| \}}q"|dkr"|  d }}| d  }|d	< d}q"dd | d D | d< t|  |rft	| dd dS )z|Apply X1 to X9 rules of the unicode algorithm.

    See http://unicode.org/reports/tr9/#Explicit_Levels_and_Directions

    r   r   r   r   r*   )NNr   r   r#   r   r   c                 S   s   g | ]}|d  t kr|qS )r*   )
X9_REMOVEDr&   r   r   r   r)      s    z0explicit_embed_and_overrides.<locals>.<listcomp>Tr   N)
r   X2_X5_MAPPINGSgetEXPLICIT_LEVEL_LIMITrK   
X6_IGNOREDpopclearcalc_level_runsr?   )r;   rL   Zoverflow_counterZalmost_overflow_counterZdirectional_overridelevelsZembedding_levelr(   rH   Z
level_funcoverrideZ	new_levelr   r   r   explicit_embed_and_overrides   sP    






rY   c              	   C   s   | d    | d }|sdS dd }|d }|| d |d }d}d }}|d |d	  }}	|D ]f}
|
d |
d	  }}||kr|d
7 }n4|||}| d ||||	|d |}||7 }d
}|| }}	q`||| d }| d |||||d dS )zxSplit the storage to run of char types at the same level.

    Applies X10. See http://unicode.org/reports/tr9/#X10
    r   r   Nc                 S   s   ddgt | |d  S )Nr   r
   r   )max)Zb_lZb_rr   r   r   calc_level_run  s    z'calc_level_runs.<locals>.calc_level_runr   r   r#   r*   r   )soreorstartr*   length)rU   rK   )r;   r   r[   
first_charr\   r]   Z	run_startZ
run_lengthZ
prev_level	prev_typer(   Z
curr_levelZ	curr_typer   r   r   rV     s8    	

  rV   c                 C   sr  | d D ]P}|d  }}|d |d  }}| d |||  }|D ]L}|d }	|	dkrd| |d< }	|	dkr||d	kr|d
|d< |	dkr|	}|d }qD|D ]}|d d	krd|d< qt dt|d D ]}
||
 d }	||
d  d }||
d  d }|	dkr$||  krdkr$n nd||
 d< |	dkr||kr|dkr|||
 d< qt t|D ]}
||
 d dkrVt |
d ddD ],}|| d dkrd|| d< n qq|t |
d t|D ],}|| d dkrd|| d< n qVqqV|D ]}|d dkrd|d< q|d }|D ]<}|d dkr@|dkr@d|d< |d dkr|d }qq|rnt| dd dS )zeResolve weak type rules W1 - W3.

    See: http://unicode.org/reports/tr9/#Resolving_Weak_Types

    r   r\   r^   r_   r   r*   NSMENr	   AN)r
   r   r	   r
   r   ESCSrd   rc   ET)ri   re   rf   ONr   r   TrO   N)r:   lenr?   )r;   rL   runZprev_strongra   r^   r_   r   r(   rH   idxZ	next_typeZet_idxr   r   r   resolve_weak_types6  s^    

&
rn   c                 C   s  | d D ] }|d |d  }}d|d ig| d |||   d|d ig }t |}d}t|D ]}|| }	|	d d	kr|dkr|}||d
  d }
qd|dk	rd|| d }|
dkrd}
|dkrd}t||D ]2}|
|kr|
|| d< qt|| d || d< qd}qdq|rt|  dS )zuResolving neutral types. Implements N1 and N2

    See: http://unicode.org/reports/tr9/#Resolving_Neutral_Types

    r   r^   r_   r*   r\   r   r]   N)r   SWSrj   r   rg   r
   r#   )rk   r:   r   r?   )r;   rL   rl   r^   r_   r   Ztotal_charsZ	seq_startrm   r(   Zprev_bidi_typeZnext_bidi_typeZseq_idxr   r   r   resolve_neutral_types  s6     rq   c                 C   s   | d D ]}|d |d  }}| d |||  }|D ]}|d dksVt d|d  t|d d	kr|d d
kr|d  d7  < q|d d	kr|d  d7  < q6|d d
kr6|d  d7  < q6q|rt| dd dS )zlResolving implicit levels (I1, I2)

    See: http://unicode.org/reports/tr9/#Resolving_Implicit_Levels

    r   r^   r_   r   r*   )r   r
   rc   rd   z%s not allowed herer#   r   r
   r   r   TrO   N)AssertionErrorr   r?   )r;   rL   rl   r^   r_   r   r(   r   r   r   resolve_implicit_levels  s     
rs   c           
      C   s   t ||d dD ]}d }}t ||d D ]d}| | }	|	d |krZ|dkrT| }}q|}q*|dk	r*t| ||
 d  | ||
 d < d }}q*|dk	rt| ||
 d  | ||
 d < qdS )zL2. From the highest level found in the text to the lowest odd
    level on each line, including intermediate levels not actually
    present in the text, reverse any contiguous sequence of characters
    that are at that level or higher.

    r   rh   Nr#   )r:   reversed)
r   
line_startline_endhighest_levellowest_odd_levelr#   _startZ_endZrun_idxZrun_chr   r   r   reverse_contiguous_sequence  s    

rz   c                 C   s  d}| d }|ddd D ]D}|d dkr<| d |d< d}q|rZ|d d	krZ| d |d< qd
}qt |}d }}d}t}	t|D ]}
||
 }|d }||kr|}|d r||	k r|}	|d dks|
|d kr|
}|d dkr|d8 }t|||||	 |
d }d}t}	q|rt|  dS )zL1 and L2 rulesTr   Nrh   rJ   )r   ro   r   r#   )r   rp   Fr   r   r   r   )rk   rR   r:   rz   r?   )r;   rL   Zshould_resetr   r(   max_lenru   rv   rw   rx   rm   Z
char_levelr   r   r   reorder_resolved_levels  sB     r|   c                 C   sN   | d D ]4}|d }t |rt|d dkrt|||d< q|rJt|  dS )zHApplies L4: mirroring

    See: http://unicode.org/reports/tr9/#L4

    r   r    r#   r
   N)r   r   r   rQ   r?   )r;   rL   r(   Zunicharr   r   r   apply_mirroringD  s    	r}   c                   C   s   ddg t  dS )z4Return an empty storage skeleton, usable for testingN)r   r   r   r   r   r   r   r   r   get_empty_storageW  s
    r~   utf-8c                 C   s   t  }t| tjr| }d}n| |}d}|dkr>t||}nt| }||d< d| |d< t|||| t|| t	|| t
|| t|| t|| t|| |d }	dd	d
 |	D }
|r|
|S |
S dS )a  Accepts unicode or string. In case it's a string, `encoding`
    is needed as it works on unicode ones (default:"utf-8").

    Set `upper_is_rtl` to True to treat upper case chars as strong 'R'
    for debugging (default: False).

    Set `base_dir` to 'L' or 'R' to override the calculated base_level.

    Set `debug` to True to display (using sys.stderr) the steps taken with the
    algorithm.

    Returns the display layout, either as unicode or `encoding` encoded
    string.

    FTNr   r   r   r   r"   c                 S   s   g | ]}|d  qS )r    r   r&   r   r   r   r)     s     zget_display.<locals>.<listcomp>)r~   
isinstancer$   r%   decoderI   PARAGRAPH_LEVELSrM   rY   rn   rq   rs   r|   r}   r9   encode)Zunicode_or_strencodingrF   r   rL   r;   rE   decodedr   r   Zdisplayr   r   r   get_displaya  s.    







r   )FTF)F)FF)F)F)r   FNF)&__doc__r0   r5   collectionsr   unicodedatar   r   r$   Zmirrorr   r   rR   r   r   rP   r8   keysrS   rN   r   
maxunicoder@   rA   rC   r?   rI   rM   rY   rV   rn   rq   rs   rz   r|   r}   r~   r   r   r   r   r   <module>   sH   

-
.

M1
X7!?
    