a
     ³ŠaÄ-  ã                   @   sÒ   d Z ddlZddlmZ ddlmZ ddlmZ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 ejZejZejZejZejZd
d„ ZG dd„ deƒZdd„ Z G dd„ de!ƒZ"G dd„ deƒZ#dS )zConsole base classé    N)Ú
dark_color)ÚSignal)ÚQColorÚQFontÚQTextCharFormatÚQTextCursor)ÚQApplication)ÚTextEditBaseWidget)ÚANSIEscapeCodeHandler)ÚQStylePaletteÚSpyderPalettec                 C   sb   |  tdƒ¡}|dkrqR|  |d|… |¡ |  ¡ dkr@|  ¡  ||d d… }q |  ||¡ dS )z4Helper to print text, taking into account backspacesé   éÿÿÿÿNr   é   )ÚfindÚchrÚ
insertTextZpositionInBlockZdeletePreviousChar)ÚcursorÚtextZfmtÚindex© r   úElib/python3.9/site-packages/spyder/plugins/console/widgets/console.pyÚinsert_text_to   s    r   c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚQtANSIEscapeCodeHandlerc                 C   s   t  | ¡ d | _d | _d S ©N)r
   Ú__init__Úbase_formatÚcurrent_format©Úselfr   r   r   r   )   s    
z QtANSIEscapeCodeHandler.__init__c                 C   s0   t |ƒrd| _nd| _t |ƒr&d| _nd| _dS )z-Set color scheme (foreground and background).é   é%   é/   é(   N)r   Údefault_foreground_colorZdefault_background_color©r   Úforeground_colorÚbackground_colorr   r   r   Úset_color_scheme.   s    z(QtANSIEscapeCodeHandler.set_color_schemec                 C   s
   || _ d S r   )r   )r   r   r   r   r   Úset_base_format:   s    z'QtANSIEscapeCodeHandler.set_base_formatc                 C   s   | j S r   )r   r   r   r   r   Ú
get_format=   s    z"QtANSIEscapeCodeHandler.get_formatc                 C   s:  | j du r$| jdusJ ‚t| jƒ| _ | jdu r:| j ¡ }n| j| jd  | j }t|ƒ}| j  |¡ | j	du rz| j 
¡ }n| j| j	d  | j }t|ƒ}| j  |¡ | j  ¡ }| jdu rÄ| j ¡ }n| j}| |¡ | jdu rî| j ¡  ¡ }n| j}| |¡ | jdu r| j ¡  ¡ }n| j}| |¡ | j  |¡ dS )z˜
        Set font style with the following attributes:
        'foreground_color', 'background_color', 'italic',
        'bold' and 'underline'
        Nr    r#   )r   r   r   r&   Ú
foregroundZANSI_COLORSZ	intensityr   ÚsetForegroundr'   Ú
backgroundÚsetBackgroundÚfontÚitalicZ
fontItalicÚ	setItalicÚboldÚsetBoldÚ	underlineÚsetUnderlineÚsetFont)r   ZqcolorZcstrr/   r0   r2   r4   r   r   r   Ú	set_style@   s6    








z!QtANSIEscapeCodeHandler.set_styleN)Ú__name__Ú
__module__Ú__qualname__r   r(   r)   r*   r7   r   r   r   r   r   (   s
   r   c                 C   s"   |   |  ¡ |  ¡ d|  ¡  ¡ d S )Néÿ   )ZsetHsvZhueZ
saturationÚvalue)Zcolorr   r   r   Úinverse_colorn   s    r=   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚConsoleFontStylec                 C   s(   || _ || _|| _|| _|| _d | _d S r   )ÚforegroundcolorÚbackgroundcolorr2   r0   r4   Úformat)r   r?   r@   r2   r0   r4   r   r   r   r   s   s    zConsoleFontStyle.__init__c                 C   s~   t ƒ | _| j |¡ t| jƒ}| j |¡ t| jƒ}| j |¡ | j ¡ }| 	| j
¡ | | j¡ | | j¡ | j |¡ d S r   )r   rA   r6   r   r?   r,   r@   r.   r/   r3   r2   r1   r0   r5   r4   )r   r/   Ú
is_defaultr+   r-   r   r   r   Úapply_style|   s    


zConsoleFontStyle.apply_styleN)r8   r9   r:   r   rC   r   r   r   r   r>   r   s   	r>   c                   @   sl   e Zd ZdZdZe d¡Zee	ƒZ
eeeƒZeeƒZddd„Zdd„ Zd	d
„ Zdd„ Zdd„ Zddd„ZdS )ÚConsoleBaseWidgetzConsole base widget)ZsolZeolz\x01?\x1b\[(.*?)m\x02?Nc                    sÚ   t  ˆ |¡ ˆ  d¡ ˆ  d¡ tƒ ˆ _ˆ  d¡ ˆ j ‡ fdd„¡ t	}t
}t}t}t}t||ddddˆ _t||ddddˆ _t||ddddˆ _t||ddddˆ _ˆ jˆ jˆ jˆ jfˆ _ˆ  ||¡ ˆ  d¡ d S )NZconsolei,  Fc                    s   ˆ j  |¡S r   )Úcompletion_widget_activatedÚemit)Zuser_idr   r   r   r   Ú<lambda>¥   ó    z,ConsoleBaseWidget.__init__.<locals>.<lambda>)r?   r@   r2   r0   r4   T)r	   r   ZsetObjectNameZsetMaximumBlockCountr   Úansi_handlerZsetUndoRedoEnabledÚuserListActivatedZconnectÚMAIN_BG_COLORÚMAIN_DEFAULT_FG_COLORÚMAIN_ERROR_FG_COLORÚMAIN_TB_FG_COLORÚMAIN_PROMPT_FG_COLORr>   Údefault_styleÚerror_styleÚtraceback_link_styleÚprompt_styleÚfont_stylesr(   ZsetMouseTracking)r   Úparentr'   r$   Zerror_foreground_colorZtraceback_foreground_colorZprompt_foreground_colorr   r   r   r   –   sL    



