o
    +׾gS                     @   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m	Z	m
Z
 ddlmZ eeef 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 g d Zee ddg Zdd ZejdkZd\ZZd<ddZd=defddZ d>d d!Z!d=d"d#Z"d$d% Z#d=d&d'Z$d(d) Z%d*d+ Z&d,d- Z'd.d/ Z(d0d1 Z)d2d3 Z*	4			d?d5ed6ed7e+d8ee d9e+defd:d;Z,dS )@z&bidirectional algorithm implementation    Ndeque)OptionalUnion)bidirectionalmirrored   )MIRRORED)LALR>   c                 C   s   | d dB S )Nr    xr   r   X/var/www/html/backend_erp/backend_erp_env/lib/python3.10/site-packages/bidi/algorithm.py_LEAST_GREATER_ODD"      r   c                 C   s   | d d@ S )N   r   r   r   r   r   _LEAST_GREATER_EVEN&   r   r   Nr   r
   )RLELRERLOLRO)BNPDFBr   r   c                 C   s   d| d  S )Nr
   r   r   r   r   r   r   r   _embedding_direction6   r   r    i  )i   i  FTc           	   	      s.  t j}t d d }|d| d |r)|d| d   |d| d  |r7|d	t| d
  |rd}| d D ]}|dkrL||d 7 }q?|d7 }q?||d  dddd | d D }|| dd | d D }tdD ]  rdnd}||d fdd|D   qydS dS )z)Display debug information for the storager      zin 
z  base level  : %d

base_levelz  base dir    : {}
base_dirz  runs        : {}
runsz  Chars       : charschCz  Res. levels : {}
 c                 S   s   g | ]}t |d  qS )level)str.0_chr   r   r   
<listcomp>W   s    z!debug_storage.<locals>.<listcomp>c                 S   s   g | ]	}|d   dqS )typer!   )ljustr,   r   r   r   r/   [   s    z                %s
z  Res. types  : %s
c                    s   g | ]}|  qS r   r   )r-   _tir   r   r/   _       N)	sysstderrinspectstackwriteformatlistjoinrange)	storage	base_infor&   r%   r7   calleroutputr.   _typesr   r3   r   debug_storage>   s2   

$rD   returnc                 C   s   d}d}| D ];}t rtt|  krtkrn n|}q|r#|| }d}|r-| r-d} nt|}|dv r9d} n	|dkrAd} nq|du rHd}|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_levelb   s.   
 rO   c                 C   s   d}|d }| D ]5}t rtt|  krtkrn n|}q|r%|| }d}|r-| r-dnt|}|d ||||d q|rHt|dd dS dS )	z_Get the paragraph base embedding level and direction,
    set the storage to the array of charsFr#   r   r&   )r'   r*   r0   origT)r@   N)rF   rG   rH   rI   rJ   r   appendrD   )rK   r?   rL   debugrM   r#   r.   rN   r   r   r   get_embedding_levels   s     rS   c                 C   sf  d }}d}t  }| d }| d D ]}|d }t|d\}	}
