o
    1cl]                     @   s  d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZmZmZmZmZmZmZmZmZmZ ddlmZmZmZmZ dd	lmZmZ dd
lmZ er\ddlm Z m!Z!m"Z" edZ#G dd deZ$eee$ ee$e%f ee$e%e%f f Z&e G dd deZ'G dd dZ(G dd dZ)e*dkre*dkrd dl+m Z  d dl,m-Z- d dl.m/Z/ dZ0e/1dZ2e  Ze3d e4d e4d e4e-e0ddd  e4  e4d! e5e6e2Z7e4e7 e4  e4d" e4e2 e4d# d$S d$S d$S )%    )IntEnum)	lru_cache)filterfalse)	getLogger)
attrgetter)
TYPE_CHECKINGDictIterableList
NamedTupleOptionalSequenceTupleTypeUnion   )_is_single_cell_widthscell_lenget_character_cell_sizeset_cell_size)Result	rich_repr)Style)ConsoleConsoleOptionsRenderResultrichc                   @   sL   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdS )ControlTypezDNon-printable control codes which typically translate to ANSI codes.r                        	   
                  N)__name__
__module____qualname____doc__ZBELLZCARRIAGE_RETURNHOMEZCLEARZSHOW_CURSORZHIDE_CURSORZENABLE_ALT_SCREENZDISABLE_ALT_SCREENZ	CURSOR_UPZCURSOR_DOWNZCURSOR_FORWARDZCURSOR_BACKWARDZCURSOR_MOVE_TO_COLUMNZCURSOR_MOVE_TOZERASE_IN_LINE r1   r1   Q/var/www/html/django/env/lib/python3.10/site-packages/pip/_vendor/rich/segment.pyr   "   s"    r   c                   @   s  e Zd ZU dZdZeed< 	 dZee	 ed< 	 dZ
eee  ed< 	 defdd	Zdefd
dZedefddZedefddZeeddd deded fddZdeded fddZedIddZe		dJded  dee	 dee	 ded  fddZe	dKded  deded  fd d!Zeded  deed   fd"d#Ze		$	$dLded  d%edee	 d&ed'edeed   fd(d)Z e		$dMd*ed  d%edee	 d&eded  f
d+d,Z!ed*ed  defd-d.Z"ed/eed   deeef fd0d1Z#e			dNd/eed   d2ed3ee dee	 d4edeed   fd5d6Z$e	dKd7e%d  d/eed   d2ed3ede	d4edeed   fd8d9Z&e	dKd7e%d  d/eed   d2ed3ede	d4edeed   fd:d;Z'e	dKd7e%d  d/eed   d2ed3ede	d4edeed   fd<d=Z(eded  ded  fd>d?Z)eded  ded  fd@dAZ*eded  ded  fdBdCZ+eded  ded  fdDdEZ,eded  dFee deed   fdGdHZ-dS )OSegmenta  A piece of text with associated style. Segments are produced by the Console render process and
    are ultimately converted in to strings to be written to the terminal.

    Args:
        text (str): A piece of text.
        style (:class:`~rich.style.Style`, optional): An optional style to apply to the text.
        control (Tuple[ControlCode..], optional): Optional sequence of control codes.
     textNstylecontrolreturnc                 c   sB    | j V  | jd u r| jd ur| jV  d S d S | jV  | jV  d S N)r5   r7   r6   selfr1   r1   r2   __rich_repr__M   s   

zSegment.__rich_repr__c                 C   s
   t | jS )z#Check if the segment contains text.)boolr5   r:   r1   r1   r2   __bool__V   s   
zSegment.__bool__c                 C   s   | j rdS t| jS )zGet cell length of segment.r   )r7   r   r5   r:   r1   r1   r2   cell_lengthZ   s   zSegment.cell_lengthc                 C   s
   | j duS )z,Check if the segment contains control codes.N)r7   r:   r1   r1   r2   
