o
    Òó·iÊ?  ã                	   @   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   úbC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-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}.
        N)ÚpopitemZ_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__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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ÚgraphicRenditionrL   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   rO   r?   r!   N)rF   Ú_scrollDownÚstringÚ	printableÚencodeÚwidthÚnextLinerW   ÚmodesÚgetr   ZIRMrE   rG   Úpop)r   rS   Úchr   r   r   rQ   ·   s   
÷zTerminalBuffer.insertAtCursorc                    s   ‡ fdd„t |ƒD ƒS )Nc                    s   g | ]	}ˆ j ˆ  ¡ f‘qS r   )ÚvoidrW   ©Ú.0ÚirL   r   r   Ú
<listcomp>Õ   s    z-TerminalBuffer._emptyLine.<locals>.<listcomp>)Úrange©r   r]   r   rL   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   )rG   ÚheightrE   r*   rj   r]   rL   r   r   r   rY   ×   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   éÿÿÿÿ)rG   rE   Úinsertrj   r]   rL   r   r   r   Ú	_scrollUpÞ   s   
ýzTerminalBuffer._scrollUpr!   c                 C   ó   t d| j| ƒ| _d S ©Nr   )ÚmaxrG   ©r   Únr   r   r   ÚcursorUpå   rk   zTerminalBuffer.cursorUpc                 C   s   t | jd | j| ƒ| _d S ©Nr!   )Úminrl   rG   rs   r   r   r   Ú
cursorDownè   s   zTerminalBuffer.cursorDownc                 C   rp   rq   )rr   rF   rs   r   r   r   ÚcursorBackwardë   rk   zTerminalBuffer.cursorBackwardc                 C   s   t | j| j| ƒ| _d S r   )rw   r]   rF   rs   r   r   r   ÚcursorForwardî   ó   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   rL   r   r   r   Ú
cursorHomeõ   s   
zTerminalBuffer.cursorHomec                 C   rJ   r   )rY   rL   r   r   r   Úindexù   rN   zTerminalBuffer.indexc                 C   rJ   r   )ro   rL   r   r   r   ÚreverseIndexü   rN   zTerminalBuffer.reverseIndexc                 C   s   d| _ |  ¡  dS )zW
        Update the cursor position attributes and scroll down if appropriate.
        r   N)rF   rY   rL   r   r   r   r^   ÿ   s   zTerminalBuffer.nextLinec                 C   s   | j | jf| _d S r   )rF   rG   Ú_savedCursorrL   r   r   r   Ú
saveCursor  ó   zTerminalBuffer.saveCursorc                 C   s   | j \| _| _| ` d S r   )r„   rF   rG   rL   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   s,   |D ]}z| j |= W q ty   Y qw 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   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©Z
keypadModerL   r   r   r   ÚapplicationKeypadMode3  ó   
z$TerminalBuffer.applicationKeypadModec                 C   r�   )NÚnumr‘   rL   r   r   r   ÚnumericKeypadMode6  r“   z TerminalBuffer.numericKeypadModec                 C   s   || j |< d S r   )Úcharsets)r   ZcharSetÚwhichr   r   r   ÚselectCharacterSet9  rI   z!TerminalBuffer.selectCharacterSetc                 C   ó   t j| _d S r   )r   r<   rU   rL   r   r   r   ÚshiftIn<  rN   zTerminalBuffer.shiftInc                 C   r™   r   )r   ÚG1rU   rL   r   r   r   ÚshiftOut?  rN   zTerminalBuffer.shiftOutc                    ó.   ˆj ‰tjˆ_ ˆj‰ ‡ ‡‡fdd„}|ˆ_d S )Nc                    ó   ˆ | ƒ ˆ` ˆˆ_d S r   ©rQ   rU   ©rS   ©ÚfZoldActiveCharsetr   r   r   rQ   G  ó   
z3TerminalBuffer.singleShift2.<locals>.insertAtCursor)rU   r   ÚG2rQ   ©r   rQ   r   r¡   r   ÚsingleShift2B  ó
   
