o
    o_C4                     @   s`  d dl mZmZ d dlmZ d dlmZmZmZ d dl	Z	ej
Z
e
jZe
jZe
jZe
jZe
jZe
jZdd Zde vr>e ZnJ ddad	ad
d Zdd Zdd Zee 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!d"d# Z"d$d% Z#G d&d' d'e$Z%d(d) Z&d*d+ Z'd,d- Z(d.d/ Z)G d0d1 d1e*Z+d2d3 Z,G d4d5 d5e-Z.dS )6    )divisionprint_function)escape)bytes	text_type
text_typesNc                  C   s  dd l } |  }zfz1z	| | jd W n
 | jy   Y nw |  d p%dW W z	| | j| W S  | jy:   Y S w  tyn } z(|jri|jd driW Y d }~W z
| | j| W dS  | jyh   Y dS w  d }~ww z	| | j| W w  | jy   Y w w )Nr       zunknown locale)locale	getlocale	setlocaleLC_ALLError
ValueErrorargs
startswith)r
   initiale r   ,/usr/lib/python3/dist-packages/urwid/util.pydetect_encoding)   s<   r   detected_encodingz
It worked!Tc                 C   s~   |   } | dv rtd dan| dv rtd dantd dadaz| r2d	|  | aW d
S W d
S  ty>   Y d
S w )z~
    Set the byte encoding to assume when processing strings and the
    encoding to use when converting unicode strings.
    )zutf-8utf8utfr   F)zeuc-jpzeuc-krzeuc-cnzeuc-twgb2312gbkbig5zcn-gbuhceucjpeuckreuccneuctwcncbwideTnarrowasciir   N)lowerstr_utilset_byte_encoding_use_dec_special_target_encodingencodeLookupError)encodingr   r   r   set_encodingH   s    




r.   c                   C   s   t  S )z
    Get the mode Urwid is using when processing text strings.
    Returns 'narrow' for 8-bit encodings, 'wide' for CJK encodings
    or 'utf8' for UTF-8 encodings.
    )r'   get_byte_encodingr   r   r   r   get_encoding_modej   s   r0   c              	   C   s  t r2t| tkr2z| tj} W n! ty1   ttjtj	D ]\}}| 
|tj| tj } qY nw t| tkrI| 
tjtj d} t| td} t| tsPJ tjd}tjd}| |}t|d tsjJ |d 
|t }g }g }|r|| |dt|f t|dkr||fS |dd D ]f}	t|	tsJ t|tsJ |	|d}
t|
dkr|
d }t|tsJ || t|tjdt|f q|
\}}|
|t }|r|| t|tjt|f |r|| t|dt|f qt |}||fS )z:
    Return (encoded byte string, character set rle).
    r   replacer%   r   Nr	   )r)   typer   	translater   DEC_SPECIAL_CHARMAPNotImplementedErrorzipDEC_SPECIAL_CHARSALT_DEC_SPECIAL_CHARSr1   SOSIcodecsr+   r*   
isinstancer   splitappendlenrle_append_modifyDEC_TAGjoin)scaltr9   r:   sissis0soutcoutsnslsinsonoutstrr   r   r   apply_target_encodings   s^   




rO   c                   C   s   t ot dkS )zi
    Return True if python is able to convert non-ascii unicode strings
    to the current encoding.
    r%   )r*   r   r   r   r   supports_unicode   s   rP   c                 C   s~   |}d }}|dkr$t | |||\}}||k r$d}t | |||d \}}|| | }	t | |||	\}
}||	k r9d}||
||fS )a	  
    Calculate the result of trimming text.
    start_offs -- offset into text to treat as screen column 0
    end_offs -- offset into text to treat as the end of the line
    start_col -- screen column to trim at the left
    end_col -- screen column to trim at the right

    Returns (start, end, pad_left, pad_right), where:
    start -- resulting start offset
    end -- resulting end offset
    pad_left -- 0 for no pad or 1 for one space to be added
    pad_right -- 0 for no pad or 1 for one space to be added
    r   r	   )calc_text_pos)text
start_offsend_offs	start_colend_colspospad_left	pad_rightscrunposr   r   r   calc_trim_text   s   r]   c                 C   s   t | dt| ||\}}}}t|||}	t|||}
|r/t||d }t|	|df t|
d |rBt||}t|	|df t|
d t || ||  t | |	|
fS )z<
    Return ( trimmed text, trimmed attr, trimmed cs ).
    r   r	   )Nr	   )r]   r?   
rle_subseg
rle_get_atrle_prepend_modifyr@   r   rjust)rR   attrcsrU   rV   rW   eposrX   rY   attrtrcstralr   r   r   trim_text_attr_cs   s$   



rh   c                 C   s>   d}|dk rdS | D ]\}}|| |kr|  S ||7 }q
dS )z-
    Return the attribute at offset pos.
    r   Nr   )rler\   xar[   r   r   r   r_      s   
r_   c                 C   s   g }d}| D ]9\}}|r#||kr||8 }||7 }q||7 }||8 }d}||kr* |S || |kr4|| }||7 }| ||f q|S )z$Return a sub segment of an rle list.r   r>   )ri   startendlrj   rk   r[   r   r   r   r^     s&   r^   c                 C   s:   d}| D ]}t |tksJ t| |\}}||7 }q|S )z]
    Return the number of characters covered by a run length
    encoded attribute list.
    r   )r2   tuplerepr)ri   r[   vrk   rr   r   r   rle_len  s   
rt   c                 C   s`   |\}}| s||fg| dd< dS | d \}}||kr%||| f| d< dS ||fg| dd< dS )z
    Append (a, r) (unpacked from *a_r*) to BEGINNING of rle.
    Merge with first run when possible

    MODIFIES rle parameter contents. Returns None.
    Nr   r   )ri   a_rrk   rs   rg   r[   r   r   r   r`   $  s   r`   c                 C   sN   |\}}| r| d d |kr|  ||f dS | d \}}||| f| d< dS )z
    Append (a, r) (unpacked from *a_r*) to the rle list rle.
    Merge with last run when possible.

    MODIFIES rle parameter contents. Returns None.
    r   Nrl   )ri   ru   rk   rs   lalrr   r   r   r@   6  s   r@   c                 C   s*   |sdS t | |d  | |dd 7 } dS )z
    Append attribute list rle2 to rle.
    Merge last run of rle with first run of rle2 when possible.

    MODIFIES attr parameter contents. Returns None.
    Nr   r	   r@   )ri   rle2r   r   r   rle_join_modifyD  s   r{   c           
      C   s   d }}| r|s