is_control_   s   
zSegment.is_controli @  segmentcut)r3   r3   c                 C   s,  |\}}}t }|j}||kr||d||fS t}t|| t| }	|d |	 }
t|
}||kr@||
|||||	d  ||fS |	t|k r||	 }|	d7 }	|||7 }|d |	 }
||krn||
|||||	d  ||fS ||kr||
d |	d  d |||d||	d   ||fS |	t|k sFd S d S )Nr4   r    )r3   r?   r   intlenr   )clsrA   rB   r5   r6   r7   _Segmentr?   Z	cell_sizeposbeforeZcell_poscharr1   r1   r2   _split_cellsd   s6   


zSegment._split_cellsc                 C   sb   | \}}}t |r+|t|kr| td||fS t|d| ||t||d ||fS | | |S )a0  Split segment in to two segments at the specified column.

        If the cut point falls in the middle of a 2-cell wide character then it is replaced
        by two spaces, to preserve the display width of the parent segment.

        Returns:
            Tuple[Segment, Segment]: Two segments.
        r4   N)r   rE   r3   rK   )r;   rB   r5   r6   r7   r1   r1   r2   split_cells   s   
	zSegment.split_cellsc                 C   s   | dS )zMake a new line segment.
r1   )rF   r1   r1   r2   line   s   zSegment.linesegments
post_stylec                    s>   |}|r|j   fdd|D }rfdd|D }|S )a  Apply style(s) to an iterable of segments.

        Returns an iterable of segments where the style is replaced by ``style + segment.style + post_style``.

        Args:
            segments (Iterable[Segment]): Segments to process.
            style (Style, optional): Base style. Defaults to None.
            post_style (Style, optional): Style to apply on top of segment style. Defaults to None.

        Returns:
            Iterable[Segments]: A new iterable of segments (possibly the same iterable).
        c                 3   s.    | ]\}}}||rd n ||V  qd S r9   r1   .0r5   _styler7   )applyrF   r1   r2   	<genexpr>   s
    
z&Segment.apply_style.<locals>.<genexpr>c                 3   s6    | ]\}}} ||rd n|r| n|V  qd S r9   r1   rQ   )rF   rP   r1   r2   rU      s    

)__add__)rF   rO   r6   rP   Zresult_segmentsr1   )rT   rF   rP   r2   apply_style   s   
zSegment.apply_styleFr@   c                 C   s    |r	t td|S ttd|S )a2  Filter segments by ``is_control`` attribute.

        Args:
            segments (Iterable[Segment]): An iterable of Segment instances.
            is_control (bool, optional): is_control flag to match in search.

        Returns:
            Iterable[Segment]: And iterable of Segment instances.

        r7   )filterr   r   )rF   rO   r@   r1   r1   r2   filter_control   s   zSegment.filter_controlc           
      c   s    g }|j }|D ]3}d|jv r7|js7|\}}}|r6|d\}}	}|r*|| || |	r4|V  g }|j }|sq|| q|rC|V  dS dS )a   Split a sequence of segments in to a list of lines.

        Args:
            segments (Iterable[Segment]): Segments potentially containing line feeds.

        Yields:
            Iterable[List[Segment]]: Iterable of segment lists, one per line.
        rM   N)appendr5   r7   	partition)
