
    \d?              	          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ej"                  Z#e#Z$ e edddd          ddd            eej%                   G d dej&                              Z' G d de(          Z) G 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                   ~    e Zd ZdZdZej        ddddeedfdZ	 e
 edddd                    d	             Z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	                 v    || _         || _        || _        || _        || _        || _        || _        || _        d S Nr   )	selfr   r   r   r   r   r   r   r   s	            <lib/python3.11/site-packages/twisted/conch/insults/helper.py__init__z_FormattingState.__init__3   sD     	"
($$(    Twisted      r   c                 \    |                                 \  }}|                     ||          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vs       r   wantOnez_FormattingState.wantOneG   s+     zz||1""1a(((r!   c                    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        z              | j        t          k    r"|                    t           | j        z              |r.dd                    t%          t&          |                    z   dz   S dS )Nr   z[;m )r   appendr   r   BOLDr   	UNDERLINEr   BLINKr   REVERSE_VIDEOr   WHITE
FOREGROUNDr   BLACK
BACKGROUNDjoinmapstr)r   attrss     r   toVT102z_FormattingState.toVT102V   s     	LLOOO9 	'LL&&&> 	,LL*+++: 	(LL''' 	0LL.///?e##LLdo5666?e##LLdo5666 	=SXXc#uoo666<<rr!   N)__name__
__module____qualname____doc__compareAttributesr   G0r5   r7   r    r   r   r+   r=    r!   r   r   r      s         	 
) ) ) )( Z	2q!,,--) ) .-)    r!   r   r"   r#   r$   z=Use twisted.conch.insults.text.assembleFormattedText instead.ztwisted.conch.insults.helperCharacterAttributec                      e Zd ZdZdD ]'Zedz   Ze                    d          Z ee           (dZ	dZ
dZdZd	Z e            Z e            Zd
 Zd Zd Zd Zd Zd Zd Zd ZdCdZdCdZdCdZdCdZd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d  Z'd! Z(d" Z)d# Z*d$ Z+d% Z,d& Z-d' Z.d( Z/d) Z0d* Z1d+ Z2d, Z3d- Z4d. Z5d/ Z6dCd0Z7dCd1Z8dCd2Z9d3 Z:d4 Z;d5 Z<d6 Z=d7 Z>d8 Z?d9 Z@d: ZAd; ZBd< ZCd= ZDdDd?ZEd@ ZFdA ZGdBS )E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                 (    | j         |         |         S r   )lines)r   xys      r   getCharacterzTerminalBuffer.getCharacter   s    z!}Qr!   c                 .    |                                   d S r   )resetr   s    r   connectionMadezTerminalBuffer.connectionMade   s    

