U
    oufY                     @  s  d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	m
Z
mZmZmZ ddlmZ ddlmZ ddlmZ ddlmZmZ dd	lmZ d
dlmZ d
dlmZ dgZddddddddddddddddddZd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0dZd1d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAZe ee eks8t!e ee eksNt!e ee eksdt!dWdCdCdCdDdEdFdGdHZ"ee#e$f Z%G dIdJ dJZ&G dKdL dLeee#e#e#f e#f Z'e&dMdNZ(e&dOdNZ)e' Z*G dPdQ dQeee$f Z+dCdRdSdTdUZ,G dVd deZ-dS )Xz
Output for vt100 terminals.

A lot of thanks, regarding outputting of colors, goes to the Pygments project:
(We don't rely on Pygments anymore, because many things are very custom, and
everything has been highly optimized.)
http://pygments.org/
    )annotationsN)CallableDictHashableIterableSequenceTextIOTuple)CursorShape)Size)Output)ANSI_COLOR_NAMESAttrs)is_dumb_terminal   )
ColorDepth)flush_stdoutVt100_Output'             !   "   #   $   %   Z   [   \   ]   ^   _   `   a   )ansidefault	ansiblackansired	ansigreen
ansiyellowansiblueansimagentaansicyanansigrayansibrightblackansibrightredansibrightgreenansibrightyellowansibrightblueansibrightmagentaansibrightcyan	ansiwhite1   (   )   *   +   ,   -   .   /   d   e   f   g   h   i   j   k   r   r   r      rI   rI      rK   rK      rM   rM      r   r   r   rO   r   rO   rO   r   )r   r   rO   rO   r   rO   r   rO   rO   rM   r   r   r   rM   r   rM   rM   r   )r   r   rM   rM   r   rM   r   rM   rM   )r%   r&   r-   r.   r5   r'   r(   r)   r*   r+   r,   r/   r0   r1   r2   r3   r4    intSequence[str]str)rgbexcludereturnc                 C  s   t |}t| | t||  t||   }|dkrF|ddddg d}d}t D ]R\}\}}	}
|dkrV||krV| | d ||	 d  ||
 d  }||k rV|}|}qV|S )	z
    Find closest ANSI color. Return it by name.

    :param r: Red (Between 0 and 255.)
    :param g: Green (Between 0 and 255.)
    :param b: Blue (Between 0 and 255.)
    :param exclude: A tuple of color names to exclude. (E.g. ``('ansired', )``.)
    r   ZansilightgrayZansidarkgrayr5   r&    r%      )listabsextendANSI_COLORS_TO_RGBitems)r]   r^   r_   r`   Z
saturationdistancematchnamer2g2b2drY   rY   ?/tmp/pip-unpacked-wheel-8milen2s/prompt_toolkit/output/vt100.py_get_closest_ansi_colork   s    	$$rq   c                   @  sJ   e Zd ZdZddddddZdd	d
ddddZdd	d
ddddZdS )_16ColorCachez
    Cache which maps (r, g, b) tuples to 16 ansi colors.

    :param bg: Cache for background colors, instead of foreground.
    FboolNone)bgra   c                 C  s   || _ i | _d S N)ru   _cache)selfru   rY   rY   rp   __init__   s    z_16ColorCache.__init__rY   tuple[int, int, int]r[   _ColorCodeAndName)valuer`   ra   c                 C  s2   |t |f}| j}||kr*| ||||< || S )zx
        Return a (ansi_code, ansi_name) tuple. (E.g. ``(44, 'ansiblue')``.) for
        a given (r,g,b) value.
        )tuplerw   _get)rx   r|   r`   keycacherY   rY   rp   get_code   s
    z_16ColorCache.get_codec                 C  s:   |\}}}t ||||d}| jr*t| }nt| }||fS )Nr`   )rq   ru   BG_ANSI_COLORSFG_ANSI_COLORS)rx   r|   r`   r]   r^   r_   rj   coderY   rY   rp   r~      s    

z_16ColorCache._getN)F)rY   )rY   )__name__
__module____qualname____doc__ry   r   r~   rY   rY   rY   rp   rr      s     rr   c                   @  s.   e Zd ZdZddddZdddd	d
ZdS )_256ColorCachez:
    Cache which maps (r, g, b) tuples to 256 colors.
    rt   ra   c                 C  s(  g }| d | d | d | d | d | d | d | d | d	 | d
 | d | d | d | d | d | d d}tdD ]@}||d d  }||d d  }||d  }| |||f qtddD ] }d|d  }| |||f q|| _d S )NrG   rN   rP   rQ   )r   r      rR   rS   rH   rJ   rT   rU   rV   )r   r   rM   rW   rX   rL   )r   r"            rM      r      r         
   )appendrangecolors)rx   r   Z
valuerangeir]   r^   r_   vrY   rY   rp   ry      s6    















z_256ColorCache.__init__rz   rZ   )r|   ra   c                 C  st   |\}}}d}d}t | jD ]J\}\}}	}
|dkr|| d ||	 d  ||
 d  }||k r|}|}q|| |< |S )Nrb   r      rc   )	enumerater   )rx   r|   r]   r^   r_   ri   rj   r   rl   rm   rn   ro   rY   rY   rp   __missing__   s    
$z_256ColorCache.__missing__N)r   r   r   r   ry   r   rY   rY   rY   rp   r      s   &r   F)ru   Tc                   @  sR   e Zd ZdZdddddZddd	d
dZdddddZddddddZdS )_EscapeCodeCachez
    Cache for VT100 escape codes. It maps
    (fgcolor, bgcolor, bold, underline, strike, reverse) tuples to VT100
    escape sequences.

    :param true_color: When True, use 24bit colors instead of 256 colors.
    r   rt   )color_depthra   c                 C  s
   || _ d S rv   )r   )rx   r   rY   rY   rp   ry   	  s    z_EscapeCodeCache.__init__r   r\   )attrsra   c              	   C  s   |\	}}}}}}}}	}
g }| | |p(d|p.d |rB|d |rP|d |r^|d |rl|d |	rz|d |
r|d |r|d |rd	d
| d }nd}|| |< |S )N 1354789z[0;;m[0m)rf   _colors_to_coder   join)rx   r   ZfgcolorZbgcolorZboldZ	underlinestrikeZitalicZblinkreversehiddenpartsresultrY   rY   rp   r     s@    






z_EscapeCodeCache.__missing__rz   )colorra   c                 C  sT   zt |d}W n tk
r$    Y n,X |d? d@ }|d? d@ }|d@ }|||fS dS )z'Turn 'ffffff', into (0xff, 0xff, 0xff).r   rM   r   N)rZ   
ValueError)rx   r   rgbr]   r^   r_   rY   rY   rp   _color_name_to_rgb3  s    z#_EscapeCodeCache._color_name_to_rgbzIterable[str])fg_colorbg_colorra   c                   sN   ddddd fdd}g }| |d | | d	 tt|S )
zR
        Return a tuple with the vt100 values  that represent this color.
        r   r\   rs   z	list[int])r   ru   ra   c           
        s   |rt nt}| rjtjkr g S | |kr2||  gS z| }W n tk
rX   g  Y S X jtjkr|r krzg}ng }tj	||d\}}|gS t
	|\}}||gS nBjtjkr|\}}}	|rdndd|||	gS |rdnddt| gS d S )Nr   0   &   rc      )r   r   r   r   DEPTH_1_BITr   r   DEPTH_4_BIT_16_bg_colorsr   _16_fg_colorsDEPTH_24_BIT_256_colors)
r   ru   tabler   r`   r   rk   r]   r^   r_   r   Zfg_ansir   rx   rY   rp   getH  s.    


