U
    
W[<8                  	   @   s  d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
mZmZ ddlmZmZ ddlmZ dd	lmZmZ dd
lmZ dZdZed\	ZZZZZZZ Z!Z"G dd dej#Z$e$Z%eeddddddd eej&G dd dej'Z(G dd de)Z*G dd de(Z+dddgZ,dS )z<
Partial in-memory terminal emulator

@author: Jp Calderone
    )print_functionN)implementer)Version)deferprotocolreactor)log_textattributes)	iterbytes)
deprecateddeprecatedModuleAttribute)insults   (   	   c                   @   sR   e Zd ZdZdZejddddeedfddZ	e
edddd	d
d Zdd ZdS )_FormattingStatez
    Represents the formatting state/attributes of a single character.

    Character set, intensity, underlinedness, blinkitude, video
    reversal, as well as foreground and background colors made up a
    character's attributes.
    charsetbold	underlineblinkreverseVideo
foreground
background_subtractingFc	           	      C   s4   || _ || _|| _|| _|| _|| _|| _|| _d S Nr   )	selfr   r   r   r   r   r   r   r    r   >/usr/lib/python3/dist-packages/twisted/conch/insults/helper.py__init__,   s    z_FormattingState.__init__Twisted      r   c                 K   s   |  \}}| ||S )a>  
        Add a character attribute to a copy of this formatting state.

        @param **kw: An optional attribute name and value can be provided with
            a keyword argument.

        @return: A formatting state instance with the new attribute.

        @see: L{DefaultFormattingState._withAttribute}.
        )popitemZ_withAttribute)r   kwkvr   r   r   wantOne9   s    z_FormattingState.wantOnec                 C   s   g }| j r|d | jr&|tj | jr8|tj | jrJ|tj | j	r\|tj
 | jtkrv|t| j  | jtkr|t| j  |rddtt| d S dS )Nr   z[;m )r   appendr   r   BOLDr   	UNDERLINEr   BLINKr   REVERSE_VIDEOr   WHITE
FOREGROUNDr   BLACK
BACKGROUNDjoinmapstr)r   Zattrsr   r   r   toVT102I   s$    


z_FormattingState.toVT102N)__name__
__module____qualname____doc__ZcompareAttributesr   G0r0   r2   r   r   r   r'   r7   r   r   r   r   r      s      

r   r    r!   r"   z=Use twisted.conch.insults.text.assembleFormattedText instead.ztwisted.conch.insults.helperCharacterAttributec                   @   s  e Zd ZdZdD ]Zed ZedZee qdZ	dZ
dZdZd	Ze 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ddddZdeddZdfdd Zdgd!d"Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Z d-d. Z!d/d0 Z"d1d2 Z#d3d4 Z$d5d6 Z%d7d8 Z&d9d: Z'd;d< Z(d=d> Z)d?d@ Z*dAdB Z+dCdD Z,dEdF Z-dGdH Z.dIdJ Z/dKdL Z0dMdN Z1dOdP Z2dQdR Z3dSdT Z4dhdUdVZ5didWdXZ6djdYdZZ7d[d\ Z8d]d^ Z9d_d` Z:dadb Z;dcS )kTerminalBufferz)
    An in-memory terminal emulator.
    )s   UP_ARROWs
   DOWN_ARROWs   RIGHT_ARROWs
   LEFT_ARROWs   HOMEs   INSERTs   DELETEs   ENDs   PGUPs   PGDNs   F1s   F2s   F3s   F4s   F5s   F6s   F7s   F8s   F9s   F10s   F11s   F12s    = object()ascii   	   P          c                 C   s   | j | | S r   )lines)r   xyr   r   r   getCharacter   s    zTerminalBuffer.getCharacterc                 C   s   |    d S r   )resetr   r   r   r   connectionMade   s    zTerminalBuffer.connectionMadec                 C   s$   t |ddD ]}| | qdS )z
        Add the given printable bytes to the terminal.

        Line feeds in L{bytes} will be replaced with carriage return / line
        feed pairs.
           
s   
N)r
   replaceinsertAtCursor)r   databr   r   r   write   s    zTerminalBuffer.writec                 C   s   t | jf| jS r   )r   activeCharsetgraphicRenditionrJ   r   r   r   _currentFormattingState   s    z&TerminalBuffer._currentFormattingStatec                 C   s   |dkrd| _ n|dkr"|   n|tjdkr| j | jkrF|   ||  f}| j	t
