a
     ³Šad  ã                   @   sˆ   d Z ddlmZ ddlZddlmZ ddl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d
lmZ G dd„ de
ƒZdS )zT
Widget that handles communications between the IPython Console and
the Help plugin
é    )Úabsolute_importN)ÚUnpicklingError)ÚANSI_OR_SPECIAL_PATTERNÚANSI_PATTERN)ÚRichJupyterWidget)Ú
QEventLoop)ÚTimeoutError©ÚgetargspecfromtextÚgetsignaturefromtext)Ú	CommErrorc                   @   sR   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zddd„Zdd„ Z	dd„ Z
dd„ ZdS )Ú
HelpWidgetz‡
    Widget with the necessary attributes and methods to handle communications
    between the IPython Console and the Help plugin
    c                 C   s   t  dd|¡S )zŠ
        Replace invalid variable chars in a string by underscores

        Taken from https://stackoverflow.com/a/3305731/438386
        z
\W|^(?=\d)Ú_)ÚreÚsub)ÚselfÚvar© r   úIlib/python3.9/site-packages/spyder/plugins/ipythonconsole/widgets/help.pyÚclean_invalid_var_chars$   s    z"HelpWidget.clean_invalid_var_charsc                 C   sî   |  di ¡}|  dd¡}|ræ| jdurÈ| jdkrÈt t¡ d|¡}|  |¡ d¡d }| d¡d  d	¡d
  d¡d
 }|r¾| |¡}t|ƒdkr¾|d  d¡d  d	¡d
  d¡d
  	d¡S | 	d¡S t t¡ d|¡}| 	d¡S ndS dS )z-Get documentation from inspect reply content.Údataú
text/plainÚ NÚpythonú(éÿÿÿÿú
Docstring:zType:r   zFile:é   ú
)
ÚgetÚlanguage_namer   Úcompiler   r   Úget_signatureÚsplitÚlenÚstrip)r   Úcontentr   ÚtextÚ	signatureÚdocumentationZdoc_from_signaturer   r   r   Úget_documentation,   sF    
ÿÿÿÿÿ
ÿÿþþþ
zHelpWidget.get_documentationc                 C   s(   d}t |ƒ}|r|| }n
t||ƒ}|S )z4Get signature from text using a given function name.r   r	   )r   Únamer'   r(   Zargspecr   r   r   Ú_get_signatureI   s    

zHelpWidget._get_signaturec                 C   s  |  di ¡}|  dd¡}|r| jdurî| jdkrî| j| j_| j ¡ }|dd…  d¡d }| d¡d }z|  |¡}W n tyŠ   Y n0 | d	¡}|d
 }|  	||¡}|d }|  	||¡}	t
|ƒt
|	ƒkrÔ|}
n|	}
t d|
¡}
|
 d¡S t t¡ d|¡}| d¡S ndS dS )z(Get signature from inspect reply contentr   r   r   Nr   r   r   Ú.r   r   r   )r   r    Z_prompt_posÚ_controlZcurrent_prompt_posZget_current_line_to_cursorr#   r   Ú	Exceptionr,   r$   r   r   r%   r   r!   r   )r   r&   r   r'   Úliner+   Zbefore_textZbefore_signatureZ
after_textZafter_signaturer(   r   r   r   r"   V   s6    
ÿ



zHelpWidget.get_signatureFc                 C   s:   z| j ddj||dW S  ttttfy4   Y dS 0 dS )z Return True if object is definedT©Zblocking)Úforce_importN)Úcall_kernelÚ
is_definedr   r   ÚRuntimeErrorr   )r   Úobjtxtr2   r   r   r   r4   ƒ   s    ÿþzHelpWidget.is_definedc                 C   s6   z| j dd |¡W S  ttttfy0   Y dS 0 dS )z#Get object documentation dictionaryTr1   N)r3   Úget_docr   r   r5   r   ©r   r6   r   r   r   r7   Œ   s    zHelpWidget.get_docc                 C   s6   z| j dd |¡W S  ttttfy0   Y dS 0 dS )zGet object sourceTr1   N)r3   Ú
get_sourcer   r   r5   r   r8   r   r   r   r9   “   s    zHelpWidget.get_sourcec                 C   sž   |   ¡ }| j d¡}|rš|j|d d krš|j| ¡ krš|d }| d¡dkrš| dd¡rš|  |¡}|  |¡}| jd	uo€| jd
k}| j	j
||| jd|d d	S )z†
        Reimplement call tips to only show signatures, using the same
        style from our Editor and External Console too
        Zcall_tipZparent_headerZmsg_idr&   ZstatusÚokÚfoundFNr   é   )r)   ZlanguageZ	max_linesZtext_new_line)Z_get_cursorZ_request_infor   ÚidÚposZpositionr"   r*   r    r.   Zshow_calltip)r   ZrepZcursorÚinfor&   r(   r)   Znew_liner   r   r   Ú_handle_inspect_reply›   s&    ÿ


ÿûz HelpWidget._handle_inspect_replyN)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r*   r,   r"   r4   r7   r9   r@   r   r   r   r   r      s   -
	r   )rD   Z
__future__r   r   Úpickler   Zqtconsole.ansi_code_processorr   r   Zqtconsole.rich_jupyter_widgetr   Zqtpy.QtCorer   Zspyder.py3compatr   Zspyder_kernels.utils.dochelpersr
   r   Zspyder_kernels.comms.commbaser   r   r   r   r   r   Ú<module>   s   