z-_EscapeCodeCache._colors_to_code.<locals>.getFT)rf   mapr\   )rx   r   r   r   r   rY   r   rp   r   ?  s    *z _EscapeCodeCache._colors_to_codeN)r   r   r   r   ry   r   r   r   rY   rY   rY   rp   r      s
   'r   ztuple[int, int])filenora   c                 C  s   t | }|j|jfS )zw
    Get the size of this pseudo terminal.

    :param fileno: stdout.fileno()
    :returns: A (rows, cols) tuple.
    )osget_terminal_sizelinescolumns)r   sizerY   rY   rp   	_get_sizey  s    
r   c                	   @  s`  e Zd ZU dZe Zded< dfdddd	d
d
ddddZedgddd	d
d dddZ	ddddZ
ddddZddddZdddddZddddd Zddd!d"d#Zddd$d%Zddd&d'Zddd(d)Zddd*d+Zddd,d-Zddd.d/Zddd0d1Zddd2d3Zddd4d5Zd6d7dd8d9d:Zddd;d<Zddd=d>Zddd?d@ZdddAdBZdddCdDZdhddddFdGdHZdddIdJdKZ dddIdLdMZ!dddIdNdOZ"dddIdPdQZ#dddRdSZ$dddTdUZ%dVddWdXdYZ&dddZd[Z'ddd\d]Z(ddd^d_Z)e*d
dd`daZ+dddbdcZ,d7ddddeZ-dS )ir   a  
    :param get_size: A callable which returns the `Size` of the output terminal.
    :param stdout: Any object with has a `write` and `flush` method + an 'encoding' property.
    :param term: The terminal environment variable. (xterm, xterm-256color, linux, ...)
    :param enable_cpr: When `True` (the default), send "cursor position
        request" escape sequences to the output in order to detect the cursor
        position. That way, we can properly determine how much space there is
        available for the UI (especially for drop down menus) to render. The
        `Renderer` will still try to figure out whether the current terminal
        does respond to CPR escapes. When `False`, never attempt to send CPR
        requests.
    zset[int]_fds_not_a_terminalNTr   zCallable[[], Size]z
