
     h?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	 Zd
 ZedfedfedfedfdZ ee                                          g dz   Z ee                                          ddgz   Zd Zej        dk    Zd\  ZZd%dZd&dZd'dZd&dZd Zd&dZd Zd Z d Z!d  Z"d! Z#d" Z$	 	 d(d$Z%dS ))z&bidirectional algorithm implementation    Ndeque)bidirectionalmirrored   )MIRRORED)LALR>   c                     | dz   dz  S )Nr    xs    J/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/bidi/algorithm.py_LEAST_GREATER_ODDr   "   s    EQ;    c                     | dz   dz  S )N   r   r   s    r   _LEAST_GREATER_EVENr   &   s    ER<r   Nr   r	   )RLELRERLOLRO)BNPDFBr   r   c                     d| dz           S )Nr	   r   r   r   r   s    r   _embedding_directionr"   6   s    a!er   i  )i   i  FTc                    ddl }ddl}ddl}t          j        r6 |                    |                                          |j                  }n|j        }t          j	                    d         d         }|
                    d|z             |r<|
                    d| d         z             |
                    d| d	         z             |r+|
                    d
t          | d                   z             |rd}	| d         D ]}
|
dk    r|	|
d         z  }	|	dz  }	|
                    |	dz              dd                    d | d         D                       z  }	|
                    |	           d | d         D             }t          d          D ]Brd}	nd}	|
                    |	d                    fd|D                       z             AdS 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                 B    g | ]}t          j        |d                    S )level)six	text_type.0_chs     r   
<listcomp>z!debug_storage.<locals>.<listcomp>^   s&    EEESS]3w<((EEEr   c                 D    g | ]}|d                               d          S )typer$   )ljustr1   s     r   r4   z!debug_storage.<locals>.<listcomp>a   s*    CCC3#f+##A&&CCCr   z                %s
z  Res. types  : %s
c                      g | ]
}|         S r   r   )r2   _tis     r   r4   z!debug_storage.<locals>.<listcomp>h   s    +C+C+CbBqE+C+C+Cr   )codecslocalesysr/   PY2	getwritergetpreferredencodingstderrinspectstackwritelistjoinrange)storage	base_infor(   r'   r;   r<   r=   rA   calleroutputr3   _typesr:   s               @r   debug_storagerM   >   s1    MMMMMMJJJ
w @!!&"="="?"?@@LL]__Q"F
LLV#$$$ D,w|/DDEEE,wz/BBCCC F,tGFO/D/DDEEE F$7# 	 	Cd{{#d)##Ve^$$$(388EEGG4DEEE,G ,G GVCC''2BCCCq 	F 	FA 100LL#((+C+C+C+CF+C+C+C"D"DDEEEE)F F	F 	Fr   c                 
   d}d}| D ]w}t           r*t          t          |          cxk    rt          k    rn n|}3|r||z   }d}|r|                                rd} n"t          |          }|dv rd} n|dk    rd} nx|d}|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_surrogater3   	bidi_types         r   get_base_levelrX   k   s     JN   	#3s88EEEE~EEEEE N 	# 3&C"N  	CKKMM 	JE!#&&	##JE#JE 
 
r   c                 R   d}|d         }| D ]}t           r*t          t          |          cxk    rt          k    rn n|}3|r||z   }d}|r|                                rd}nt          |          }|d                             ||||d           |rt          |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.   r6   origT)rI   N)rO   rP   rQ   rR   rS   r   appendrM   )rT   rH   rU   debugrV   r%   r3   rW   s           r   get_embedding_levelsr]      s    N&J    	#3s88EEEE~EEEEE N 	# 3&C"N 	+CKKMM 	+II%c**I	!
 !
 	 	 	 	  /g....../ /r   c                    dx}}d}t                      }| d         }| d         D ]}|d         }t                              |d          \  }	}
|	rX|dk    r|dz  }7 |	|          }|t          k     r|                    ||f           ||
}}i|t          dz
  k    r|dz  }}|dz  }|t
          vr||d	<   |dk    r||d<   |d
k    r8|r|dz  }|r|t          dz
  k    r|dz  }|r|                                \  }}|dk    r'|                                 dx}}| d         x}|d	<   d}
