
    ;OOf:I                         d dl mZmZ d dlmZmZmZmZmZm	Z	 d dl
mZmZmZmZ  G d d      Z G d de      Z G d d	e      Z e       Z G d
 d      Zd Zd Zd Zd Zd ZddZy)    )divisionprint_function)
calc_widthcalc_text_poscalc_trim_textis_wide_charmove_prev_charmove_next_char)bytesPYTHON3Bxrangec                       e Zd Zd Zd Zd Zy)
TextLayoutc                      y)z/Return True if align is a supported align mode.T selfaligns     R/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/urwid/text_layout.pysupports_align_modezTextLayout.supports_align_mode           c                      y)z-Return True if wrap is a supported wrap mode.Tr   r   wraps     r   supports_wrap_modezTextLayout.supports_wrap_mode!   r   r   c                     t        d      )a  
        Return a layout structure for text.

        :param text: string in current encoding or unicode string
        :param width: number of screen columns available
        :param align: align mode for text
        :param wrap: wrap mode for text

        Layout structure is a list of line layouts, one per output line.
        Line layouts are lists than may contain the following tuples:

        * (column width of text segment, start offset, end offset)
        * (number of space characters to insert, offset or None)
        * (column width of insert text, offset, "insert text")

        The offset in the last two tuples is used to determine the
        attribute used for the inserted spaces or text respectively.
        The attribute used will be the same as the attribute at that
        text offset.  If the offset is None when inserting spaces
        then no attribute will be used.
        zVThis function must be overridden by a real text layout class. (see StandardTextLayout))NotImplementedError)r   textwidthr   r   s        r   layoutzTextLayout.layout$   s    , " #; < 	<r   N)__name__
__module____qualname__r   r   r"   r   r   r   r   r      s    <r   r   c                       e Zd Zy)CanNotDisplayTextN)r#   r$   r%   r   r   r   r'   r'   =   s    r   r'   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	StandardTextLayoutc                      y )Nr   )r   s    r   __init__zStandardTextLayout.__init__A   s    r   c                 
    |dv S )z4Return True if align is 'left', 'center' or 'right'.)leftcenterrightr   r   s     r   r   z&StandardTextLayout.supports_align_modeL   s    333r   c                 
    |dv S )z<Return True if wrap is 'any', 'space', 'clip' or 'ellipsis'.)anyspaceclipellipsisr   r   s     r   r   z%StandardTextLayout.supports_wrap_modeO   s    ;;;r   c                 x    	 | j                  |||      }| j                  |||||      S # t        $ r g gcY S w xY w)z#Return a layout structure for text.)calculate_text_segmentsalign_layoutr'   )r   r    r!   r   r   segss         r   r"   zStandardTextLayout.layoutR   sJ    	//udDD$$dE4uFF  	4K	s   '* 99c                     d}|sJ dt        |      z          |D ]"  }t        |      }||k\  r|c S t        ||      }$ |S )z
        Return a minimal maxcol value that would result in the same
        number of lines for layout.  layout must be a layout structure
        returned by self.layout().
        r   zhuh? empty layout?: )repr
line_widthmax)r   maxcolr"   maxwidthllws         r   packzStandardTextLayout.packZ   sW     :-d6l::v 	)AABV|8R(H		)
 r   c                     g }|D ]p  }t        |      }||k(  s|dk(  r|j                  |       *|dk(  r|j                  ||z
  dfg|z          J|dk(  sJ |j                  ||z
  dz   dz  dfg|z          r |S )z-Convert the layout segs to an aligned layout.r-   r/   Nr.         )r;   append)	r   r    r!   r8   r   r   outr?   scs	            r   r7   zStandardTextLayout.align_layouti   s     
	8AABU{eVm

1

U2Xt,-12H$$$JJ%(1**D12Q67
	8 
r   c                    d\  }}}t         r1t        |t              r!t        |      }t	        |      }t	        |      }g }d}|dv r|t        |      k  r|j                  ||      }	|	dk(  rt        |      }	t        |||	      }
|dk(  r5|
|kD  r0d}t        |||	d|dz
        \  }}}}|dk(  sJ ||k(  sJ |dz
  |z
  }
nd}|	}d}g }||k7  r	||
||fgz  }|r|d|d	j                  d
      fgz  }|||fgz  }|j                  |       |	dz   }|t        |      k  r|S |t        |      k  r|j                  ||      }	|	dk(  rt        |      }	t        |||	      }
