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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   Ú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ü	   /