zTerminalBuffer.singleShift2c                    r�   )Nc                    rž   r   rŸ   r    r¡   r   r   rQ   S  r£   z3TerminalBuffer.singleShift3.<locals>.insertAtCursor)rU   r   ÚG3rQ   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   ÚNORMALr/   r1   rV   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   )rj   r]   rE   rG   rL   r   r   r   Ú	eraseLine~  r{   zTerminalBuffer.eraseLinec                 C   s,   | j | j }|  |¡| j| j | jd …< d S r   )r]   rF   rj   rE   rG   ri   r   r   r   ÚeraseToLineEnd�  s    zTerminalBuffer.eraseToLineEndc                 C   s*   |   | jd ¡| j| j d | jd …< d S rv   )rj   rF   rE   rG   rL   r   r   r   ÚeraseToLineBeginning…  s   *z#TerminalBuffer.eraseToLineBeginningc                    s   ‡ fdd„t ˆ jƒD ƒˆ _d S )Nc                    ó   g | ]}ˆ   ˆ j¡‘qS r   ©rj   r]   rd   rL   r   r   rg   ‰  ó    z/TerminalBuffer.eraseDisplay.<locals>.<listcomp>)rh   rl   rE   rL   r   rL   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¹   rd   rL   r   r   rg   Ž  rº   z4TerminalBuffer.eraseToDisplayEnd.<locals>.<listcomp>)r¶   rl   rG   rh   rE   )r   rl   r   rL   r   ÚeraseToDisplayEnd‹  s   *z TerminalBuffer.eraseToDisplayEndc                    s0   ˆ   ¡  ‡ fdd„tˆ jƒD ƒˆ jd ˆ j…< d S )Nc                    r¸   r   r¹   rd   rL   r   r   rg   ’  rº   z:TerminalBuffer.eraseToDisplayBeginning.<locals>.<listcomp>)r·   rh   rG   rE   rL   r   rL   r   ÚeraseToDisplayBeginning�  s   (z&TerminalBuffer.eraseToDisplayBeginningc                 C   sD   | j | j | j| j| …= | j | j  |  t| j| j |ƒ¡¡ d S r   )rE   rG   rF   Úextendrj   rw   r]   rs   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¹   rd   rL   r   r   rg   ™  rº   z-TerminalBuffer.insertLine.<locals>.<listcomp>)rh   rE   rG   rl   rs   r   rL   r   Ú
insertLine˜  s   $zTerminalBuffer.insertLinec                    s6   ˆ j ˆ jˆ j| …= ˆ j  ‡ fdd„t|ƒD ƒ¡ d S )Nc                    r¸   r   r¹   rd   rL   r   r   rg   ž  rº   z-TerminalBuffer.deleteLine.<locals>.<listcomp>)rE   rG   r¾   rh   rs   r   rL   r   Ú
deleteLineœ  s   "zTerminalBuffer.deleteLinec                 C   s   | j | jfS r   r|   rL   r   r   r   ÚreportCursorPosition   rN   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Vectorr€   rF   rG   r_   rŒ   r�   Z	AUTO_WRAPZCURSOR_MODEZnumericKeypadr<   rU   r/   r1   rV   ZCS_USr›   r¤   ZCS_ALTERNATEr¨   ZCS_ALTERNATE_SPECIALr–   r»   rL   r   r   r   rK   £  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   ó    rO   )rE   rc   r*   ÚlenÚfillr3   )r   rE   ÚLrÅ   Úlengthrb   r«   r   r   r   Ú	__bytes__À  s   




zTerminalBuffer.__bytes__c                 C   ó   t dƒ‚)Nz%Unimplemented: TerminalBuffer.getHost©ÚNotImplementedErrorrL   r   r   r   ÚgetHostÎ  ó   zTerminalBuffer.getHostc                 C   rÍ   )Nz%Unimplemented: TerminalBuffer.getPeerrÎ   rL   r   r   r   ÚgetPeerÒ  rÑ   zTerminalBuffer.getPeerc                 C   rÍ   )Nz,Unimplemented: TerminalBuffer.loseConnectionrÎ   rL   r   r   r   ÚloseConnectionÖ  rÑ   zTerminalBuffer.loseConnectionc                 C   rÍ   )Nz+Unimplemented: TerminalBuffer.writeSequencerÎ   ©r   rR   r   r   r   ÚwriteSequenceÚ  rÑ   zTerminalBuffer.writeSequencec                 C   rÍ   )Nz5Unimplemented: TerminalBuffer.horizontalTabulationSetrÎ   rL   r   r   r   ÚhorizontalTabulationSetÞ  s   ÿz&TerminalBuffer.horizontalTabulationSetc                 C   rÍ   )Nz-Unimplemented: TerminalBuffer.tabulationClearrÎ   rL   r   r   r   ÚtabulationClearä  rÑ   zTerminalBuffer.tabulationClearc                 C   rÍ   )Nz0Unimplemented: TerminalBuffer.tabulationClearAllrÎ   rL   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Î   rL   r   r   r   ÚsingleWidthLineð  rÑ   zTerminalBuffer.singleWidthLinec                 C   rÍ   )Nz-Unimplemented: TerminalBuffer.doubleWidthLinerÎ   rL   r   r   r   ÚdoubleWidthLineô  rÑ   zTerminalBuffer.doubleWidthLineN)r!   )T)Hr8   r9   r:   r;   ZkeyIDZ	execBytesÚdecodeZexecStrÚexecZTABZ	BACKSPACEr]   rl   rÉ   Úobjectrc   r   r¯   rH   rM   rT   rW   rQ   rj   rY   ro   ru   rx   ry   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¼   r½   r¿   rÀ   rÁ   rÂ   rK   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>   rM   Ú
_expectingrL   r   r   r   rM      ó   

zExpectableBuffer.connectionMadec                 C   s   t  | |¡ |  ¡  d S r   )r>   rT   Ú_checkExpectedrÔ   r   r   r   rT     ó   zExpectableBuffer.writec                 C   s   t  | ¡ d| _d S rq   )r>   r�   Ú_markrL   r   r   r   r�     rã   zExpectableBuffer.cursorHomec                 C   s   |  tƒ ¡ |  ¡  d S r   )Z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 … }| |¡  qJd S | jsd S d S rq   )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æ   rM   rT   r�   rè   rä   r   rö   r   r   r   r   rá   ý  s    rá   )r=   r>   rá   ),r;   ró   rZ   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   rh   r1   ÚREDÚGREENÚYELLOWÚBLUEÚMAGENTAÚCYANr/   r±   Z_FormattingStateMixinr   r=   ZITerminalTransportÚProtocolr>   Ú	Exceptionrà   rá   Ú__all__r   r   r   r   Ú<module>   s<   Nü	   /