|	rO|dkr*|d7 }q|	|}|tk r?|||f ||
}}q|td krJ|d7 }q|d7 }q|tvr`||d	< |dkr_||d< q|d
kr|rk|d8 }q|rx|td krx|d8 }q|r| \}}q|dkr|  d }}| d  }|d	< d}qdd | d D | d< t|  |rt	| dd dS 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&   r0   )NNr   r   r*   r   r   c                 S   s   g | ]
}|d  t vr|qS )r0   )
X9_REMOVEDr,   r   r   r   r/      s    z0explicit_embed_and_overrides.<locals>.<listcomp>Tr%   N)
r   X2_X5_MAPPINGSgetEXPLICIT_LEVEL_LIMITrQ   
X6_IGNOREDpopclearcalc_level_runsrD   )r?   rR   overflow_counteralmost_overflow_counterdirectional_overridelevelsembedding_levelr.   rN   
level_funcoverride	new_levelr   r   r   explicit_embed_and_overrides   s\   




re   c              	   C   s   | d    | d }|sdS dd }|d }|| d |d }d}d }}d	\}}	|d |d
 }
}|D ]3}|d |d
 }}	||
krH|d7 }n||
|}| d |||||d |}||7 }d}||	}
}q4||| 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)b_lb_rr   r   r   calc_level_run  s   z'calc_level_runs.<locals>.calc_level_runr   r#   r*   )r   r)   r0   r   )soreorstartr0   length)r[   rQ   )r?   r&   ri   
first_charrj   rk   	run_start
run_length
curr_level	curr_type
prev_level	prev_typer.   r   r   r   r\      sJ   	

	r\   c                 C   sR  | d D ]}|d  }}|d |d }}| d |||  }|D ]&}|d }	|	dkr2| |d< }	|	dkr>|d	kr>d
|d< |	dv rD|	}|d }q"|D ]}|d d	krWd|d< qKt dt|d D ]@}
||
 d }	||
d  d }||
d  d }|	dkr||  krdkrn nd||
 d< |	dkr||kr|dv r|||
 d< qat t|D ]?}
||
 d dkrt |
d ddD ]}|| d dkrd|| d< q t |
d t|D ]}|| d dkrd|| d< q q|D ]}|d dv rd|d< q|d }|D ]}|d dkr|dkrd|d< |d dv r|d }qq|r't| dd dS dS )zeResolve weak type rules W1 - W3.

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

    r%   rj   rl   rm   r&   r0   NSMENr   AN)r   r
   r   r   r   ESCSrw   rv   ET)r|   rx   ry   ONr
   r   TrU   N)r>   lenrD   )r?   rR   runprev_strongrt   rl   rm   r&   r.   rN   idx	next_typeet_idxr   r   r   resolve_weak_types8  sl   
 r   c                 C   s"  d}| d D ]}|d |d }}d|d ig| d |||   d|d ig }t |}d	}t|D ]R}	||	 }
|
d d
v rN|d	u rM|	}||	d  d }q3|d	ur||	 d }|dv r^d}|dv rdd}t||	D ]}||krv||| d< qit|| d || d< qid	}q3q|rt|  d	S d	S )zuResolving neutral types. Implements N1 and N2

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

    r)   r%   rl   rm   r0   rj   r&   rk   N)r   SWSr}   r   rz   r   r*   )r~   r>   r    rD   )r?   rR   prev_bidi_typer   rl   rm   r&   total_chars	seq_startr   r.   next_bidi_typeseq_idxr   r   r   resolve_neutral_types  sH   
%r   c                 C   s   | d D ]]}|d |d }}| d |||  }|D ]E}|d dv s,J d |d t|d d	krR|d d
krC|d  d7  < q|d d	krQ|d  d7  < q|d d
kr`|d  d7  < qq|rlt| dd dS dS )zlResolving implicit levels (I1, I2)

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

    r%   rl   rm   r&   r0   )r
   r   rv   rw   z{} not allowed herer*   r
   r   r   r   TrU   N)r;   r    rD   )r?   rR   r   rl   rm   r&   r.   r   r   r   resolve_implicit_levels  s(   r   c           
      C   s   t ||d dD ]Z}d }}t ||d D ]2}| | }	|	d |kr-|du r*| }}q|}q|durGt| ||
 d  | ||
 d < d }}q|durb|durbt| ||
 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   r{   Nr*   )r>   reversed)
r&   
line_startline_endhighest_levellowest_odd_levelr*   _start_endrun_idxrun_chr   r   r   reverse_contiguous_sequence  s    	
$$r   c                 C   s  d}| d }|ddd D ]"}|d dv r| d |d< d}q|r-|d d	v r-| d |d< qd
}qt |}d }}d}t}	t|D ]B}
||
 }|d }||krP|}|d rZ||	k rZ|}	|d dksf|
|d kr|
}|d dkrr|d8 }t|||||	 |
d }d}t}	q@|rt|  dS dS )zL1 and L2 rulesTr&   Nr{   rP   )r   r   r#   r*   )r   r   Fr   r   r   r   )r~   rX   r>   r   rD   )r?   rR   should_resetr&   r.   max_lenr   r   r   r   r   
char_levelr   r   r   reorder_resolved_levels  sD   
r   c                 C   sR   | d D ]}|d }t |rt|d dkrt|||d< q|r't|  dS dS )zHApplies L4: mirroring

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

    r&   r'   r*   r   N)r   r    r	   rW   rD   )r?   rR   r.   unicharr   r   r   apply_mirroringO  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_storagea  s
   r   utf-8str_or_bytesencodingrL   r$   rR   c                 C   s   t  }t| tr| |}d}n| }d}|du rt||}nt| }||d< d| |d< t|||| t|| t|| t	|| t
|| t|| t|| |d }	dd	d
 |	D }
|rf|
|}
|
S )a  Accepts `str` or `bytes`. In case it's `bytes`, `encoding`
    is needed as the algorithm works on `str` (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.

    TFNr#   r   r$   r&   r)   c                 S   s   g | ]}|d  qS )r'   r   r,   r   r   r   r/     r5   zget_display.<locals>.<listcomp>)r   
isinstancebytesdecoderO   PARAGRAPH_LEVELSrS   re   r   r   r   r   r   r=   encode)r   r   rL   r$   rR   r?   rK   was_decodedr#   r&   displayr   r   r   get_displayk  s.   








r   )FTF)F)FF)r   FNF)-__doc__r8   r6   collectionsr   typingr   r   unicodedatar   r   mirrorr	   r+   r   
StrOrBytesr   rX   r   r   rV   r<   keysrY   rT   r    
maxunicoderF   rG   rI   rD   intrO   rS   re   r\   r   r   r   r   r   r   r   boolr   r   r   r   r   <module>   sf   

$
-
P
@[<"@