d | d         D             | d<   t          |            |rt          | 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(   r6   )NNr   r   r.   r   r   c                 0    g | ]}|d          t           v|S )r6   )
X9_REMOVEDr1   s     r   r4   z0explicit_embed_and_overrides.<locals>.<listcomp>   s0     : : :v;j88 888r   Tr'   N)
r   X2_X5_MAPPINGSgetEXPLICIT_LEVEL_LIMITr[   
X6_IGNOREDpopclearcalc_level_runsrM   )rH   r\   overflow_counteralmost_overflow_counterdirectional_overridelevelsembedding_levelr3   rW   
level_funcoverride	new_levels               r   explicit_embed_and_overridesrq      s+    232.WWF l+Ow 0+ 0+K	-11)\JJ
H +	+  1$$ A% "
?33I///0DEFFF8A8!5 $81$<<< (1,'' !A%   
**.G'3.."6CK e### I$)$$, I'+?!+CCC+q0++ I<BJJLL9O%9 c!!=>> #:181FF#g,'*$: :ww'7 : : :GG G *gD))))))* *r   c           	         | d                                           | d         }|sdS d }|d         } || d         |d                   }d}dx}}|d         |d         }	}|D ]X}
|
d         |
d         }}||k    r|d	z  }n6 |||          }| d                             ||||	|d
           |}||z  }d	}||}	}Y ||| 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                 8    ddgt          | |          dz           S )Nr	   r   r   )max)b_lb_rs     r   calc_level_runz'calc_level_runs.<locals>.calc_level_run  s    Sz#c3--!+,,r   r   r%   r.   r6   r   )soreorstartr6   length)rg   r[   )rH   r(   rw   
first_charrx   ry   	run_start
run_length
prev_level	prev_typer3   
curr_level	curr_types                r   rh   rh     s    FOGE  - - - qJ
..
70C
D
DC
CI
&w/F1C	J 6 6 #Gc&kI
##!OJJ .Z88CFO""3sY,5$M $M N N NC#IJ *II

 .W\%:
;
;CFO3sY$-E E F F F F Fr   c                 B   | d         D ]}|d         x}}|d         |d         }}| d         |||z            }|D ]6}|d         }	|	dk    r|x|d<   }	|	dk    r|d	k    rd
|d<   |	dv r|	}|d         }7|D ]}|d         d	k    rd|d<   t          dt          |          dz
            D ]n}
||
         d         }	||
dz
           d         }||
dz            d         }|	dk    r||cxk    rdk    rn nd||
         d<   |	dk    r||k    r|dv r|||
         d<   ot          t          |                    D ]}
||
         d         dk    rvt          |
dz
  dd          D ] }||         d         dk    rd||         d<     t          |
dz   t          |                    D ] }||         d         dk    rd||         d<     |D ]}|d         dv rd|d<   |d         }|D ]+}|d         dk    r|dk    rd|d<   |d         dv r|d         },|rt          | d           dS dS )zeResolve weak type rules W1 - W3.

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

    r'   rx   rz   r{   r(   r6   NSMENr
   AN)r   r	   r
   r   r   ESCSr   r   ET)r   r   r   ONr	   r!   Tra   N)rG   lenrM   )rH   r\   runprev_strongr   rz   r{   r(   r3   rW   idx	next_typeet_idxs                r   resolve_weak_typesr   6  s#    v K* K*"%e*,iGc(mv uV|!34 	$ 	$C
 FIE!!*33Fi
 D  [D%8%8"F ,,,'FII  	" 	"C6{d""!F
 CJJN++ 
	/ 
	/Cc
6*Ic!eV,Ic!eV,ID  i9&D&D&D&D&D&D&D&D&D%)c
6"D  Y)%;%;--%.c
6" U$$ 	 	CSz&!T))#CE2r22  FV}V,4404ff--#CE3u::66  FV}V,4404ff--  	# 	#C6{000"F
 %j 	* 	*C6{d""{c'9'9!F6{j((!&k	*  *gD))))))* *r   c                    | d         D ]}|d         |d         }}d|d         ig| d         |||z            z   d|d         igz   }t          |          }d}t          |          D ]}||         }	|	d         d	v r||}||d
z
           d         }
