U
    P|jÊ?  ã                	   @   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*dddg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   ú@/tmp/pip-unpacked-wheel-audpp6lv/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}.
        )ÚpopitemZ_withAttribute)r   ÚkwÚkÚvr   r   r   ÚwantOneG   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 ¡ |r¬d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__ZcompareAttributesr   ÚG0r/   r1   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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dzdd„Zd{dd „Zd|d!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„ Z6d}dUdV„Z7d~dWdX„Z8ddYdZ„Z9d[d\„ Z:d]d^„ Z;d_d`„ Z<dadb„ Z=dcdd„ Z>dedf„ Z?dgdh„ Z@didj„ ZAdkdl„ ZBdmdn„ ZCdodp„ ZDd€drds„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¤   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ÚstringÚ	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   rZ   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*   rg   rZ   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   Úinsertrg   rZ   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!   )Úminrh   rG   rn   r   r   r   Ú
cursorDownè   s    zTerminalBuffer.cursorDownc                 C   s   t d| j| ƒ| _d S rl   )rm   rF   rn   r   r   r   ÚcursorBackwardë   s    zTerminalBuffer.cursorBackwardc                 C   s   t | j| j| ƒ| _d S r   )rr   rZ   rF   rn   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   )rk   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   r[   ÿ   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   ÚapplicationKeypadMode3  s    z$TerminalBuffer.applicationKeypadModec                 C   s
   d| _ d S )NÚnumr‰   rJ   r   r   r   ÚnumericKeypadMode6  s    z TerminalBuffer.numericKeypadModec                 C   s   || j |< d S r   )Úcharsets)r   ZcharSetÚwhichr   r   r   ÚselectCharacterSet9  s    z!TerminalBuffer.selectCharacterSetc                 C   s   t j| _d S r   )r   r<   rR   rJ   r   r   r   ÚshiftIn<  s    zTerminalBuffer.shiftInc                 C   s   t j| _d S r   )r   ÚG1rR   rJ   r   r   r   ÚshiftOut?  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   G  s    z3TerminalBuffer.singleShift2.<locals>.insertAtCursor)rR   r   ÚG2rN   ©r   rN   r   r•   r   ÚsingleShift2B  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   S  s    z3TerminalBuffer.singleShift3.<locals>.insertAtCursor)rR   r   ÚG3rN   r˜   r   r•   r   ÚsingleShift3N  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r‚d| jd< qzt	|ƒ}W n$ t
k
r²   | jjd|d	� Y qX t|  krÌtt kràn n|t | jd
< qt|  krútt k�rn 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   ÚNORMALr/   r1   rS   r+   r,   r-   r.   ÚintÚ
ValueErrorÚ_logÚerrorr0   ÚN_COLORSr2   )r   Ú
attributesÚar%   r   r   r   ÚselectGraphicRenditionZ  s@    

ú




 ÿ ÿz%TerminalBuffer.selectGraphicRenditionc                 C   s   |   | j¡| j| j< d S r   )rg   rZ   rE   rG   rJ   r   r   r   Ú	eraseLine~  s    zTerminalBuffer.eraseLinec                 C   s,   | j | j }|  |¡| j| j | jd …< d S r   )rZ   rF   rg   rE   rG   rf   r   r   r   ÚeraseToLineEnd�  s    zTerminalBuffer.eraseToLineEndc                 C   s*   |   | jd ¡| j| j d | jd …< d S rq   )rg   rF   rE   rG   rJ   r   r   r   ÚeraseToLineBeginning…  s    z#TerminalBuffer.eraseToLineBeginningc                    s   ‡ fdd„t ˆ jƒD ƒˆ _d S )Nc                    s   g | ]}ˆ   ˆ j¡‘qS r   ©rg   rZ   ra   rJ   r   r   rd   ‰  s     z/TerminalBuffer.eraseDisplay.<locals>.<listcomp>)re   rh   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ª   ra   rJ   r   r   rd   Ž  s     z4TerminalBuffer.eraseToDisplayEnd.<locals>.<listcomp>)r¨   rh   rG   re   rE   )r   rh   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ª   ra   rJ   r   r   rd   ’  s     z:TerminalBuffer.eraseToDisplayBeginning.<locals>.<listcomp>)r©   re   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   Úextendrg   rr   rZ   rn   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ª   ra   rJ   r   r   rd   ™  s     z-TerminalBuffer.insertLine.<locals>.<listcomp>)re   rE   rG   rh   rn   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ª   ra   rJ   r   r   rd   ž  s     z-TerminalBuffer.deleteLine.<locals>.<listcomp>)rE   rG   r®   re   rn   r   rJ   r   Ú
deleteLineœ  s    zTerminalBuffer.deleteLinec                 C   s   | j | jfS r   rv   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Vectorrz   rF   rG   r\   r…   r†   Z	AUTO_WRAPZCURSOR_MODEZnumericKeypadr<   rR   r/   r1   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)ÚprintÚrepr)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Úfillr3   )r   rE   ÚLrµ   Úlengthr_   r�   r   r   r   Ú	__bytes__À  s    



zTerminalBuffer.__bytes__c                 C   s   t dƒ‚d S )Nz%Unimplemented: TerminalBuffer.getHost©ÚNotImplementedErrorrJ   r   r   r   ÚgetHostÎ  s    zTerminalBuffer.getHostc                 C   s   t dƒ‚d S )Nz%Unimplemented: TerminalBuffer.getPeerr½   rJ   r   r   r   ÚgetPeerÒ  s    zTerminalBuffer.getPeerc                 C   s   t dƒ‚d S )Nz,Unimplemented: TerminalBuffer.loseConnectionr½   rJ   r   r   r   ÚloseConnectionÖ  s    zTerminalBuffer.loseConnectionc                 C   s   t dƒ‚d S )Nz+Unimplemented: TerminalBuffer.writeSequencer½   ©r   rO   r   r   r   ÚwriteSequenceÚ  s    zTerminalBuffer.writeSequencec                 C   s   t dƒ‚d S )Nz5Unimplemented: TerminalBuffer.horizontalTabulationSetr½   rJ   r   r   r   ÚhorizontalTabulationSetÞ  s    ÿz&TerminalBuffer.horizontalTabulationSetc                 C   s   t dƒ‚d S )Nz-Unimplemented: TerminalBuffer.tabulationClearr½   rJ   r   r   r   ÚtabulationClearä  s    zTerminalBuffer.tabulationClearc                 C   s   t dƒ‚d S )Nz0Unimplemented: TerminalBuffer.tabulationClearAllr½   rJ   r   r   r   ÚtabulationClearAllè  s    z!TerminalBuffer.tabulationClearAllTc                 C   s   t dƒ‚d S )Nz.Unimplemented: TerminalBuffer.doubleHeightLiner½   )r   Útopr   r   r   ÚdoubleHeightLineì  s    zTerminalBuffer.doubleHeightLinec                 C   s   t dƒ‚d S )Nz-Unimplemented: TerminalBuffer.singleWidthLiner½   rJ   r   r   r   ÚsingleWidthLineð  s    zTerminalBuffer.singleWidthLinec                 C   s   t dƒ‚d S )Nz-Unimplemented: TerminalBuffer.doubleWidthLiner½   rJ   r   r   r   ÚdoubleWidthLineô  s    zTerminalBuffer.doubleWidthLineN)r!   )r!   )r!   )r!   )r!   )r!   )r!   )T)Hr8   r9   r:   r;   ZkeyIDZ	execBytesÚdecodeZexecStrÚexecZTABZ	BACKSPACErZ   rh   r¹   Úobjectr`   r   r¡   rH   rK   rQ   rT   rN   rg   rV   rk   rp   rs   rt   ru   ry   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²   rI   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)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   Ú_checkExpectedrÂ   r   r   r   rQ     s    zExpectableBuffer.writec                 C   s   t  | ¡ d| _d S rl   )r>   r{   Ú_markrJ   r   r   r   r{     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 rl   )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   ZDeferredZ	callLaterrÔ   rÐ   r*   ÚreÚcompilerÑ   )r   Z
expressionÚtimeoutZ	schedulerrÓ   rÜ   r   r   r   Úexpect"  s    zExpectableBuffer.expect)r8   r9   r:   rÒ   rK   rQ   r{   rÔ   rÑ   r   râ   r   r   r   r   rÏ   ý  s   rÏ   ),r;   rß   rW   Zzope.interfacer   Úincrementalr   Ztwisted.conch.insultsr   Ztwisted.internetr   r   r   Ztwisted.loggerr   Ztwisted.pythonr	   Ztwisted.python.compatr
   Ztwisted.python.deprecater   r   r0   r2   re   r1   ÚREDÚGREENÚYELLOWÚBLUEÚMAGENTAÚCYANr/   r£   Z_FormattingStateMixinr   r=   ZITerminalTransportÚProtocolr>   Ú	ExceptionrÎ   rÏ   Ú__all__r   r   r   r   Ú<module>   s:   Nü	   /