rF   rO   rN   rZ   rA   r5   r6   __textnew_liner1   r1   r2   split_lines   s(   


	
zSegment.split_linesTlengthpadinclude_new_linesc                 c   s    g }|j }| j}| d}	|D ]B}
d|
jv rM|
jsM|
\}}}|rL|d\}}}|r1|| || |rJ|||||d}|rB| |	 |V  |dd= |s q||
 q|r_|||||dV  dS dS )a  Split segments in to lines, and crop lines greater than a given length.

        Args:
            segments (Iterable[Segment]): An iterable of segments, probably
                generated from console.render.
            length (int): Desired line length.
            style (Style, optional): Style to use for any padding.
            pad (bool): Enable padding of lines that are less than `length`.

        Returns:
            Iterable[List[Segment]]: An iterable of lines of segments.
        rM   )r6   ra   N)rZ   adjust_line_lengthr5   r7   r[   )rF   rO   r`   r6   ra   rb   rN   rZ   rc   Znew_line_segmentrA   r5   r\   r]   r^   Zcropped_liner1   r1   r2   split_and_crop_lines   s4   



zSegment.split_and_crop_linesrN   c                 C   s   t dd |D }||k r%|r|| d||  |g }|S |dd }|S ||krag }|j}d}|D ],}|j}	||	 |k s@|jrI|| ||	7 }q2|\}
}}t|
|| }
|| |
|  |S |S |dd }|S )a  Adjust a line to a given width (cropping or padding as required).

        Args:
            segments (Iterable[Segment]): A list of segments in a single line.
            length (int): The desired width of the line.
            style (Style, optional): The style of padding if used (space on the end). Defaults to None.
            pad (bool, optional): Pad lines with spaces if they are shorter than `length`. Defaults to True.

        Returns:
            List[Segment]: A line of segments with the desired length.
        c                 s   s    | ]}|j V  qd S r9   )r?   rR   rA   r1   r1   r2   rU   @  s    z-Segment.adjust_line_length.<locals>.<genexpr>rC   Nr   )sumrZ   r?   r7   r   )rF   rN   r`   r6   ra   Zline_lengthr^   rZ   rA   Zsegment_lengthr5   Zsegment_styler\   r1   r1   r2   rc   -  s.   

zSegment.adjust_line_lengthc                    s   t  t fdd|D S )zGet the length of list of segments.

        Args:
            line (List[Segment]): A line encoded as a list of Segments (assumes no '\\n' characters),

        Returns:
            int: The length of the line.
        c                 3   s    | ]} |j V  qd S r9   )r5   re   Z	_cell_lenr1   r2   rU   e  s    z*Segment.get_line_length.<locals>.<genexpr>)r   rf   )rF   rN   r1   rg   r2   get_line_lengthZ  s   
zSegment.get_line_lengthlinesc                    s0   | j  |rt fdd|D nd}|t|fS )zGet the shape (enclosing rectangle) of a list of lines.

        Args:
            lines (List[List[Segment]]): A list of lines (no '\\n' characters).

        Returns:
            Tuple[int, int]: Width and height in characters.
        c                 3   s    | ]} |V  qd S r9   r1   rR   rN   rh   r1   r2   rU   r  s    z$Segment.get_shape.<locals>.<genexpr>r   )rh   maxrE   )rF   ri   	max_widthr1   rk   r2   	get_shapeg  s   
zSegment.get_shapewidthheight	new_linesc           	         s   |pt |}|r| d d gn| d g}| j |d| } fdd|D |dd< t ||k rD||g|t |   |S )a  Set the shape of a list of lines (enclosing rectangle).

        Args:
            lines (List[List[Segment]]): A list of lines.
            width (int): Desired width.
            height (int, optional): Desired height or None for no change.
            style (Style, optional): Style of any padding added.
            new_lines (bool, optional): Padded lines should include "
". Defaults to False.

        Returns:
            List[List[Segment]]: New list of lines.
        rC   rM   Nc                    s   g | ]	} |d qS ))r6   r1   rj   rc   r6   ro   r1   r2   