*|e||         d         }|
dv rd}
|dv rd}t          ||          D ]8}|
|k    r|
||         d<   t          ||         d                   ||         d<   9d}|rt          |            dS dS )zuResolving neutral types. Implements N1 and N2

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

    r'   rz   r{   r6   rx   r(   ry   N)r   SWSr   r   r   r   r.   )r   rG   r"   rM   )rH   r\   r   rz   r{   r(   total_chars	seq_startr   r3   prev_bidi_typenext_bidi_typeseq_idxs                r   resolve_neutral_typesr     s    v *% *%Gc(mv#e*%&)9%f:L)MM#e*%&'%jj	%% "	% "	%C*C6{444 $ #I%*3q5\&%9N(%*3Z%7N%55),%55),#(C#8#8 
N 
N)^;;5CE'N622 !5U7^G5L M M "'N622 !%IE"	%H  g r   c                    | d         D ]}|d         |d         }}| d         |||z            }|D ]}|d         dv sJ d|d         z              t          |d                   d	k    r:|d         d
k    r|dxx         dz  cc<   U|d         d	k    r|dxx         dz  cc<   r|d         d
k    r|dxx         dz  cc<   |rt          | d           dS dS )zlResolving implicit levels (I1, I2)

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

    r'   rz   r{   r(   r6   )r	   r   r   r   z%s not allowed herer.   r	   r   r   r   Tra   N)r"   rM   )rH   r\   r   rz   r{   r(   r3   s          r   resolve_implicit_levelsr     s;    v & &Gc(mv uV|!34 	& 	&Cv;"8888)CK7 988 $CL11S88 v;#%%LLLA%LLLL[C''LLLA%LLL v;#%%LLLA%LLL#	&&  *gD))))))* *r   c                 D   t          ||dz
  d          D ]}dx}}t          ||dz             D ]J}| |         }	|	d         |k    r
||x}}|} |(t          | ||
 dz                      | ||
 dz   <   dx}}K|$t          | ||
 dz                      | ||
 dz   <   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.   )rG   reversed)
r(   
line_startline_endhighest_levellowest_odd_levelr.   _start_endrun_idxrun_chs
             r   reverse_contiguous_sequencer     s     }&6q&8"== 0 0Z!44 	) 	)G7^Fg%''>$++FTT"DD#$U64%'>%:;; &$q.)$((FT vteAg~.// &$q.!'0 0r   c                    d}| d         }|ddd         D ]4}|d         dv r| d         |d<   d}|r|d         d	v r| d         |d<   2d
}5t          |          }dx}}d}t          }	t          |          D ]p}
||
         }|d         }||k    r|}|dz  r||	k     r|}	|d         dk    s	|
|dz
  k    r4|
}|d         dk    r|dz  }t          |||||	           |
dz   }d}t          }	q|rt	          |            dS dS )zL1 and L2 rulesTr(   Nr   rZ   )r   r   r%   r.   )r   r   Fr   r   r   r   )r   rd   rG   r   rM   )rH   r\   should_resetr(   r3   max_lenr   r   r   r   r   
char_levels               r   reorder_resolved_levelsr     s   
 LGETTrT{ ! ! v;*$$ #<0CLLL 	!c&k\99
 #<0CLL LL%jjG
 JM+W~~ 4 4Cj \
%%&M> 	*j+;;;)v;#!!3!3H6{c!!A'z8(57GI I I QJM3 g r   c                     | d         D ]J}|d         }t          |          r1t          |d                   dk    rt          j        ||          |d<   K|rt	          |            dS dS )zHApplies L4: mirroring

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

    r(   r*   r.   r   N)r   r"   r   rc   rM   )rH   r\   r3   unichars       r   apply_mirroringr   D  s     w 7 7d)G 	7$S\22c99 Wg66CI g r   c                  (    ddg t                      dS )z4Return an empty storage skeleton, usable for testingN)r%   r&   r(   r'   r   r   r   r   get_empty_storager   W  s#     	  r   utf-8c                 N   t                      }t          | t          j                  r| }d}n|                     |          }d}|t          ||          }nt          |         }||d<   d|         |d<   t          ||||           t          ||           t          ||           t          ||           t          ||           t          ||           t          ||           |d         }	d                    d	 |	D                       }
|r|
                    |          S |
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                     g | ]
}|d          S )r*   r   r1   s     r   r4   zget_display.<locals>.<listcomp>  s    333cD	333r   )r   
isinstancer/   r0   decoderX   PARAGRAPH_LEVELSr]   rq   r   r   r   r   r   rF   encode)unicode_or_strencodingrU   r&   r\   rH   rT   decodedr%   r(   displays              r   get_displayr   a  s@   "  !!G .#-00 $$X..#D,77

%h/
&GL$Z0GJwe<<< %000w&&&'5)))GU+++GU+++GU###GEhh33U33344G ~~h'''r   )FTF)F)FF)r   FNF)&__doc__r=   rB   collectionsr   unicodedatar   r   r/   mirrorr   r   rd   r   r   rb   rE   keysre   r`   r"   
maxunicoderO   rP   rR   rM   rX   r]   rq   rh   r   r   r   r   r   r   r   r   r   r   r   <module>r      sH  $ ) ( 



        / / / / / / / / 



       !!,,      
 $%$%	  T.%%''((+=+=+==
T.%%''((D%=8
   >U"!- *F *F *F *FZ+ + + +\/ / / />J* J* J* J*Z.F .F .FbU* U* U* U*p4 4 4n* * *B0 0 0>< < <~  &   @E%*1 1 1 1 1 1r   