r!   c                 |    t          |                    dd                    D ]}|                     |           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bs      r   writezTerminalBuffer.write   sJ     4<<w7788 	# 	#A""""	# 	#r!   c                 0    t          | j        fi | j        S r   )r   activeCharsetgraphicRenditionrU   s    r   _currentFormattingStatez&TerminalBuffer._currentFormattingState   s     2LLd6KLLLr!   c                 J   |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                  rG|g| j        | j                 | j         | j         <   | j        | j                                                  n|| j        | j                 | j         <   | xj         dz  c_         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   rX   rH   r$   N)rP   _scrollDownstring	printableencodewidthnextLinera   modesgetr   IRMrO   rQ   pop)r   r\   chs      r   rZ   zTerminalBuffer.insertAtCursor   s    ::DFFF%ZZ&"))'2222v##T11334Bz~~gm/00 079d
46"46DF?3
46"&&((((-/
46"46*FFaKFFFF 32r!   c                 :      fdt          |          D             S )Nc                 F    g | ]}j                                         fS rD   )voidra   .0ir   s     r   
<listcomp>z-TerminalBuffer._emptyLine.<locals>.<listcomp>   s,    RRRD88::;RRRr!   )ranger   rh   s   ` r   
_emptyLinezTerminalBuffer._emptyLine   s#    RRRRU5\\RRRRr!   c                     | xj         dz  c_         | j         | j        k    rL| xj         dz  c_         | j        d= | j                            |                     | j                             d S d S )Nr$   r   )rQ   heightrO   r0   rx   rh   rU   s    r   rd   zTerminalBuffer._scrollDown   sj    !6T[  FFaKFF
1Jdoodj99::::: ! r!   c                     | xj         dz  c_         | j         dk     rDd| _         | j        d= | j                            d|                     | j                             d S d S )Nr$   r   )rQ   rO   insertrx   rh   rU   s    r   	_scrollUpzTerminalBuffer._scrollUp   s_    !6A::DF
2Ja!<!<===== :r!   r$   c                 @    t          d| j        |z
            | _        d S Nr   )maxrQ   r   ns     r   cursorUpzTerminalBuffer.cursorUp       Q
##r!   c                 P    t          | j        dz
  | j        |z             | _        d S Nr$   )minrz   rQ   r   s     r   
cursorDownzTerminalBuffer.cursorDown   s#    T[1_dfqj11r!   c                 @    t          d| j        |z
            | _        d S r   )r   rP   r   s     r   cursorBackwardzTerminalBuffer.cursorBackward   r   r!   c                 J    t          | j        | j        |z             | _        d S r   )r   rh   rP   r   s     r   cursorForwardzTerminalBuffer.cursorForward   s    TZ!,,r!   c                 "    || _         || _        d S r   rP   rQ   )r   columnlines      r   cursorPositionzTerminalBuffer.cursorPosition   s    r!   c                 J    | j         j        | _        | j         j        | _        d S r   )homerP   rQ   rU   s    r   
cursorHomezTerminalBuffer.cursorHome   s    r!   c                 .    |                                   d S r   )rd   rU   s    r   indexzTerminalBuffer.index   s    r!   c                 .    |                                   d S r   )r~   rU   s    r   reverseIndexzTerminalBuffer.reverseIndex   s    r!   c                 <    d| _         |                                  dS )zW
        Update the cursor position attributes and scroll down if appropriate.
        r   N)rP   rd   rU   s    r   ri   zTerminalBuffer.nextLine   s#     r!   c                 ,    | j         | j        f| _        d S r   )rP   rQ   _savedCursorrU   s    r   
saveCursorzTerminalBuffer.saveCursor  s    !VTV,r!   c                 2    | j         \  | _        | _        | ` d S r   )r   rP   rQ   rU   s    r   restoreCursorzTerminalBuffer.restoreCursor	  s    *r!   c                 $    |D ]}d| j         |<   d S )NT)rj   r   rj   r.   s      r   setModeszTerminalBuffer.setModes  s(     	! 	!A DJqMM	! 	!r!   c                 B    |D ]}	 | j         |= # t          $ r Y w xY wd S r   )rj   KeyErrorr   s      r   
resetModeszTerminalBuffer.resetModes  sK     	 	AJqMM   	 	   
c                 $    |D ]}d| j         |<   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   s      r   setPrivateModeszTerminalBuffer.setPrivateModes  s-      	( 	(A#'Da  	( 	(r!   c                 B    |D ]}	 | j         |= # t          $ r Y w xY wdS )z
        Disable the given modes.

        @see: L{setPrivateModes}
        @see: L{insults.ITerminalTransport.resetPrivateModes}
        N)r   r   r   s      r   resetPrivateModesz TerminalBuffer.resetPrivateModes&  sP      	 	A%a((   	 	r   c                     d| _         d S )Napp
keypadModerU   s    r   applicationKeypadModez$TerminalBuffer.applicationKeypadMode3      r!   c                     d| _         d S )Nnumr   rU   s    r   numericKeypadModez TerminalBuffer.numericKeypadMode6  r   r!   c                     || j         |<   d S r   )charsets)r   charSetwhichs      r   selectCharacterSetz!TerminalBuffer.selectCharacterSet9  s    &er!   c                 (    t           j        | _        d S r   )r   rC   r_   rU   s    r   shiftInzTerminalBuffer.shiftIn<      $Zr!   c                 (    t           j        | _        d S r   )r   G1r_   rU   s    r   shiftOutzTerminalBuffer.shiftOut?  r   r!   c                 f      j         t          j         _          j         fd}| _        d S )Nc                 0     |            ` _        d S r   rZ   r_   r\   foldActiveCharsetr   s    r   rZ   z3TerminalBuffer.singleShift2.<locals>.insertAtCursorG  $    AaDDD#!1Dr!   )r_   r   G2rZ   r   rZ   r   r   s   ` @@r   singleShift2zTerminalBuffer.singleShift2B  S    -$Z	2 	2 	2 	2 	2 	2 	2
 -r!   c                 f      j         t          j         _          j         fd}| _        d S )Nc                 0     |            ` _        d S r   r   r   s    r   rZ   z3TerminalBuffer.singleShift3.<locals>.insertAtCursorS  r   r!   )r_   r   G3rZ   r   s   ` @@r   singleShift3zTerminalBuffer.singleShift3N  r   r!   c                    |D ]\}|t           j        k    rddddt          t          d| _        ,|t           j        k    rd| j        d<   G|t           j        k    rd| j        d<   b|t           j        k    rd| j        d<   }|t           j        k    rd| j        d<   	 t          |          }t          |cxk    rt          t          z   k    rn n|t          z
  | j        d<   t          |cxk    rt          t          z   k    rn n|t          z
  | j        d	<   | j                            d
