o
    b?                  	   @   s  d Z ddlZddl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 ddlmZ ddlmZ dd	lmZ dd
lmZ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*g dZ+dS )z<
Partial in-memory terminal emulator

@author: Jp Calderone
    N)implementer)Version)insults)deferprotocolreactor)Logger)_textattributes)	iterbytes)
deprecateddeprecatedModuleAttribute   (   	   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__3   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}.
        )popitem_withAttribute)r   kwkvr   r   r   wantOneG   s   z_FormattingState.wantOnec                 C   s   g }| j r
|d | jr|tj | jr|tj | jr%|tj | j	r.|tj
 | jtkr;|t| j  | jtkrH|t| j  |rVd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   attrsr   r   r   toVT102V   s$   


z_FormattingState.toVT102N)__name__
__module____qualname____doc__compareAttributesr   G0r0   r2   r   r   r   r'   r8   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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dyddZdyddZdydd Zdyd!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 Z0dIdJ Z1dKdL Z2dMdN Z3dOdP Z4dQdR Z5dSdT Z6dydUdVZ7dydWdXZ8dydYdZZ9d[d\ Z:d]d^ Z;d_d` Z<dadb Z=dcdd Z>dedf Z?dgdh Z@didj ZAdkdl ZBdmdn ZCdodp ZDdzdrdsZEdtdu ZFdvdw ZGdxS ){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      zTerminalBuffer.getCharacterc                 C      |    d S r   )resetr   r   r   r   connectionMade      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i | jS r   )r   activeCharsetgraphicRenditionrN   r   r   r   _currentFormattingState   s   z&TerminalBuffer._currentFormattingStatec                 C   s   |dkr	d| _ dS |dkr|   dS |tjdv r[| j | jkr%|   ||  f}| j	t
jjrI|g| j| j | j | j < | j| j   n	|| j| j | j < |  j d7  _ dS 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   rQ   rA   r!   N)rH   _scrollDownstring	printableencodewidthnextLinerY   modesgetr   IRMrG   rI   pop)r   rU   chr   r   r   rS      s   
zTerminalBuffer.insertAtCursorc                    s    fddt |D S )Nc                    s   g | ]	} j   fqS r   )voidrY   .0irN   r   r   
<listcomp>   s    z-TerminalBuffer._emptyLine.<locals>.<listcomp>)ranger   r_   r   rN   r   
_emptyLine      zTerminalBuffer._emptyLinec                 C   sL   |  j d7  _ | j | jkr$|  j d8  _ | jd= | j| | j d S d S )Nr!   r   )rI   heightrG   r+   rm   r_   rN   r   r   r   r[      s   zTerminalBuffer._scrollDownc                 C   sD   |  j d8  _ | j dk r d| _ | jd= | jd| | j d S d S )Nr!   r   )rI   rG   insertrm   r_   rN   r   r   r   	_scrollUp   s   
zTerminalBuffer._scrollUpr!   c                 C      t d| j| | _d S Nr   )maxrI   r   nr   r   r   cursorUp   rn   zTerminalBuffer.cursorUpc                 C   s   t | jd | j| | _d S Nr!   )minro   rI   rv   r   r   r   
cursorDown   s   zTerminalBuffer.cursorDownc                 C   rs   rt   )ru   rH   rv   r   r   r   cursorBackward   rn   zTerminalBuffer.cursorBackwardc                 C   s   t | j| j| | _d S r   )rz   r_   rH   rv   r   r   r   cursorForward      zTerminalBuffer.cursorForwardc                 C   s   || _ || _d S r   rH   rI   )r   columnliner   r   r   cursorPosition   s   
zTerminalBuffer.cursorPositionc                 C   s   | j j| _| j j| _d S r   )homerH   rI   rN   r   r   r   
cursorHome   s   
zTerminalBuffer.cursorHomec                 C   rL   r   )r[   rN   r   r   r   index   rP   zTerminalBuffer.indexc                 C   rL   r   )rr   rN   r   r   r   reverseIndex   rP   zTerminalBuffer.reverseIndexc                 C   s   d| _ |   dS )zW
        Update the cursor position attributes and scroll down if appropriate.
        r   N)rH   r[   rN   r   r   r   r`      s   zTerminalBuffer.nextLinec                 C   s   | j | jf| _d S r   )rH   rI   _savedCursorrN   r   r   r   
saveCursor     zTerminalBuffer.saveCursorc                 C   s   | j \| _| _| ` d S r   )r   rH   rI   rN   r   r   r   restoreCursor	  s   zTerminalBuffer.restoreCursorc                 C   s   |D ]}d| j |< qd S )NT)ra   r   ra   r)   r   r   r   setModes  s   zTerminalBuffer.setModesc              	   C   s,   |D ]}z| j |= W q ty   Y qw d S r   )ra   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   s,   |D ]}z| j |= W q ty   Y qw 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   
   d| _ d S )Napp