str | NonezColorDepth | Noners   rt   )stdoutget_sizetermdefault_color_depthenable_bell
enable_cprra   c              	     s   t  fdddD stg | _ | _|| _|| _|| _|| _|| _t	j
tt	j
t	jtt	jt	jtt	jt	jtt	ji| _d| _d S )Nc                 3  s   | ]}t  |V  qd S rv   )hasattr).0ar   rY   rp   	<genexpr>  s     z(Vt100_Output.__init__.<locals>.<genexpr>)writeflushF)allAssertionError_bufferr   r   r   r   r   r   r   r   r   r   ZDEPTH_8_BITr   _escape_code_caches_cursor_shape_changed)rx   r   r   r   r   r   r   rY   r   rp   ry     s$    	    
zVt100_Output.__init__)r   r   r   r   ra   c                   s   z   }W n tjk
r&   d}Y nX   st|dksB|| jkrtd}tj||  tj  |dk	rt| j	| dd fdd}|  ||||dS )z
        Create an Output class from a pseudo terminal.
        (This will take the dimensions by reading the pseudo
        terminal attributes.)
        Nz+Warning: Output is not a terminal (fd=%r).
r   r   c                    sF   d\} }zt   \} }W n tk
r0   Y nX t| p:d|p@ddS )N)NN   P   Zrowsr   )r   r   OSErrorr   r   r   rY   rp   r     s    z'Vt100_Output.from_pty.<locals>.get_size)r   r   r   )
r   ioUnsupportedOperationisattyr   sysstderrr   r   add)clsr   r   r   r   fdmsgr   rY   r   rp   from_pty  s$    

