B
    Mt\D9                 @   s.  d Z ddlZddlZddlZddlZejd dkZejdkZddlm	Z	m
Z
 dZdZejdkryddlZW n: ek
r   yddlZdZW n ek
r   Y nX Y nX d	d
 Zdd Ze ZdddddddZdd Zd4ddZdd ZG dd deZG dd deZG dd deZer"eZddlZddlm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)ej*Z+G d'd( d(ej,Z-G d)d* d*ej,Z.G d+d, d,ej,Z/ej0j1j2Z3ej4ge3_5ej6e3_7d-d. Z2ej0j1j8Z8ej6ej9ge8_5ej:e8_7ej0j1j;Z<ej6e=e/ge<_5ej:e<_7d/d0 Z>d1d
 Zd2d3 Z?dS )5z8

Helper functions for writing to terminals and files.

    N   )r   r   )textbytesFwin32Tc              C   sl   t r dd l} |  }|j|jfS dd l}dd l}dd l}|d|j	d}|
d|d d \}}||fS d S )Nr      z        Zhhhh   )py33shutilget_terminal_sizelinescolumnstermiosfcntlstructZioctlZ
TIOCGWINSZZunpack)r	   sizer   r   r   ZcallZheightwidth r   4lib/python3.7/site-packages/py/_io/terminalwriter.py_getdimensions   s    r   c              C   sb   d} yt  \}} W n$ tjjk
r,    Y n   Y nX | dkrRttjdd} | dk r^d} | S )Nr   ZCOLUMNSP   (   )r   pybuiltinZ_sysexintosenvironget)r   _r   r   r   get_terminal_width'   s    r   r   r   )AFHNZNaWc             C   s   t d| } tdd | D S )NZNFCc             s   s    | ]}t t|d V  qdS )r   N)
char_widthr   unicodedataZeast_asian_width).0cr   r   r   	<genexpr>J   s    z!get_line_width.<locals>.<genexpr>)r%   Z	normalizesum)r   r   r   r   get_line_widthH   s    r*   c          
   C   s  |d krt j}|  } |r*t|ts*|f}|r\t jdkr\| r\ddd |D |  d } |rh| d7 } |rrtrr| rrd|krd}td	d |D }nd
}t	t
ttt
B ttt
B ttB t	t	d	}||t	}|r|tO }d}d}	|t jkrt|	}
nt|}
t|
j}||d@ O }t|
| x2t| dkrT|| d d  | dd  } q$W | rf||  t|
| n
||  |r|  d S )Nr    c             S   s   g | ]}d | qS )z[%smr   )r&   codr   r   r   
<listcomp>U   s    zansi_print.<locals>.<listcomp>z[0m
r   Tc             S   s   g | ]}|d kr|qS )r   r   )r&   xr   r   r   r-   ^   s    F)	r   )   )    )!   )"   )#   )$   )%   )'   ii   i   )sysstderrrstrip
isinstancetupleplatformisattyjoinwin32_and_ctypesFOREGROUND_WHITEFOREGROUND_REDFOREGROUND_GREENFOREGROUND_BLUEr   FOREGROUND_INTENSITYGetStdHandleGetConsoleInfowAttributesSetConsoleTextAttributelenwriteflush)r   escfilenewlinerM   boldZesctableattrSTD_OUTPUT_HANDLESTD_ERROR_HANDLEhandle	oldcolorsr   r   r   
ansi_printN   sX    