g S | d \}}|d \}}g }|r^|r^t ||}	t|||f|	f ||	8 }|dkrB|t| k rB| | \}}|d7 }||	8 }|dkrZ|t|k rZ|| \}}|d7 }|r^|s|S )a  
    Merge the runs of rle1 and rle2 like this:
    eg.
    rle1 = [ ("a", 10), ("b", 5) ]
    rle2 = [ ("Q", 5), ("P", 10) ]
    rle_product: [ (("a","Q"), 5), (("a","P"), 5), (("b","P"), 5) ]

    rle1 and rle2 are assumed to cover the same total run.
    r	   r   )minr@   r?   )
rle1rz   i1i2a1r1a2r2ro   rs   r   r   r   rle_productP  s$   

r   c                 C   s>   g }g }| D ]\\}}}t |||f t |||f q||fS )z!
    Inverse of rle_product.
    ry   )ri   r}   rz   r   r   rs   r   r   r   
rle_factorn  s   r   c                   @   s   e Zd ZdS )TagMarkupExceptionN)__name__
__module____qualname__r   r   r   r   r   z  s    r   c                 C   sF   t | d\}}|d dd |}|r|d d du r|d= ||fS )z:Return (text string, attribute list) for tagmarkup passed.Nr   rv   )_tagmarkup_recurserB   )tmtlrg   rR   r   r   r   decompose_tagmarkup|  s
   r   c                 C   s   t | tkr?g }g }| D ].}t||\}}|r2|d \}}|d \}	}
||	kr2|	||
 f|d< |d= ||7 }||7 }q||fS t | tkr[t| dkrRtd| f | \}}t||S t| ttf sitd|  | g|t| fgfS )zsReturn (text list, attribute list) for tagmarkup passed.

    tm -- tagmarkup
    attr -- current attribute or Nonerv   r      z5Tuples must be in the form (attribute, tagmarkup): %rzInvalid markup element: %r)	r2   listr   rp   r?   r   r<   r   r   )r   rb   rtlralelementr   rg   	last_attrlast_runtop_attrtop_runr   r   r   r     s,   

r   c                 C   s*   t | tkot| dko| d ddkS )N   r   mouse)r2   rp   r?   findevr   r   r   is_mouse_event  s   *r   c                 C   s   |  ddkS )Npressr   )r   r   r   r   r   is_mouse_press     r   c                       s    e Zd ZdZ fddZ  ZS )	MetaSuperzadding .__superc                    sB   t t| ||| t| d| rtdt| d| t |  d S )Nz
_%s__superz/Class has same name as one of its super classes)superr   __init__hasattrAttributeErrorsetattr)clsnamebasesd	__class__r   r   r     s   zMetaSuper.__init__)r   r   r   __doc__r   __classcell__r   r   r   r   r     s    r   c                 C   s0   t | |d  d |d  }|d d }|| S )aW  
    Scale val in the range [0, val_range-1] to an integer in the range
    [0, out_range-1].  This implementation uses the "round-half-up" rounding
    method.

    >>> "%x" % int_scale(0x7, 0x10, 0x10000)
    '7777'
    >>> "%x" % int_scale(0x5f, 0x100, 0x10)
    '6'
    >>> int_scale(2, 6, 101)
    40
    >>> int_scale(1, 3, 4)
    2
    r	   r   )int)val	val_range	out_rangenumdemr   r   r   	int_scale  s   r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	StoppingContextzContext manager that calls ``stop`` on a given object on exit.  Used to
    make the ``start`` method on `MainLoop` and `BaseScreen` optionally act as
    context managers.
    c                 C   s
   || _ d S N)_wrapped)selfwrappedr   r   r   r     s   
zStoppingContext.__init__c                 C   s   | S r   r   )r   r   r   r   	__enter__  s   zStoppingContext.__enter__c                 G   s   | j   d S r   )r   stop)r   exc_infor   r   r   __exit__  r   zStoppingContext.__exit__N)r   r   r   r   r   r   r   r   r   r   r   r     s
    r   )/
__future__r   r   urwidr   urwid.compatr   r   r   r;   r'   rQ   
calc_widthis_wide_charmove_next_charmove_prev_charwithin_double_byter   localsr   r*   r)   r.   r0   rO   rP   r]   rh   r_   r^   rt   r`   r@   r{   r   r   	Exceptionr   r   r   r   r   r2   r   r   objectr   r   r   r   r   <module>   sP   
"	='