jjr|g| j| j | j | j < | j| j   n|| j| j | j < |  j d7  _ dS )a  
        Add one byte to the terminal at the cursor and make consequent state
        updates.

        If b is a carriage return, move the cursor to the beginning of the
        current row.

        If b is a line feed, move the cursor to the next row or scroll down if
        the cursor is already in the last row.

        Otherwise, if b is printable, put it at the cursor position (inserting
        or overwriting as dictated by the current mode) and move the cursor.
           r   rL   r?   r"   N)rF   _scrollDownstringZ	printableencodewidthnextLinerT   modesgetr   ZIRMrE   rG   pop)r   rP   chr   r   r   rN      s    
zTerminalBuffer.insertAtCursorc                    s    fddt |D S )Nc                    s   g | ]} j   fqS r   )voidrT   .0irJ   r   r   
<listcomp>   s   z-TerminalBuffer._emptyLine.<locals>.<listcomp>)ranger   rY   r   rJ   r   
_emptyLine   s    
zTerminalBuffer._emptyLinec                 C   sH   |  j d7  _ | j | jkrD|  j d8  _ | jd= | j| | j d S )Nr"   r   )rG   heightrE   r+   rf   rY   rJ   r   r   r   rV      s
    zTerminalBuffer._scrollDownc                 C   s@   |  j d8  _ | j dk r<d| _ | jd= | jd| | j d S )Nr"   r   )rG   rE   insertrf   rY   rJ   r   r   r   	_scrollUp   s
    
zTerminalBuffer._scrollUpr"   c                 C   s   t d| j| | _d S Nr   )maxrG   r   nr   r   r   cursorUp   s    zTerminalBuffer.cursorUpc                 C   s   t | jd | j| | _d S Nr"   )minrg   rG   rm   r   r   r   
cursorDown   s    zTerminalBuffer.cursorDownc                 C   s   t d| j| | _d S rk   )rl   rF   rm   r   r   r   cursorBackward   s    zTerminalBuffer.cursorBackwardc                 C   s   t | j| j| | _d S r   )rq   rY   rF   rm   r   r   r   cursorForward   s    zTerminalBuffer.cursorForwardc                 C   s   || _ || _d S r   rF   rG   )r   columnliner   r   r   cursorPosition   s    zTerminalBuffer.cursorPositionc                 C   s   | j j| _| j j| _d S r   )homerF   rG   rJ   r   r   r   
cursorHome   s    
zTerminalBuffer.cursorHomec                 C   s   |    d S r   )rV   rJ   r   r   r   index   s    zTerminalBuffer.indexc                 C   s   |    d S r   )rj   rJ   r   r   r   reverseIndex   s    zTerminalBuffer.reverseIndexc                 C   s   d| _ |   dS )zW
        Update the cursor position attributes and scroll down if appropriate.
        r   N)rF   rV   rJ   r   r   r   rZ      s    zTerminalBuffer.nextLinec                 C   s   | j | jf| _d S r   )rF   rG   _savedCursorrJ   r   r   r   