keypadModerN   r   r   r   applicationKeypadMode3     
z$TerminalBuffer.applicationKeypadModec                 C   r   )Nnumr   rN   r   r   r   numericKeypadMode6  r   z TerminalBuffer.numericKeypadModec                 C   s   || j |< d S r   )charsets)r   charSetwhichr   r   r   selectCharacterSet9  rK   z!TerminalBuffer.selectCharacterSetc                 C      t j| _d S r   )r   r>   rW   rN   r   r   r   shiftIn<  rP   zTerminalBuffer.shiftInc                 C   r   r   )r   G1rW   rN   r   r   r   shiftOut?  rP   zTerminalBuffer.shiftOutc                    .   j tj_ j  fdd}|_d S )Nc                        |  ` _d S r   rS   rW   rU   foldActiveCharsetr   r   r   rS   G     
z3TerminalBuffer.singleShift2.<locals>.insertAtCursor)rW   r   G2rS   r   rS   r   r   r   singleShift2B  
   
zTerminalBuffer.singleShift2c                    r   )Nc                    r   r   r   r   r   r   r   rS   S  r   z3TerminalBuffer.singleShift3.<locals>.insertAtCursor)rW   r   G3rS   r   r   r   r   singleShift3N  r   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r*d| jd< q|t jkr5d| jd< q|t jkr@d| jd< qzt	|}W n t
yW   | jjd|d	 Y qw t|  krdtt krnn n|t | jd
< qt|  krztt krn n|t | jd< q| jjd|d	 qd S )NFr   r   r   r   r   r   Tr   r   r   r   z-Unknown graphic rendition attribute: {attr!r})attrr   r   )r   NORMALr0   r2   rX   r,   r-   r.   r/   int
ValueError_logerrorr1   N_COLORSr3   )r   
attributesar&   r   r   r   selectGraphicRenditionZ  s@   






z%TerminalBuffer.selectGraphicRenditionc                 C   s   |  | j| j| j< d S r   )rm   r_   rG   rI   rN   r   r   r   	eraseLine~  r~   zTerminalBuffer.eraseLinec                 C   s,   | j | j }| || j| j | jd < d S r   )r_   rH   rm   rG   rI   rl   r   r   r   eraseToLineEnd  s    zTerminalBuffer.eraseToLineEndc                 C   s*   |  | jd | j| j d | jd < d S ry   )rm   rH   rG   rI   rN   r   r   r   eraseToLineBeginning  s   *z#TerminalBuffer.eraseToLineBeginningc                    s    fddt  jD  _d S )Nc                       g | ]}   jqS r   rm   r_   rg   rN   r   r   rj         z/TerminalBuffer.eraseDisplay.<locals>.<listcomp>)rk   ro   rG   rN   r   rN   r   eraseDisplay  s   zTerminalBuffer.eraseDisplayc                    sB        j j d } fddt|D  j jd d < d S )Nr!   c                    r   r   r   rg   rN   r   r   rj     r   z4TerminalBuffer.eraseToDisplayEnd.<locals>.<listcomp>)r   ro   rI   rk   rG   )r   ro   r   rN   r   eraseToDisplayEnd  s   *z TerminalBuffer.eraseToDisplayEndc                    s0        fddt jD  jd  j< d S )Nc                    r   r   r   rg   rN   r   r   rj     r   z:TerminalBuffer.eraseToDisplayBeginning.<locals>.<listcomp>)r   rk   rI   rG   rN   r   rN   r   eraseToDisplayBeginning  s   (z&TerminalBuffer.eraseToDisplayBeginningc                 C   sD   | j | j | j| j| = | j | j | t| j| j | d S r   )rG   rI   rH   extendrm   rz   r_   rv   r   r   r   deleteCharacter  s   *zTerminalBuffer.deleteCharacterc                    s6    fddt |D  j j j<  j jd = d S )Nc                    r   r   r   rg   rN   r   r   rj     r   z-TerminalBuffer.insertLine.<locals>.<listcomp>)rk   rG   rI   ro   rv   r   rN   r   
insertLine  s   $zTerminalBuffer.insertLinec                    s6    j  j j| =  j  fddt|D  d S )Nc                    r   r   r   rg   rN   r   r   rj     r   z-TerminalBuffer.deleteLine.<locals>.<listcomp>)rG   rI   r   rk   rv   r   rN   r   
deleteLine  s   "zTerminalBuffer.deleteLinec                 C   s   | j | jfS r   r   rN   r   r   r   reportCursorPosition  rP   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   Vectorr   rH   rI   ra   r   r   	AUTO_WRAPCURSOR_MODEnumericKeypadr>   rW   r0   r2   rX   CS_USr   r   CS_ALTERNATEr   CS_ALTERNATE_SPECIALr   r   rN   r   r   r   rM     s,   	zTerminalBuffer.resetc                 C   s   t dt| d S )NzCould not handle)printrepr)r   bufr   r   r   unhandledControlSequence  r   z'TerminalBuffer.unhandledControlSequencec                 C   sr   g }| j D ].}g }d}|D ]\}}|| jur || t|}q|| j q|d|d |  qd|S )Nr       rQ   )rG   rf   r+   lenfillr4   )r   rG   Lr   lengthre   r   r   r   r   	__bytes__  s   




zTerminalBuffer.__bytes__c                 C      t d)Nz%Unimplemented: TerminalBuffer.getHostNotImplementedErrorrN   r   r   r   getHost     zTerminalBuffer.getHostc                 C   r   )Nz%Unimplemented: TerminalBuffer.getPeerr   rN   r   r   r   getPeer  r   zTerminalBuffer.getPeerc                 C   r   )Nz,Unimplemented: TerminalBuffer.loseConnectionr   rN   r   r   r   loseConnection  r   zTerminalBuffer.loseConnectionc                 C   r   )Nz+Unimplemented: TerminalBuffer.writeSequencer   r   rT   r   r   r   writeSequence  r   zTerminalBuffer.writeSequencec                 C   r   )Nz5Unimplemented: TerminalBuffer.horizontalTabulationSetr   rN   r   r   r   horizontalTabulationSet  s   z&TerminalBuffer.horizontalTabulationSetc                 C   r   )Nz-Unimplemented: TerminalBuffer.tabulationClearr   rN   r   r   r   tabulationClear  r   zTerminalBuffer.tabulationClearc                 C   r   )Nz0Unimplemented: TerminalBuffer.tabulationClearAllr   rN   r   r   r   tabulationClearAll  r   z!TerminalBuffer.tabulationClearAllTc                 C   r   )Nz.Unimplemented: TerminalBuffer.doubleHeightLiner   )r   topr   r   r   doubleHeightLine  r   zTerminalBuffer.doubleHeightLinec                 C   r   )Nz-Unimplemented: TerminalBuffer.singleWidthLiner   rN   r   r   r   singleWidthLine  r   zTerminalBuffer.singleWidthLinec                 C   r   )Nz-Unimplemented: TerminalBuffer.doubleWidthLiner   rN   r   r   r   doubleWidthLine  r   zTerminalBuffer.doubleWidthLineN)r!   )T)Hr9   r:   r;   r<   keyID	execBytesdecodeexecStrexecTAB	BACKSPACEr_   ro   r   objectrf   r   r   rJ   rO   rV   rY   rS   rm   r[   rr   rx   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   rM   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r@   x   s    






$



r@   c                   @   s   e Zd ZdS )ExpectationTimeoutN)r9   r:   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@   rO   
_expectingrN   r   r   r   rO         

zExpectableBuffer.connectionMadec                 C   s   t | | |   d S r   )r@   rV   _checkExpectedr   r   r   r   rV        zExpectableBuffer.writec                 C   s   t |  d| _d S rt   )r@   r   _markrN   r   r   r   r     r   zExpectableBuffer.cursorHomec                 C   s   | t  |   d S r   )errbackr   r   )r   dr   r   r   _timeoutExpected  r   z!ExpectableBuffer._timeoutExpectedc                 C   s   |   | jd  }| jrO| jd \}}}|r| s| jd= q	||D ]#}|r,|  | jd= |  j| 7  _|| d  }||  nd S | jsd S d S rt   )r   r   r   activefinditercancelendcallback)r   sexprtimerdeferredmatchr   r   r   r     s    
zExpectableBuffer._checkExpectedNc                 C   sD   t  }d }|r||| j|}| jt|||f |   |S r   )	r   Deferred	callLaterr   r   r+   recompiler   )r   
expressiontimeout	schedulerr   r  r   r   r   expect"  s   zExpectableBuffer.expect)r9   r:   r;   r   rO   rV   r   r   r   r   r  r   r   r   r   r     s    r   )r?   r@   r   ),r<   r  r\   zope.interfacer   incrementalr   twisted.conch.insultsr   twisted.internetr   r   r   twisted.loggerr   twisted.pythonr	   twisted.python.compatr
   twisted.python.deprecater   r   r1   r3   rk   r2   REDGREENYELLOWBLUEMAGENTACYANr0   r   _FormattingStateMixinr   r?   ITerminalTransportProtocolr@   	Exceptionr   r   __all__r   r   r   r   <module>   s<   N	   /