|           1# t          $ r  | j                            d
|           Y Zw xY wd S )NFr   r   r   r   r   r   Tr   r   r   r   r   r   z-Unknown graphic rendition attribute: {attr!r})attr)r   NORMALr5   r7   r`   r1   r2   r3   r4   intr6   N_COLORSr8   _logerror
ValueError)r   
attributesar*   s       r   selectGraphicRenditionz%TerminalBuffer.selectGraphicRenditionZ  s    !	 !	AGN""!!&"$)"'"') )%% gl""04%f--g'''59%k22gm##15%g..g+++8<%n55AA "Q????*x*??????>?*n-l;;#qAAAAJ,AAAAAA>?*n-l;;	KRS (     "   IOOGa $     +!	 !	s   D44&EEc                 T    |                      | j                  | j        | j        <   d S r   )rx   rh   rO   rQ   rU   s    r   	eraseLinezTerminalBuffer.eraseLine~  s$    !__TZ88
46r!   c                     | j         | j        z
  }|                     |          | j        | j                 | j        d <   d S r   )rh   rP   rx   rO   rQ   rw   s     r   eraseToLineEndzTerminalBuffer.eraseToLineEnd  s;    
TV#'+u'='=
464688$$$r!   c                 z    |                      | j        dz             | j        | j                 d | j        dz   <   d S r   )rx   rP   rO   rQ   rU   s    r   eraseToLineBeginningz#TerminalBuffer.eraseToLineBeginning  s7    +/??46A:+F+F
46<TVaZ<(((r!   c                 R      fdt           j                  D              _        d S )Nc                 D    g | ]}                     j                  S rD   rx   rh   rr   s     r   ru   z/TerminalBuffer.eraseDisplay.<locals>.<listcomp>  s'    NNNadoodj11NNNr!   )rv   rz   rO   rU   s   `r   eraseDisplayzTerminalBuffer.eraseDisplay  s,    NNNN5;M;MNNN


r!   c                                                          j         j        z
  dz
  } fdt          |          D              j         j        dz   d <   d S )Nr$   c                 D    g | ]}                     j                  S rD   r   rr   s     r   ru   z4TerminalBuffer.eraseToDisplayEnd.<locals>.<listcomp>  s'    #W#W#WADOODJ$?$?#W#W#Wr!   )r   rz   rQ   rv   rO   )r   rz   s   ` r   eraseToDisplayEndz TerminalBuffer.eraseToDisplayEnd  s^    tv%)#W#W#W#Wv#W#W#W