<listcomp>  s    z%Segment.set_shape.<locals>.<listcomp>)rE   rc   extend)	rF   ri   ro   rp   r6   rq   _heightblankZshaped_linesr1   rr   r2   	set_shapeu  s   &zSegment.set_shaperF   c                 C   s`   |t | }|s|dd S |d| }|r| d| d |n| d| |}||gg|  }|S )a  Aligns lines to top (adds extra lines to bottom as required).

        Args:
            lines (List[List[Segment]]): A list of lines.
            width (int): Desired width.
            height (int, optional): Desired height or None for no change.
            style (Style): Style of any padding added.
            new_lines (bool, optional): Padded lines should include "
". Defaults to False.

        Returns:
            List[List[Segment]]: New list of lines.
        NrC   rM   rE   rF   ri   ro   rp   r6   rq   extra_linesrv   r1   r1   r2   	align_top     $zSegment.align_topc                 C   s`   |t | }|s|dd S |d| }|r| d| d |n| d| |}|gg| | }|S )a  Aligns render to bottom (adds extra lines above as required).

        Args:
            lines (List[List[Segment]]): A list of lines.
            width (int): Desired width.
            height (int, optional): Desired height or None for no change.
            style (Style): Style of any padding added. Defaults to None.
            new_lines (bool, optional): Padded lines should include "
". Defaults to False.

        Returns:
            List[List[Segment]]: New list of lines.
        NrC   rM   rx   ry   r1   r1   r2   align_bottom  r|   zSegment.align_bottomc           
      C   s|   |t | }|s|dd S |d| }|r| d| d |n| d| |}|d }|| }	|gg| | |gg|	  }|S )a  Aligns lines to middle (adds extra lines to above and below as required).

        Args:
            lines (List[List[Segment]]): A list of lines.
            width (int): Desired width.
            height (int, optional): Desired height or None for no change.
            style (Style): Style of any padding added.
            new_lines (bool, optional): Padded lines should include "
". Defaults to False.

        Returns:
            List[List[Segment]]: New list of lines.
        NrC   rM   r   rx   )
rF   ri   ro   rp   r6   rq   rz   rv   Z	top_linesZbottom_linesr1   r1   r2   align_middle  s   $zSegment.align_middlec                 c   sv    t |}zt|}W n
 ty   Y dS w t}|D ]}|j|jkr0|js0||j|j |j}q|V  |}q|V  dS )a)  Simplify an iterable of segments by combining contiguous segments with the same style.

        Args:
            segments (Iterable[Segment]): An iterable of segments.

        Returns:
            Iterable[Segment]: A possibly smaller iterable of segments that will render the same way.
        N)iternextStopIterationr3   r6   r7   r5   )rF   rO   Ziter_segmentsZlast_segmentrG   rA   r1   r1   r2   simplify  s    

zSegment.simplifyc                 c   sL    |D ] }|j s|jdu r|V  q|\}}}| ||r|dndV  qdS )zRemove all links from an iterable of styles.

        Args:
            segments (Iterable[Segment]): An iterable segments.

        Yields:
            Segment: Segments with link removed.
        N)r7   r6   update_link)rF   rO   rA   r5   r6   _controlr1   r1   r2   strip_links  s   

zSegment.strip_linksc                 c   s$    |D ]\}}}| |d|V  qdS )zRemove all styles from an iterable of segments.

        Args:
            segments (Iterable[Segment]): An iterable segments.

        Yields:
            Segment: Segments with styles replace with None
        Nr1   )rF   rO   r5   rS   r7   r1   r1   r2   strip_styles  s   
zSegment.strip_stylesc                 c   s\    i }|D ]&\}}}|r$| |}|du r|j}|||< | |||V  q| |d|V  qdS )zRemove all color from an iterable of segments.

        Args:
            segments (Iterable[Segment]): An iterable segments.

        Yields:
            Segment: Segments with colorless style.
        N)getwithout_color)rF   rO   cacher5   r6   r7   Zcolorless_styler1   r1   r2   remove_color+  s   
zSegment.remove_colorcutsc                 c   s   g }|j }t|}	 zt|}W n ty   g  Y S w |dkr"ng V  qd}|D ]}|jr||j }	|	|k r?|| |	}nzi|	|krr|| |dd V  |dd= |	}W zt|}W q* tyq   |rm|dd V  Y  dS w ||| \}
}||
 |dd V  |dd= |}W zt|}W n3 ty   |r|dd V  Y  dS w zt|}W w  ty   |r|dd V  Y    Y  dS w |js/q*|dd V  dS )zDivides an iterable of segments in to portions.

        Args:
            cuts (Iterable[int]): Cell positions where to divide.

        Yields:
            [Iterable[List[Segment]]]: An iterable of Segments in List.
        Tr   N)rZ   r   r   r   r5   r?   rL   )rF   rO   r   Zsplit_segmentsZadd_segmentZ	iter_cutsrB   rH   rA   Zend_posrI   r1   r1   r2   divideA  st   