zVt100_Output.from_ptyr   r   c                 C  s   |   S rv   )r   rx   rY   rY   rp   r     s    zVt100_Output.get_sizerZ   c                 C  s
   | j  S )zReturn file descriptor.)r   r   r   rY   rY   rp   r     s    zVt100_Output.filenor\   c                 C  s   | j jS )z Return encoding used for stdout.)r   encodingr   rY   rY   rp   r     s    zVt100_Output.encoding)datara   c                 C  s   | j | dS )z+
        Write raw data to output.
        N)r   r   rx   r   rY   rY   rp   	write_raw  s    zVt100_Output.write_rawc                 C  s   | j |dd dS )zn
        Write text to output.
        (Removes vt100 escape codes. -- used for safely writing text.)
        ?N)r   r   replacer   rY   rY   rp   r     s    zVt100_Output.write)titlera   c                 C  s,   | j dkr(| d|dddd  dS )z%
        Set terminal title.
        linuxzeterm-colorz]2;%sr   r   N)r   r   r   )rx   r   rY   rY   rp   	set_title  s    
zVt100_Output.set_titlec                 C  s   |  d d S )Nr   )r   r   rY   rY   rp   clear_title  s    zVt100_Output.clear_titlec                 C  s   |  d dS )zc
        Erases the screen with the background color and moves the cursor to
        home.
        z[2JNr   r   rY   rY   rp   erase_screen  s    zVt100_Output.erase_screenc                 C  s   |  d d S )Nz[?1049h[Hr   r   rY   rY   rp   enter_alternate_screen  s    z#Vt100_Output.enter_alternate_screenc                 C  s   |  d d S )Nz[?1049lr   r   rY   rY   rp   quit_alternate_screen  s    z"Vt100_Output.quit_alternate_screenc                 C  s,   |  d |  d |  d |  d d S )Nz[?1000hz[?1003hz[?1015hz[?1006hr   r   rY   rY   rp   enable_mouse_support  s    


z!Vt100_Output.enable_mouse_supportc                 C  s,   |  d |  d |  d |  d d S )Nz[?1000lz[?1015lz[?1006lz[?1003lr   r   rY   rY   rp   disable_mouse_support.  s    


z"Vt100_Output.disable_mouse_supportc                 C  s   |  d dS )zY
        Erases from the current cursor position to the end of the current line.
        z[KNr   r   rY   rY   rp   erase_end_of_line4  s    zVt100_Output.erase_end_of_linec                 C  s   |  d dS )zc
        Erases the screen from the current line down to the bottom of the
        screen.
        z[JNr   r   rY   rY   rp   
erase_down:  s    zVt100_Output.erase_downc                 C  s   |  d d S )Nr   r   r   rY   rY   rp   reset_attributesA  s    zVt100_Output.reset_attributesr   r   )r   r   ra   c                 C  s   | j | }| ||  dS )zW
        Create new style and output.

        :param attrs: `Attrs` instance.
        N)r   r   )rx   r   r   Zescape_code_cacherY   rY   rp   set_attributesD  s    