46A:<<   r!   c                                                          fdt           j                  D              j        d  j        <   d S )Nc                 D    g | ]}                     j                  S rD   r   rr   s     r   ru   z:TerminalBuffer.eraseToDisplayBeginning.<locals>.<listcomp>  s'    SSS
 ; ;SSSr!   )r   rv   rQ   rO   rU   s   `r   eraseToDisplayBeginningz&TerminalBuffer.eraseToDisplayBeginning  sI    !!###SSSSU46]]SSS
8TV8r!   c                     | j         | j                 | j        | j        |z   = | j         | j                                     |                     t          | j        | j        z
  |                               d S r   )rO   rQ   rP   extendrx   r   rh   r   s     r   deleteCharacterzTerminalBuffer.deleteCharacter  sb    Jtvtv
23
46!!$//#dj466I12M2M"N"NOOOOOr!   c                       fdt          |          D              j         j         j        <    j         j        d = d S )Nc                 D    g | ]}                     j                  S rD   r   rr   s     r   ru   z-TerminalBuffer.insertLine.<locals>.<listcomp>  s'    &U&U&Uqttz'B'B&U&U&Ur!   )rv   rO   rQ   rz   r   s   ` r   
insertLinezTerminalBuffer.insertLine  sH    &U&U&U&UERSHH&U&U&U
46DF?#Jt{}}%%%r!   c                       j          j         j        |z   =  j                              fdt          |          D                        d S )Nc                 D    g | ]}                     j                  S rD   r   rr   s     r   ru   z-TerminalBuffer.deleteLine.<locals>.<listcomp>  s'    III14??4:66IIIr!   )rO   rQ   r   rv   r   s   ` r   
deleteLinezTerminalBuffer.deleteLine  sQ    Jtv
*+
IIIIaIIIJJJJJr!   c                     | j         | j        fS r   r   rU   s    r   reportCursorPositionz#TerminalBuffer.reportCursorPosition  s    r!   c                 "   t          j        dd          | _        dx| _        | _        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   rP   rQ   rj   r   r   	AUTO_WRAPCURSOR_MODEnumericKeypadrC   r_   r5   r7   r`   CS_USr   r   CS_ALTERNATEr   CS_ALTERNATE_SPECIALr   r   rU   s    r   rT   zTerminalBuffer.reset  s    N1a((	
!+W-A-MN	
 	
 	
 #$Z!!
 !
 JJJ,J4	
 	r!   c                 @    t          dt          |                     d S )NzCould not handle)printrepr)r   bufs     r   unhandledControlSequencez'TerminalBuffer.unhandledControlSequence  s     $s)),,,,,r!   c                 L   g }| j         D ]}g }d}|D ]M\  }}|| j        ur%|                    |           t          |          }3|                    | j                   N|                    d                    |d |                              d                    |          S )Nr   r!   rX   )rO   rq   r0   lenfillr9   )r   rO   Lr  lengthrn   r   s          r   	__bytes__zTerminalBuffer.__bytes__  s     		1 		1ACF * *
TTY&&JJrNNN XXFFJJty))))LL#gvg,//0000zz%   r!   c                      t          d          )Nz%Unimplemented: TerminalBuffer.getHostNotImplementedErrorrU   s    r   getHostzTerminalBuffer.getHost      !"IJJJr!   c                      t          d          )Nz%Unimplemented: TerminalBuffer.getPeerr
  rU   s    r   getPeerzTerminalBuffer.getPeer  r  r!   c                      t          d          )Nz,Unimplemented: TerminalBuffer.loseConnectionr
  rU   s    r   loseConnectionzTerminalBuffer.loseConnection  s    !"PQQQr!   c                      t          d          )Nz+Unimplemented: TerminalBuffer.writeSequencer
  r   r[   s     r   writeSequencezTerminalBuffer.writeSequence  s    !"OPPPr!   c                      t          d          )Nz5Unimplemented: TerminalBuffer.horizontalTabulationSetr
  rU   s    r   horizontalTabulationSetz&TerminalBuffer.horizontalTabulationSet  s    !C
 
 	
r!   c                      t          d          )Nz-Unimplemented: TerminalBuffer.tabulationClearr
  rU   s    r   tabulationClearzTerminalBuffer.tabulationClear      !"QRRRr!   c                      t          d          )Nz0Unimplemented: TerminalBuffer.tabulationClearAllr
  rU   s    r   tabulationClearAllz!TerminalBuffer.tabulationClearAll  s    !"TUUUr!   Tc                      t          d          )Nz.Unimplemented: TerminalBuffer.doubleHeightLiner
  )r   tops     r   doubleHeightLinezTerminalBuffer.doubleHeightLine  s    !"RSSSr!   c                      t          d          )Nz-Unimplemented: TerminalBuffer.singleWidthLiner
  rU   s    r   singleWidthLinezTerminalBuffer.singleWidthLine  r  r!   c                      t          d          )Nz-Unimplemented: TerminalBuffer.doubleWidthLiner
  rU   s    r   doubleWidthLinezTerminalBuffer.doubleWidthLine  r  r!   N)r$   )T)Hr>   r?   r@   rA   keyID	execBytesdecodeexecStrexecTAB	BACKSPACErh   rz   r  objectrq   r	   r   rR   rV   r]   ra   rZ   rx   rd   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   r   r   r   r   r   r   r   rT   r  r  r  r  r  r  r  r  r  r  r   r"  rD   r!   r   rG   rG   x   s          0 N*	""7++W