|
dk(  r|j                  d|	fg       |	dz   }]|
|k  r|j                  |
||	fd|	fg       |	dz   }t        |||	|      \  }}
||k(  rt        d      |dk(  r|j                  |
||fg       |}|dk(  sJ ||   |k(  r|j                  |
||fd|fg       |dz   }t        ||      r|j                  |
||fg       |}|}||kD  rt        |||      }||   |k(  r8t        |||      }
d|fg}||k7  r	|
||fg|z   }|j                  |       |dz   }n7t        ||      r2t        |||      }t        |||      }
|j                  |
||fg       |}n||kD  r|rt        |d         dk(  s%t        |d         dk(  rt        |d   d         dk(  rt        |d         dk(  r|d   \  \  }}d}|x}}n|d   \  \  }}}\  }}||k  rn|dk(  ri||   |k(  ra|d= |}t        |||	|      \  }}
|j                  |
||fg       |}|t        |      k  r$||   ||fv r|d   j                  d|f       |dz  }|j                  |
||fg       |}|t        |      k  r|S )a:  
        Calculate the segments of text to display given width screen
        columns to display them.

        text - unicode text or byte string to display
        width - number of available screen columns
        wrap - wrapping mode used

        Returns a layout structure without alignment applied.
        )
rI    r   )r3   r4   r4   TrC   Fu   …zutf-8z-Wide character will not fit in 1-column widthr1   r2   rD   )r   
isinstancer   r   ordlenfindr   r   encoderE   r   r'   r   r	   r
   )r   r    r!   r   nlnl_osp_obpn_crrG   trimmedsposn_endpad_left	pad_rightr?   posprevnexth_sch_offp_scp_offp_ends                            r   r6   z*StandardTextLayout.calculate_text_segmentsz   s    )D$z$.2Bt9Dt9D''SY,yyQ'2:t9Da. :%"u*"G7EdAtUVX]^_X_7`4D%9 $q=(=19$9Y.B#G E !Ie82q%.))A1eV]]7%;<==Ay'((F7 SY,8 H Tl99R#Drz4yD!T*BQw1T($FU{2a+tH  F#T1dE;GCax'CE Eu}2a*&7?"?CyD 2a*sG  ED#&2a*&D(%dAt4:%#D40BD
A$w 4[MA-HHQKQAT*)$c:D#D40BHHr!Dk]+A! (( #ae*/s1R5z1}"aM1,1R5zQ*+B%$ (-- 12".-$u,euqUt+bE!"/ !T5#3R2a*.s4y= Gd|3bELL!A/FA  2a*&w Tlx r   N)
r#   r$   r%   r+   r   r   r"   rA   r7   r6   r   r   r   r)   r)   @   s&    4<"Or   r)   c                       e Zd Zd Zd Zy)LayoutSegmentc                 p   t        |      t        k(  sJ t        |             t        |      dv sJ t        |             |dd \  | _        | _        t        | j                        t        k(  sJ t        | j                               t        |      dk(  rt        | j
                        t        k(  sJ t        | j
                               | j                  dkD  sJ t        |             |d   }t        |      t        k(  r|| _        d| _	        yt        |      t        k(  sJ t        |             d| _        || _	        yt        |      dk(  sJ t        |             | j
                  =| j                  dk\  sJ t        |             t        | j
                        t        k(  sJ dx| _        | _	        y)z0Create object from line layout segment structure)rD      NrD   rg   r   )
typetupler:   rN   rG   offsintr   r    end)r   segts      r   r+   zLayoutSegment.__init__  sb    CyE!,49,!3x5 +$s)+  !WDGG}#2T$'']2#s8Q;		?c):4		?:)77Q;)S	);AAAw%	Aw#~.tAw.~ 	s8q=+$s)+=yy$ww!|.T#Y.|DII+++#''DIr   c                    |dk  rd}|| j                   kD  r| j                   }||k\  rg S | j                  rt        | j                  dt        | j                        ||      \  }}}}||z
  | j                  t               j                  |      | j                  || z   t               j                  |      z   fgS | j                  rvt        || j                  | j                  ||      \  }}}}g }|r|j                  d|dz
  f       |j                  ||z
  |z
  |z
  ||f       |r|j                  d|f       |S ||z
  | j                  fgS )a2  
        Return a "sub-segment" list containing segment structures
        that make up a portion of this segment.

        A list is returned to handle cases where wide characters
        need to be replaced with a space character at either edge
        so two or three segments will be returned.
        r   rC   )	rG   r    r   rN   rj   r   ljustrl   rE   )	r   r    startrl   rX   eposrZ   r[   r?   s	            r   subsegzLayoutSegment.subseg0  sL    19ae=#C<I99.<		1c$))neS/;+D$)%iEGMM(,C		$t$-%',w}}Y'?-@ A C CXX.<dii5#/8+D$)A!DF$HHc%i(2D$?@!D"H Ytyy)**r   N)r#   r$   r%   r+   rs   r   r   r   re   re     s    (8 +r   re   c                 r    d}| }| r!t        | d         dk(  r| d   d   dk(  r| dd }|D ]
  }||d   z  } |S )z
    Return the screen column width of one line of a text layout structure.

    This function ignores any existing shift applied to the line,
    represented by an (amount, None) tuple at the start of the line.
    r   rD   rC   N)rN   )r8   rG   seglistss       r   r;   r;   S  sZ     