zVt100_Output.set_attributesc                 C  s   |  d d S )Nz[?7lr   r   rY   rY   rp   disable_autowrapP  s    zVt100_Output.disable_autowrapc                 C  s   |  d d S )Nz[?7hr   r   rY   rY   rp   enable_autowrapS  s    zVt100_Output.enable_autowrapc                 C  s   |  d d S )Nz[?2004hr   r   rY   rY   rp   enable_bracketed_pasteV  s    z#Vt100_Output.enable_bracketed_pastec                 C  s   |  d d S )Nz[?2004lr   r   rY   rY   rp   disable_bracketed_pasteY  s    z$Vt100_Output.disable_bracketed_pastec                 C  s   |  d dS )zh
        For vt100 only.
        Put the terminal in cursor mode (instead of application mode).
        z[?1lNr   r   rY   rY   rp   reset_cursor_key_mode\  s    z"Vt100_Output.reset_cursor_key_moder   )rowcolumnra   c                 C  s   |  d||f  dS )z'
        Move cursor position.
        z[%i;%iHNr   )rx   r
  r  rY   rY   rp   cursor_gotod  s    zVt100_Output.cursor_goto)amountra   c                 C  s0   |dkr
n"|dkr|  d n|  d|  d S )Nr   r   z[Az[%iAr   rx   r  rY   rY   rp   	cursor_upj  s
    zVt100_Output.cursor_upc                 C  s0   |dkr
n"|dkr|  d n|  d|  d S )Nr   r   z[Bz[%iBr   r  rY   rY   rp   cursor_downr  s
    zVt100_Output.cursor_downc                 C  s0   |dkr
n"|dkr|  d n|  d|  d S )Nr   r   z[Cz[%iCr   r  rY   rY   rp   cursor_forward|  s
    zVt100_Output.cursor_forwardc                 C  s0   |dkr
n"|dkr|  d n|  d|  d S )Nr   r   z[%iDr   r  rY   rY   rp   cursor_backward  s
    zVt100_Output.cursor_backwardc                 C  s   |  d d S )Nz[?25lr   r   rY   rY   rp   hide_cursor  s    zVt100_Output.hide_cursorc                 C  s   |  d d S )Nz[?12l[?25hr   r   rY   rY   rp   show_cursor  s    zVt100_Output.show_cursorr
   )cursor_shapera   c                 C  sN   |t jkrd S d| _| t jdt jdt jdt jdt jdt j	di
|d d S )	NTz[2 qz[6 qz[4 qz[1 qz[5 qz[3 qr   )r
   Z_NEVER_CHANGEr   r   ZBLOCKZBEAMZ	UNDERLINEZBLINKING_BLOCKZBLINKING_BEAMZBLINKING_UNDERLINEr   )rx   r  rY   rY   rp   set_cursor_shape  s*    
       zVt100_Output.set_cursor_shapec                 C  s   | j rd| _ | d dS )zReset cursor shape.Fz[0 qN)r   r   r   rY   rY   rp   reset_cursor_shape  s    zVt100_Output.reset_cursor_shapec                 C  s,   | j s
dS d| j }g | _ t| j| dS )z3
        Write to output stream and flush.
        Nr   )r   r   r   r   r   rY   rY   rp   r     s
    zVt100_Output.flushc                 C  s   |  d |   dS )z:
        Asks for a cursor position report (CPR).
        z[6nN)r   r   r   rY   rY   rp   ask_for_cpr  s    
zVt100_Output.ask_for_cprc                 C  sV   | j s
dS tjdddkr dS t| jr.dS z| j W S  tk
rP   Y dS X d S )NFZPROMPT_TOOLKIT_NO_CPRr   r   )	r   r   environr   r   r   r   r   r   r   rY   rY   rp   responds_to_cpr  s    
zVt100_Output.responds_to_cprc                 C  s   | j r| d |   dS )zSound bell.r   N)r   r   r   r   rY   rY   rp   bell  s    
zVt100_Output.bellc                 C  sF   | j dk	r| j S | j}|dkr$tjS t|r2tjS |dkr@tjS tjS )z
        Return the default color depth for a vt100 terminal, according to the
        our term value.

        We prefer 256 colors almost always, because this is what most terminals
        support these days, and is a good default.
        Nr   )r   r   r   DEFAULTr   r   r   )rx   r   rY   rY   rp   get_default_color_depth  s    
z$Vt100_Output.get_default_color_depth)NNTT)NNT)r   r   ).r   r   r   r   setr   __annotations__ry   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r	  r  r  r  r  r  r  r  r  r  r   r  propertyr  r  r  rY   rY   rY   rp   r     s`   
        4
	)rY   ).r   
__future__r   r   r   r   typingr   r   r   r   r   r   r	   Zprompt_toolkit.cursor_shapesr
   Zprompt_toolkit.data_structuresr   Zprompt_toolkit.outputr   Zprompt_toolkit.stylesr   r   Zprompt_toolkit.utilsr   r   r   r   __all__r   r   rg   r  r   rq   rZ   r\   r{   rr   r   r   r   r   r   r   r   rY   rY   rY   rp   <module>   s   $")"B

y