CIEFD688D688D       # # #M M M  :S S S; ; ;> > >$ $ $ $2 2 2 2$ $ $ $- - - -          - - -  ! ! !  ( ( (            ' ' '( ( (( ( (
- 
- 
-
- 
- 
-" " "H9 9 9> > >G G GO O OX X X
T T TP P P P& & & &K K K K       4- - -! ! !K K KK K KR R RQ Q Q
 
 
S S SV V VT T T TS S SS S S S Sr!   rG   c                       e Zd ZdS )ExpectationTimeoutN)r>   r?   r@   rD   r!   r   r,  r,    s        Dr!   r,  c                   <    e Zd ZdZd Zd Zd Zd Zd Zde	fdZ
dS )	ExpectableBufferr   c                 H    t                               |            g | _        d S r   )rG   rV   
_expectingrU   s    r   rV   zExpectableBuffer.connectionMade   s!    %%d+++r!   c                 d    t                               | |           |                                  d S r   )rG   r]   _checkExpectedr  s     r   r]   zExpectableBuffer.write  s0    T4(((r!   c                 H    t                               |            d| _        d S r   )rG   r   _markrU   s    r   r   zExpectableBuffer.cursorHome  s!    !!$'''


r!   c                 p    |                     t                                 |                                  d S r   )errbackr,  r2  )r   ds     r   _timeoutExpectedz!ExpectableBuffer._timeoutExpected  s3    			$&&'''r!   c                    |                                  | j        d          }| j        r| j        d         \  }}}|r|                                s	| j        d= 7|                    |          D ]t}|r|                                 | j        d= | xj        |                                z  c_        ||                                d          }|                    |            nd S | j        d S d S r   )r  r4  r0  activefinditercancelendcallback)r   sexprtimerdeferredmatchs         r   r2  zExpectableBuffer._checkExpected  s   NNTZ\\*o 	$(OA$6!D% U\\^^ OA&q)) 	 	 #LLNNNOA&

eiikk)

eiikkmm$!!%((( o 	 	 	 	 	r!   Nc                     t          j                    }d }|r|                    || j        |          }| j                            t          j        |          ||f           |                                  |S r   )	r   Deferred	callLaterr8  r0  r0   recompiler2  )r   
expressiontimeout	schedulerr7  rA  s         r   expectzExpectableBuffer.expect"  su    N 	K''1FJJE
: 6 6qABBBr!   )r>   r?   r@   r4  rV   r]   r   r8  r2  r   rL  rD   r!   r   r.  r.    s        E          $ *.      r!   r.  )rE   rG   r.  ),rA   rG  re   zope.interfacer   incrementalr   twisted.conch.insultsr   twisted.internetr   r   r   twisted.loggerr	   twisted.pythonr
   twisted.python.compatr   twisted.python.deprecater   r   r6   r8   rv   r7   REDGREENYELLOWBLUEMAGENTACYANr5   r   _FormattingStateMixinr   rE   ITerminalTransportProtocolrG   	Exceptionr,  r.  __all__rD   r!   r   <module>r`     s  
  
			  & & & & & &       ) ) ) ) ) ) 5 5 5 5 5 5 5 5 5 5 ! ! ! ! ! ! * * * * * * + + + + + + J J J J J J J J

BG%(( ?sE64$xK K K K K< K K K\ &   GIr1a  C"	   W'((}S }S }S }S }SX& }S }S )(}S@	 	 	 	 	 	 	 	, , , , ,~ , , ,^ G
F
Fr!   