rW   c             C   sb   t jddkrdS t jddkr(dS t| do`|  o`t jddko`tjd	o^t jd
k S )NZ	PY_COLORS1T0Fr?   ZTERMZdumbjavant)	r   r   r   hasattrr?   r9   r>   
startswith_name)rO   r   r   r   should_do_markup   s    r_   c               @   s   e Zd Zeddddddddd	d
dddddddddddZd2ddZedd Zejdd Zedd Z	edd  Z
d!d" Zd#d$ Zd3d%d&Zd'd( Zd)d* Zd4d,d-Zd.d/ Zd0d1 ZdS )5TerminalWriter   r0   r1   r2   r3   r4   r5   r6   r   )   *   +   ,   -   .   /   r   r         )ZblackredgreenyellowblueZpurpleZcyanZwhiteZBlackZRedZGreenZYellowZBlueZPurpleZCyanZWhiterQ   ZlightZblinkinvertNFc             C   s   |d kr,|rt j  | _}qXddlm} n,t j|rXt|drLt|dsXt	||d}t|drz|
 rztrzt|j}|pt|dd| _|| _t|| _d| _d| _d| _d S )	Nr   )stdoutrL   rM   )encodingr?   rq   zutf-8)r   ioZTextIOstringior9   rp   r   callabler\   	WriteFiler?   coloramaZAnsiToWin32streamgetattrrq   _filer_   	hasmarkup_lastlen_chars_on_current_line_width_of_current_line)selfrO   rs   rq   r   r   r   __init__   s    
zTerminalWriter.__init__c             C   s   t | dr| jS t S )N_terminal_width)r\   r   r   )r~   r   r   r   	fullwidth   s    
zTerminalWriter.fullwidthc             C   s
   || _ d S )N)r   )r~   valuer   r   r   r      s    c             C   s   | j S )zReturn the number of characters written so far in the current line.

        Please note that this count does not produce correct results after a reline() call,
        see #164.

        .. versionadded:: 1.5.0

        :rtype: int
        )r|   )r~   r   r   r   chars_on_current_line   s    z$TerminalWriter.chars_on_current_linec             C   s   | j S )zzReturn an estimate of the width so far in the current line.

        .. versionadded:: 1.6.0

        :rtype: int
        )r}   )r~   r   r   r   width_of_current_line   s    z$TerminalWriter.width_of_current_linec             C   s*   |r&| j r&ddd |D | d }|S )Nr+   c             S   s   g | ]}d | qS )z[%smr   )r&   r,   r   r   r   r-      s    z+TerminalWriter._escaped.<locals>.<listcomp>z[0m)rz   r@   )r~   r   rN   r   r   r   _escaped   s    
zTerminalWriter._escapedc             K   sR   g }x<|D ]4}|| j kr&td|f || r
|| j |  q
W | |t|S )Nzunknown markup: %r)	_esctable
ValueErrorappendr   r=   )r~   r   kwrN   namer   r   r   markup   s    

zTerminalWriter.markupc             K   s   |d kr| j }tjdkr |d8 }|d k	rbt|t| d dt|  d}|| }d|||f }n||t|  }t|t|  |kr|| 7 }| j|f| d S )Nr   r   r   z%s %s %s)r   r9   r>   maxrK   r;   line)r~   Zsepchartitler   r   r"   Zfillr   r   r   r   sep   s    
"zTerminalWriter.sepc             K   sR   |rNt |ttfst|}| | | jr>|r>| j|f|}n|}t| j| d S )N)r<   r   r   _update_chars_on_current_linerz   r   	write_outry   )r~   msgr   Z	markupmsgr   r   r   rL      s    

zTerminalWriter.writec             C   s   t |trdnd}||dd }t |tr:|jddd}||krXt|| _t|| _n$|  jt|7  _|  jt|7  _d S )N   
r.   r   zutf-8replace)errors)r<   r   rsplitdecoderK   r|   r*   r}   )r~   Ztext_or_bytesrP   Zcurrent_liner   r   r   r     s    

z,TerminalWriter._update_chars_on_current_liner+   c             K   s&   | j |f| | | |  d d S )Nr.   )rL   
_checkfill)r~   sr   r   r   r   r     s    
zTerminalWriter.linec             K   s>   | j std| j|f| | | | d t|| _d S )Nz(cannot use rewrite-line without terminal)rz   r   rL   r   rK   r{   )r~   r   r   r   r   r   reline  s    

zTerminalWriter.relinec             C   s(   | j t| }|dkr$| d|  d S )Nr    )r{   rK   rL   )r~   r   Z	diff2lastr   r   r   r     s    zTerminalWriter._checkfill)NFN)NN)r+   )__name__
__module____qualname__dictr   r   propertyr   setterr   r   r   r   r   rL   r   r   r   r   r   r   r   r   r`      s$   


	

r`   c               @   s   e Zd Zdd ZdS )Win32ConsoleWriterc             K   s   |rt |ttfst|}| | d }| jr|rtt}t|j}|d@ }|}|	ddrd|t
O }|	ddrz|tO }nR|	ddr|tO }n<|	ddr|tO }n&|	ddr|ttB O }n||d@ O }t|| t| j| |rt|| d S )	Nr8   rQ   Frk   rn   rl   rm   rj   )r<   r   r   r   rz   rG   rS   rH   rI   poprF   rC   rE   rD   rJ   r   ry   )r~   r   r   rV   rU   Z
default_bgrR   r   r   r   rL   !  s2    






zWin32ConsoleWriter.writeN)r   r   r   rL   r   r   r   r   r      s   r   c               @   s&   e Zd ZdddZdd Zdd ZdS )	ru   Nc             C   s   || _ || _d S )N)rq   _writemethod)r~   Zwritemethodrq   r   r   r   r   B  s    zWriteFile.__init__c             C   s"   | j r|| j d}| | d S )Nr   )rq   encoder   )r~   datar   r   r   rL   F  s    zWriteFile.writec             C   s   d S )Nr   )r~   r   r   r   rM   K  s    zWriteFile.flush)N)r   r   r   r   rL   rM   r   r   r   r   ru   A  s   
ru   )wintypesii   rj         r1   @   p      c               @   s   e Zd ZdefdefgZdS )COORDXYN)r   r   r   SHORT_fields_r   r   r   r   r   e  s   r   c               @   s(   e Zd ZdefdefdefdefgZdS )
SMALL_RECTZLeftZTopZRightZBottomN)r   r   r   r   r   r   r   r   r   r   h  s   r   c               @   s0   e Zd ZdefdefdejfdefdefgZdS )CONSOLE_SCREEN_BUFFER_INFOdwSizeZdwCursorPositionrI   ZsrWindowZdwMaximumWindowSizeN)r   r   r   r   r   WORDr   r   r   r   r   r   r   m  s
   r   c             C   s   t | S )N)_GetStdHandle)Zkindr   r   r   rG   w  s    rG   c             C   s   t  }t| t| |S )N)r   _GetConsoleScreenBufferInfoctypesZbyref)rU   infor   r   r   rH     s    rH   c              C   s$   t t} t| }|jj|jjd fS )Nr   )rG   rS   rH   r   r   r   )rU   r   r   r   r   r     s    c             C   s   y|  | W nl tk
rz   | jr\y|  || j W n tk
rN   Y nX |   d S |dd}|  | Y nX |   d S )Nzunicode-escapeascii)rL   UnicodeEncodeErrorrq   r   rM   r   )Zfilr   r   r   r   r     s    r   )NTF)@__doc__r9   r   r%   r   version_infoZpy3kr   Z
py.builtinr   r   rA   rv   r>   ImportErrorr   r   r   Zterminal_widthr$   r*   rW   r_   objectr`   r   ru   r   rS   rT   ZFOREGROUND_BLACKrE   rD   rC   rB   rF   ZBACKGROUND_BLACKZBACKGROUND_BLUEZBACKGROUND_GREENZBACKGROUND_REDZBACKGROUND_WHITEZBACKGROUND_INTENSITYZc_shortr   Z	Structurer   r   r   ZwindllZkernel32rG   r   ZDWORDZargtypesZHANDLEZrestyperJ   r   ZBOOLZGetConsoleScreenBufferInfor   ZPOINTERrH   r   r   r   r   r   <module>   s   


5	 !