ÿýýýýÿzConsoleBaseWidget.__init__c                 C   s8   | j  ||¡ t|ƒ}t|ƒ}| j||d |  ¡  dS )z<Set color scheme of the console (foreground and background).)r-   r+   N)rI   r(   r   Zset_paletteÚset_pythonshell_fontr%   r   r   r   r(   Ã   s    ÿz"ConsoleBaseWidget.set_color_schemec                 C   s   |   ¡  || jj¡ dS )z%Reimplement TextEditBaseWidget methodN)Ú
textCursorr   rP   rA   )r   r   r   r   r   Úinsert_textÐ   s    zConsoleBaseWidget.insert_textc                 C   s&   |   ¡ r|  ¡  |  t ¡  ¡ ¡ dS )zReimplement Qt methodN)Zhas_selected_textZremove_selected_textrX   r   Z	clipboardr   r   r   r   r   ÚpasteÖ   s    zConsoleBaseWidget.pastec              	   C   sö  |   ¡ }| tj¡ d|v r4| dd¡}| dd¡}| tdƒ¡}|dkrLqf||d d… }|  ¡  q4|rd}d}| d	¡D ]–}| 	d
¡rÈ| 	d¡sÈd	}d}| 
d| jj¡ | 
|dd… | jj¡ n4t d|¡g ksèd|v sèd|v rìd	}| 
|| jj¡ |s~| j t||d¡ q~nÂ|r0t||| jjƒ nªd}	| j |¡D ]€}
t|||	|
 ¡ … | jjƒ |
 ¡ }	z2dd„ |
 d¡ d¡D ƒD ]}| j |¡ q„W n ty®   Y n0 | j ¡ | j_q@t|||	d… | jjƒ |   d¡ |  !| jj¡ dS )aB  
        Append text to Python shell
        In a way, this method overrides the method 'insert_text' when text is
        inserted at the end of the text widget for a Python shell

        Handles error messages and show blue underlined links
        Handles ANSI color sequences
        Handles ANSI FF sequence
        úz
Ú
é   r   r   NFTz  Filez	  File "<z  é   z[A-Z].*Warningzwarnings.warnZWARNING)r   Úis_tracebackr   c                 S   s   g | ]}t |ƒ‘qS r   )Úint)Ú.0Z_cr   r   r   Ú
<listcomp>  rH   z:ConsoleBaseWidget.append_text_to_shell.<locals>.<listcomp>ú;Úeof)"rW   ZmovePositionr   ZEndÚreplacer   r   ÚclearÚ
splitlinesÚ
startswithr   rP   rA   rR   ÚreÚfindallrQ   Úsig_exception_occurredrF   Údictr   rS   ÚCOLOR_PATTERNÚfinditerÚstartÚendÚgroupÚsplitrI   Zset_codeÚ
ValueErrorr*   Zset_cursor_positionZsetCurrentCharFormat)r   r   ÚerrorÚpromptr   r   r^   Z
is_warningÚlineZlast_endÚmatchÚcoder   r   r   Úappend_text_to_shellÜ   sf    


ÿÿÿþ
ÿÿ

z&ConsoleBaseWidget.append_text_to_shellc                 C   sB   |du rt ƒ }| jD ]}|j||| ju d q| j | jj¡ dS )zPython Shell onlyN)r/   rB   )r   rT   rC   rP   rI   r)   rA   )r   r/   Zstyler   r   r   rV   *  s    
ÿz&ConsoleBaseWidget.set_pythonshell_font)N)N)r8   r9   r:   Ú__doc__ZBRACE_MATCHING_SCOPErh   Úcompilerl   r   rk   rj   r_   ÚstrrJ   rE   r   r(   rX   rY   rx   rV   r   r   r   r   rD   Š   s   


-NrD   )$ry   rh   Zqtconsole.stylesr   Zqtpy.QtCorer   Z
qtpy.QtGuir   r   r   r   Zqtpy.QtWidgetsr   Z"spyder.plugins.editor.widgets.baser	   Z(spyder.plugins.console.utils.ansihandlerr
   Zspyder.utils.paletter   r   ZCOLOR_BACKGROUND_1rK   ZCOLOR_TEXT_1rL   ZCOLOR_ERROR_1rM   ZCOLOR_ACCENT_3rN   ZCOLOR_SUCCESS_1rO   r   r   r=   Úobjectr>   rD   r   r   r   r   Ú<module>   s$   F