zSegment.divide)r8   r3   )NNF)NTT)NT)NNF).r,   r-   r.   r/   r5   str__annotations__r6   r   r   r7   r   ControlCoder   r<   r=   r>   propertyrD   r?   r@   classmethodr   r   rK   rL   rN   r	   rW   rY   r
   r_   rd   rc   rh   rn   rw   r   r{   r}   r~   r   r   r   r   r   r1   r1   r1   r2   r3   ;   sD  
 		$( 
.,$

#






r3   c                   @   sB   e Zd ZdZddee deddfddZ			
				dddZdS )Segmentsa=  A simple renderable to render an iterable of segments. This class may be useful if
    you want to print segments outside of a __rich_console__ method.

    Args:
        segments (Iterable[Segment]): An iterable of segments.
        new_lines (bool, optional): Add new lines between segments. Defaults to False.
    FrO   rq   r8   Nc                 C   s   t || _|| _d S r9   )listrO   rq   )r;   rO   rq   r1   r1   r2   __init__  s   

zSegments.__init__consoler   optionsr   r   c                 c   s<    | j rt }| jD ]}|V  |V  qd S | jE d H  d S r9   )rq   r3   rN   rO   )r;   r   r   rN   rA   r1   r1   r2   __rich_console__  s   
zSegments.__rich_console__r   r   r   r   r   r8   r   )	r,   r-   r.   r/   r	   r3   r=   r   r   r1   r1   r1   r2   r   {  s    r   c                   @   sB   e Zd Zddeee  deddfddZ				
			dddZdS )SegmentLinesFri   rq   r8   Nc                 C   s   t || _|| _dS )a=  A simple renderable containing a number of lines of segments. May be used as an intermediate
        in rendering process.

        Args:
            lines (Iterable[List[Segment]]): Lists of segments forming lines.
            new_lines (bool, optional): Insert new lines after each line. Defaults to False.
        N)r   ri   rq   )r;   ri   rq   r1   r1   r2   r     s   

zSegmentLines.__init__r   r   r   r   r   c                 c   sJ    | j rt }| jD ]
}|E d H  |V  qd S | jD ]}|E d H  qd S r9   )rq   r3   rN   ri   )r;   r   r   r^   rN   r1   r1   r2   r     s   


zSegmentLines.__rich_console__r   r   )	r,   r-   r.   r	   r
   r3   r=   r   r   r1   r1   r1   r2   r     s     r   __main__)r   )Syntax)Textzfrom rich.console import Console
    console = Console()
    text = Text.from_markup("Hello, [bold magenta]World[/]!")
    console.print(text)zHello, [bold magenta]World[/]!zrich.Segmentz]A Segment is the last step in the Rich render process before generating text with ANSI codes.z
Consider the following code:
pythonT)Zline_numberszVWhen you call [b]print()[/b], Rich [i]renders[/i] the object in to the the following:
zAThe Segments are then processed to produce the following output:
zS
You will only need to know this if you are implementing your own Rich renderables.N)8enumr   	functoolsr   	itertoolsr   loggingr   operatorr   typingr   r   r	   r
   r   r   r   r   r   r   cellsr   r   r   r   reprr   r   r6   r   r   r   r   r   logr   rD   r   r3   r   r   r,   pip._vendor.rich.consoleZpip._vendor.rich.syntaxr   pip._vendor.rich.textr   codefrom_markupr5   ruleprintr   render	fragmentsr1   r1   r1   r2   <module>   sl    0    C