BGDGaDGAJ$4qr( 
ad
Ir   c                     t        |      t        k(  sJ t        |             | r9t        | d         dk(  r(| d   d   dk(  r|| d   d   z  }|r|dfg| dd z   S | dd S |r|dfg| z   S | S )z
    Return a shifted line from a layout structure to the left or right.
    segs -- line of a layout structure
    amount -- screen columns to shift right (+ve) or left (-ve)
    r   rD   rC   N)rh   rk   r:   rN   )r8   amounts     r   
shift_linery   b  s     <*d6l*DGaDGAJ$4$q'!*DM?48++ABxt##Kr   c                 v   g }d}| D ]  }|d   }|s|dk  rY||k\  r||z  }||z  }t        |      }||z   |k\  r|j                  ||||z
        c S ||j                  |||      z  }d}||z  }h||k\  r |S ||z   |kD  r't        |      }||j                  |d||z
        z  } |S |j                  |        |S )z
    Return a trimmed line of a text layout structure.
    text -- text to which this layout structure applies
    start -- starting screen column
    end -- ending screen column
    r   )re   rs   rE   )	r8   r    rq   rl   r?   xrm   rG   rv   s	            r   	trim_liner|   v  s     	A	A VBF{Rc"Ats{xxuc!e554,,AEGA8 H R4#:c"A4CE++AH 	
#+, Hr   c                 ~   d}d}d}|dk(  r-|D ]'  }t        |      }|j                  |j                  c S  y|dk(  rp|D ]  }t        |      }|j                  |} |}|y|j                  |j                  S t        | |j                  |j                  |j                  dz
        d   S |D ]  }t        |      }|j                  |j                  Z||k  r<|||j                  z   k  r*t        | |j                  |j                  ||z
        d   c S ||k  r||j                  z   dz
  }|}|t        ||z
        t        ||z
        k  r|}|j                  }||kD  r n||j                  z  } |t        |      t        k(  r|S |}t        | |j                  |j                  |j                  dz
        d   S )z
    Calculate the closest linear position to pref_col given a
    line layout structure.  Returns None if no position found.
    Nr   r-   r/   rC   )re   rj   rl   r   rG   absrh   rk   )r    line_layoutpref_col
closest_scclosest_pos
current_scrm   rv   s           r   calc_line_posr     s   
 JKJ6 	Cc"Avv!vv	 		W	 	 Cc"Avv!	  955=66MdAFFAEE1446:1== #66uu (*zADD00($ :-0013 3  8+!+add!2Q!6J"#K!s8J+>'?(:-.(/ (
ffJ&add
-0 d;/36 	A$qttAv6q99r   c                    |dk  s|t        |      k\  rt        d      t        | ||   |      }||S t        t	        |dz
  dd            }t        t	        |dz   t        |                  }|rU|rS|r%|j                  d      }t        | ||   |      }||S |r%|j                  d      }t        | ||   |      }||S |r|rSy)za
    Calculate the closest linear position to pref_col and row given a
    layout structure.
    r   z&calculate_pos: out of layout row rangerC   rK   )rN   	Exceptionr   listr   pop)r    r"   r   rowr\   
rows_above
rows_belowrs           r   calc_posr     s     Qw#V$@AA
vc{H
6C

fSU2b)*JfSU3v;/0J
q!AfQi:Cs
q!AfQi:Cs
  r   c                 "   d}d}|D ]  }d}|D ]  }t        |      }	|	j                  ||	j                  z  }*|	j                  |k(  r||fc c S |	j                  @|	j                  |k  r1|	j                  |kD  r"|t	        | |	j                  |      z  }||fc c S t        |	j                  |z
        }
|	j                  !|	j                  |k  r||	j                  dz
  z
  }
||
|d   k  r|
||ff}||	j                  z  } |dz  } |r|d   S y)z
    Calculate the coordinates closest to position pos in text with layout.

    text -- raw string or unicode string
    layout -- layout structure applied to text
    pos -- integer position into text
    clamp -- ignored right now
    Nr   rC   )r   r   )re   rj   rG   rl   r   r~   )r    r"   r\   clampclosestyr   r{   rm   rv   distances              r   calc_coordsr     s$    G	A  	Cc"Avv~QTT	vv}s
uu QVVS[QUU3YZqvvs44s
166C<(Huu QUU3Y!%%'?(WQZ"7"QqE/IA	  	
Q%( qzr   N)rC   )
__future__r   r   
urwid.utilr   r   r   r   r	   r
   urwid.compatr   r   r   r   r   r   r'   r)   default_layoutre   r;   ry   r|   r   r   r   r   r   r   <module>r      su   . 0# # 2 2< <@		 	I I^ $%=+ =+@(F8:t6!r   