saveCursor   s    zTerminalBuffer.saveCursorc                 C   s   | j \| _| _| ` d S r   )r}   rF   rG   rJ   r   r   r   restoreCursor   s    zTerminalBuffer.restoreCursorc                 C   s   |D ]}d| j |< qd S )NT)r[   r   r[   r)   r   r   r   setModes   s    zTerminalBuffer.setModesc              	   C   s0   |D ]&}z| j |= W q tk
r(   Y qX qd S r   )r[   KeyErrorr   r   r   r   
resetModes  s
    zTerminalBuffer.resetModesc                 C   s   |D ]}d| j |< qdS )aH  
        Enable the given modes.

        Track which modes have been enabled so that the implementations of
        other L{insults.ITerminalTransport} methods can be properly implemented
        to respect these settings.

        @see: L{resetPrivateModes}
        @see: L{insults.ITerminalTransport.setPrivateModes}
        TN)privateModesr   r   r   r   setPrivateModes
  s    zTerminalBuffer.setPrivateModesc              	   C   s0   |D ]&}z| j |= W q tk
r(   Y qX qdS )z
        Disable the given modes.

        @see: L{setPrivateModes}
        @see: L{insults.ITerminalTransport.resetPrivateModes}
        N)r   r   r   r   r   r   resetPrivateModes  s
    z TerminalBuffer.resetPrivateModesc                 C   s
   d| _ d S )NappZ
keypadModerJ   r   r   r   applicationKeypadMode'  s    z$TerminalBuffer.applicationKeypadModec                 C   s
   d| _ d S )NZnumr   rJ   r   r   r   numericKeypadMode+  s    z TerminalBuffer.numericKeypadModec                 C   s   || j |< d S r   )charsets)r   ZcharSetZwhichr   r   r   selectCharacterSet/  s    z!TerminalBuffer.selectCharacterSetc                 C   s   t j| _d S r   )r   r<   rR   rJ   r   r   r   shiftIn3  s    zTerminalBuffer.shiftInc                 C   s   t j| _d S r   )r   G1rR   rJ   r   r   r   shiftOut7  s    zTerminalBuffer.shiftOutc                    s.   j tj_ j  fdd}|_d S )Nc                    s    |  ` _d S r   rN   rR   rP   fZoldActiveCharsetr   r   r   rN   ?  s    z3TerminalBuffer.singleShift2.<locals>.insertAtCursor)rR   r   G2rN   r   rN   r   r   r   singleShift2;  s
    zTerminalBuffer.singleShift2c                    s.   j tj_ j  fdd}|_d S )Nc                    s    |  ` _d S r   r   r   r   r   r   rN   J  s    z3TerminalBuffer.singleShift3.<locals>.insertAtCursor)rR   r   G3rN   r   r   r   r   singleShift3F  s
    zTerminalBuffer.singleShift3c              	   G   s(  |D ]}|t jkr*ddddttd| _q|t jkr@d| jd< q|t jkrVd| jd< q|t jkrld| jd< q|t jkrd| jd< qzt	|}W n& t
k
r   tdt|  Y qX t|  krtt krn n|t | jd	< qt|  krtt krn n|t | jd
< qtdt|  qd S )NFr   r   r   r   r   r   Tr   r   r   r   z%Unknown graphic rendition attribute: r   r   )r   ZNORMALr0   r2   rS   r,   r-   r.   r/   int
ValueErrorr   msgreprr1   N_COLORSr3   )r   Z
attributesar&   r   r   r   selectGraphicRenditionQ  s4    






z%TerminalBuffer.selectGraphicRenditionc                 C   s   |  | j| j| j< d S r   )rf   rY   rE   rG   rJ   r   r   r   	eraseLineq  s    zTerminalBuffer.eraseLinec                 C   s,   | j | j }| || j| j | jd < d S r   )rY   rF   rf   rE   rG   re   r   r   r   eraseToLineEndu  s    zTerminalBuffer.eraseToLineEndc                 C   s*   |  | jd | j| j d | jd < d S rp   )rf   rF   rE   rG   rJ   r   r   r   eraseToLineBeginningz  s    z#TerminalBuffer.eraseToLineBeginningc                    s    fddt  jD  _d S )Nc                    s   g | ]}   jqS r   rf   rY   r`   rJ   r   r   rc     s     z/TerminalBuffer.eraseDisplay.<locals>.<listcomp>)rd   rg   rE   rJ   r   rJ   r   eraseDisplay~  s    zTerminalBuffer.eraseDisplayc                    sB        j j d } fddt|D  j jd d < d S )Nr"   c                    s   g | ]}   jqS r   r   r`   rJ   r   r   rc     s     z4TerminalBuffer.eraseToDisplayEnd.<locals>.<listcomp>)r   rg   rG   rd   rE   )r   rg   r   rJ   r   eraseToDisplayEnd  s    z TerminalBuffer.eraseToDisplayEndc                    s0        fddt jD  jd  j< d S )Nc                    s   g | ]}   jqS r   r   r`   rJ   r   r   rc     s     z:TerminalBuffer.eraseToDisplayBeginning.<locals>.<listcomp>)r   rd   rG   rE   rJ   r   rJ   r   eraseToDisplayBeginning  s    z&TerminalBuffer.eraseToDisplayBeginningc                 C   sD   | j | j | j| j| = | j | j | t| j| j | d S r   )rE   rG   rF   extendrf   rq   rY   rm   r   r   r   deleteCharacter  s    zTerminalBuffer.deleteCharacterc                    s6    fddt |D  j j j<  j jd = d S )Nc                    s   g | ]}   jqS r   r   r`   rJ   r   r   rc     s     z-TerminalBuffer.insertLine.<locals>.<listcomp>)rd   rE   rG   rg   rm   r   rJ   r   
insertLine  s    $zTerminalBuffer.insertLinec                    s6    j  j j| =  j  fddt|D  d S )Nc                    s   g | ]}   jqS r   r   r`   rJ   r   r   rc     s     z-TerminalBuffer.deleteLine.<locals>.<listcomp>)rE   rG   r   rd   rm   r   rJ   r   
deleteLine  s    zTerminalBuffer.deleteLinec                 C   s   | j | jfS r   ru   rJ   r   r   r   reportCursorPosition  s    z#TerminalBuffer.reportCursorPositionc                 C   s   t dd| _d | _| _i | _i | _| t jjt jj	g d| _
t j| _ddddttd| _t jt jt jt jt jt jt jt ji| _|   d S )Nr   r   Fr   )r   ZVectorry   rF   rG   r[   r   r   Z	AUTO_WRAPZCURSOR_MODEZnumericKeypadr<   rR   r0   r2   rS   ZCS_USr   r   ZCS_ALTERNATEr   ZCS_ALTERNATE_SPECIALr   r   rJ   r   r   r   rI     s4    
    zTerminalBuffer.resetc                 C   s   t dt| d S )NzCould not handle)printr   )r   bufr   r   r   unhandledControlSequence  s    z'TerminalBuffer.unhandledControlSequencec                 C   sr   g }| j D ]\}g }d}|D ]2\}}|| jk	r@|| t|}q|| j q|d|d |  q
d|S )Nr       rL   )rE   r_   r+   lenfillr4   )r   rE   Lr   Zlengthr^   attrr   r   r   	__bytes__  s    



zTerminalBuffer.__bytes__N)r"   )r"   )r"   )r"   )r"   )r"   )r"   )<r8   r9   r:   r;   ZkeyIDZ	execBytesdecodeZexecStrexecZTABZ	BACKSPACErY   rg   r   objectr_   rH   rK   rQ   rT   rN   rf   rV   rj   ro   rr   rs   rt   rx   rz   r{   r|   rZ   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rI   r   r   r   r   r   r   r>   j   sn   





 


r>   c                   @   s   e Zd ZdS )ExpectationTimeoutN)r8   r9   r:   r   r   r   r   r     s   r   c                   @   sF   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zde	fddZ
dS )ExpectableBufferr   c                 C   s   t |  g | _d S r   )r>   rK   
_expectingrJ   r   r   r   rK     s    
zExpectableBuffer.connectionMadec                 C   s   t | | |   d S r   )r>   rQ   _checkExpected)r   rO   r   r   r   rQ     s    zExpectableBuffer.writec                 C   s   t |  d| _d S rk   )r>   rz   _markrJ   r   r   r   rz     s    
zExpectableBuffer.cursorHomec                 C   s   | t  |   d S r   )Zerrbackr   r   )r   dr   r   r   _timeoutExpected  s    z!ExpectableBuffer._timeoutExpectedc                 C   s   |   | jd  }| jr| jd \}}}|r>| s>| jd= q||D ]H}|rX|  | jd= |  j| 7  _|| d  }||  qqHd S qd S rk   )r   r   r   ZactivefinditerZcancelendcallback)r   sexprtimerZdeferredmatchr   r   r   r     s    
zExpectableBuffer._checkExpectedNc                 C   sD   t  }d }|r ||| j|}| jt|||f |   |S r   )	r   ZDeferredZ	callLaterr   r   r+   recompiler   )r   Z
expressionZtimeoutZ	schedulerr   r   r   r   r   expect  s    zExpectableBuffer.expect)r8   r9   r:   r   rK   rQ   rz   r   r   r   r   r   r   r   r   r     s   r   )-r;   Z
__future__r   r   rW   Zzope.interfacer   Zincrementalr   Ztwisted.internetr   r   r   Ztwisted.pythonr   r	   Ztwisted.python.compatr
   Ztwisted.python.deprecater   r   Ztwisted.conch.insultsr   r1   r3   rd   r2   ZREDZGREENZYELLOWZBLUEZMAGENTAZCYANr0   r   Z_FormattingStateMixinr   r=   ZITerminalTransportZProtocolr>   	Exceptionr   r   __all__r   r   r   r   <module>   s<   @	  c4  