B
    nôb\>’  ã               @   sÜ  d Z ddlZddlmZ ddlZddlZddlmZ ddl	m
Z
mZmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZ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dl-m.Z/ ddl-m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z; ddl<m=Z= ddl>m?Z? ddl@mAZA ddlBmCZC ejDde!dƒdd G dd„ de?ƒZEG dd„ de)ƒZFG dd„ deƒZGG dd „ d eƒZHG d!d"„ d"e
ƒZIG d#d$„ d$e'ƒZJdS )%zHelp Pluginé    N)ÚPYQT5)ÚQThreadÚQUrlÚSignalÚSlot)ÚQActionGroupÚ	QComboBoxÚ	QGroupBoxÚQHBoxLayoutÚQLabelÚ	QLineEditÚQMenuÚQMessageBoxÚQSizePolicyÚQToolButtonÚQVBoxLayoutÚQWidget)ÚQWebEnginePageÚ	WEBENGINE)Údependencies)Ú_Úget_conf_pathÚget_module_source_path)ÚDEFAULT_SMALL_DELTA)ÚSpyderPluginWidget)ÚPluginConfigPage)Úget_meth_class_instÚto_text_string)Úicon_manager)Úprograms)ÚCSS_PATHÚgenerate_contextÚ	sphinxifyÚusageÚwarning)Úadd_actionsÚcreate_actionÚcreate_toolbuttonÚcreate_plugin_layout)ÚFrameWebView)ÚEditableComboBox)ÚFindReplace)Ú
codeeditorÚsphinxzDShow help for objects in the Editor and Consoles in a dedicated panez>=0.6.6)Zrequired_versionc               @   s>   e Zd ZdZeeeƒZdd„ Zddd„Zdd„ Z	dd
d„Z
dS )ÚObjectComboBoxz)
    QComboBox handling object names
    c             C   s2   t  | |¡ || _|  tjtj¡ dddœ| _d S )NÚ )TF)r*   Ú__init__ÚhelpZsetSizePolicyr   Z	ExpandingZFixedÚtips)ÚselfÚparent© r5   ú2lib/python3.7/site-packages/spyder/plugins/help.pyr0   8   s    zObjectComboBox.__init__Nc             C   sÊ   | j  ¡ sdS |dkr|  ¡ }t dt|ƒd¡s4dS t|ƒ}| j  d¡rf| j j}|dk	rf|j	|ddS | j  
¡ }|dk	rÆy
| 	|¡S  tjk
rÄ   | j  
¡ }y
| 	|¡S  tjk
r¾   Y nX Y nX dS )zReturn True if string is validTNz^[a-zA-Z0-9_\.]*$r   FÚautomatic_import)Úforce_import)r1   Úsource_is_consoleÚcurrentTextÚreÚsearchÚstrr   Ú
get_optionÚinternal_shellÚ
is_definedÚ	get_shellÚsocketÚerror)r3   ÚqstrZobjtxtÚshellr5   r5   r6   Úis_valid>   s*    




zObjectComboBox.is_validc             C   s   |   |  ¡ ¡ d S )N)Úvalidater:   )r3   r5   r5   r6   Úvalidate_current_textW   s    z$ObjectComboBox.validate_current_textTc             C   s^   |   |¡}|  ¡ rZ|dk	rZ|r>|  | j| ¡ | j dd¡ n|rL|  ¡  n| j dd¡ dS )z)Reimplemented to avoid formatting actionsNF)rF   ZhasFocusZshow_tipr2   ÚvalidÚemitZselected)r3   rD   ZeditingrI   r5   r5   r6   rG   Z   s    

zObjectComboBox.validate)N)T)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚboolrI   r0   rF   rH   rG   r5   r5   r5   r6   r.   1   s   

r.   c               @   s   e Zd Zdd„ ZdS )ÚHelpConfigPagec             C   s¢  t tdƒƒ}ttdƒƒ}| d¡ |  tdƒd¡}t d¡}t dd¡}| |pR|¡ |sp|sptd	ƒ}| |¡ |  td
ƒd¡}t	ƒ }| 
|¡ | 
|¡ | 
|¡ | |¡ t tdƒƒ}	|  tdƒd¡}
t dd¡}|
 |¡ |st d¡}tdƒ}|dtdƒ|  7 }|
 |¡ t	ƒ }| 
|
¡ |	 |¡ t tdƒƒ}|  tdƒd¡}t	ƒ }| 
|¡ | |¡ t	ƒ }| 
|¡ | 
|	¡ | 
|¡ | d¡ |  |¡ d S )NzAutomatic connectionszÂThis pane can automatically show an object's help information after a left parenthesis is written next to it. Below you can decide to which plugin you want to connect it to turn on this feature.TÚEditorzconnect/editorÚropeÚjediz>=0.8.1z[This feature requires the Rope or Jedi libraries.
It seems you don't have either installed.zIPython Consolezconnect/ipython_consolezAdditional featureszRender mathematical equationsÚmathr-   z>=1.1z-This feature requires Sphinx 1.1 or superior.Ú
z!Sphinx %s is currently installed.zSource codez
Wrap linesÚwrapé   )r	   r   r   ZsetWordWrapZcreate_checkboxr   Úis_module_installedÚ
setEnabledÚ
setToolTipr   Ú	addWidgetÚ	setLayoutÚget_module_versionZ
addStretch)r3   Zconnections_groupZconnections_labelZ
editor_boxZrope_installedZjedi_installedZ
editor_tipZipython_boxZconnections_layoutZfeatures_groupZmath_boxZ
req_sphinxÚ
sphinx_verZ
sphinx_tipZfeatures_layoutZsourcecode_groupZwrap_mode_boxZsourcecode_layoutZvlayoutr5   r5   r6   Ú
setup_pagek   sR    



















zHelpConfigPage.setup_pageN)rK   rL   rM   r_   r5   r5   r5   r6   rP   j   s   rP   c               @   s2   e Zd ZdZdd„ Zddd„Zdd„ Zd	d
„ ZdS )ÚRichTextz)
    WebView widget with find dialog
    c             C   sv   t  | |¡ t| ƒ| _t| ƒ| _| j | jj¡ | j ¡  t	ƒ }| 
dddd¡ | | j¡ | | j¡ |  |¡ d S )Nr   )r   r0   r)   Úwebviewr+   Úfind_widgetÚ
set_editorZ
web_widgetÚhider   ÚsetContentsMarginsr[   r\   )r3   r4   Úlayoutr5   r5   r6   r0   «   s    


zRichText.__init__Nc             C   s   | j j||d dS )zSet font)Ú
fixed_fontN)ra   Úset_font)r3   Úfontrg   r5   r5   r6   rh   ¹   s    zRichText.set_fontc             C   s   | j  ||¡ dS )zSet html textN)ra   ZsetHtml)r3   Ú	html_textÚbase_urlr5   r5   r6   Úset_html½   s    zRichText.set_htmlc             C   s   |   d| j ¡ ¡ d S )Nr/   )rl   ra   Úurl)r3   r5   r5   r6   ÚclearÁ   s    zRichText.clear)N)rK   rL   rM   rN   r0   rh   rl   rn   r5   r5   r5   r6   r`   §   s
   
r`   c               @   s@   e Zd ZdZeƒ Zdd„ Zddd„Zdd„ Zd	d
„ Z	dd„ Z
dS )Ú	PlainTextz2
    Read-only editor widget with find dialog
    c                s²   t  ˆ |¡ d ˆ _t ˆ ¡ˆ _ˆ jjddddd ˆ jj ‡ fdd„¡ ˆ j d¡ t	ˆ ƒˆ _
ˆ j
 ˆ j¡ ˆ j
 ¡  tƒ }| dddd¡ | ˆ j¡ | ˆ j
¡ ˆ  |¡ d S )NFÚpy)ZlinenumbersZlanguageZscrollflagareaZ	edge_linec                  s
   ˆ j  ¡ S )N)Úfocus_changedrJ   r5   )r3   r5   r6   Ú<lambda>Ô   s    z$PlainText.__init__.<locals>.<lambda>Tr   )r   r0   Úeditorr,   Z
CodeEditorZsetup_editorrq   ÚconnectÚsetReadOnlyr+   rb   rc   rd   r   re   r[   r\   )r3   r4   rf   r5   )r3   r6   r0   Ì   s    



zPlainText.__init__Nc             C   s   | j j||d dS )zSet font)Úcolor_schemeN)rs   rh   )r3   ri   rv   r5   r5   r6   rh   â   s    zPlainText.set_fontc             C   s   | j  |¡ dS )zSet color schemeN)rs   Úset_color_scheme)r3   rv   r5   r5   r6   rw   æ   s    zPlainText.set_color_schemec             C   sR   | j  |¡ | j  |¡ |r*| j  d¡ n| j  d ¡ | j  |¡ | j  d¡ d S )Nrp   Zsof)rs   Zset_highlight_current_lineZset_occurrence_highlightingZset_languageÚset_textZset_cursor_position)r3   ÚtextÚis_coder5   r5   r6   rx   ê   s    zPlainText.set_textc             C   s   | j  ¡  d S )N)rs   rn   )r3   r5   r5   r6   rn   ô   s    zPlainText.clear)N)rK   rL   rM   rN   r   rq   r0   rh   rw   rx   rn   r5   r5   r5   r6   ro   Å   s   

ro   c                   sD   e Zd ZdZeeƒZeeƒZd‡ fdd„	Zddd„Z	d	d
„ Z
‡  ZS )ÚSphinxThreada&  
    A worker thread for handling rich text rendering.

    Parameters
    ----------
    doc : str or dict
        A string containing a raw rst text or a dict containing
        the doc string components to be rendered.
        See spyder_kernels.utils.dochelpers.getdoc for description.
    context : dict
        A dict containing the substitution variables for the
        layout template
    html_text_no_doc : unicode
        Text to be rendered if doc string cannot be extracted.
    math_option : bool
        Use LaTeX math rendering.

    r/   c                s*   t t| ƒ ¡  d | _d | _|| _d| _d S )NF)Úsuperr{   r0   ÚdocÚcontextÚhtml_text_no_docÚmath_option)r3   r   )Ú	__class__r5   r6   r0     s
    zSphinxThread.__init__NFc             C   s,   |   ¡ r(|| _|| _|| _|| _|  ¡  dS )z,Start thread to render a given documentationN)Úwaitr}   r~   r€   Úimg_pathÚstart)r3   r}   r~   r€   rƒ   r5   r5   r6   Úrender  s    zSphinxThread.renderc          
   C   sF  | j }| j}|d k	r6t|ƒtkräd| ¡ kräy€t|d |d |d | j| jd}t|d |ƒ}|d dkr¬t	|d |d |d gƒr˜t
dƒ}|d7 }nt
d	ƒ}|d
| 7 }W n2 tk
rà } z| j t|ƒ¡ d S d }~X Y nX nR| jd k	r6yt|| jƒ}W n4 tk
r4 } z| j t|ƒ¡ d S d }~X Y nX | j |¡ d S )NÚ	docstringÚnameÚargspecÚnote)r‡   rˆ   r‰   rT   rƒ   r/   z"No further documentation availablez<div class="hr"></div>zNo documentation availablez<div id="doc-warning">%s</div>)r   r}   ÚtypeÚdictÚkeysr!   r€   rƒ   r"   Úanyr   Ú	ExceptionÚ	error_msgrJ   r   r~   Ú
html_ready)r3   rj   r}   r~   ÚmsgrC   r5   r5   r6   Úrun"  s6    


zSphinxThread.run)r/   )NFr/   )rK   rL   rM   rN   r   r=   r   r   r0   r…   r’   Ú__classcell__r5   r5   )r   r6   r{   ø   s   
r{   c               @   s  e Zd ZdZdZeZeeƒZe	Z
eƒ Zdndd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdodd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zdpd!d"„Zd#d$„ Zd%d&„ Zed'd(„ ƒZd)d*„ Z dqd+d,„Z!d-d.„ Z"e#e$ƒd/d0„ ƒZ%d1d2„ Z&d3d4„ Z'd5d6„ Z(d7d8„ Z)d9d:„ Z*d;d<„ Z+d=d>„ Z,d?d@„ Z-drdBdC„Z.dDdE„ Z/e#ƒ dFdG„ ƒZ0dHdI„ Z1dJdK„ Z2dsdLdM„Z3dtdNdO„Z4dudPdQ„Z5dvdRdS„Z6dTdU„ Z7e#e$ƒdVdW„ ƒZ8e#e$ƒdXdY„ ƒZ9e#e$ƒdZd[„ ƒZ:e#e$ƒd\d]„ ƒZ;e#ƒ d^d_„ ƒZ<d`da„ Z=dbdc„ Z>ddde„ Z?dwdfdg„Z@dhdi„ ZAdjdk„ ZBdxdldm„ZCdS )yÚHelpz"
    Docstrings viewer widget
    r1   Nc                sN  t rtjˆ ||d nt ˆ |¡ d ˆ _d ˆ _ˆ  ¡  tdƒˆ _d ˆ _d ˆ _	t
ˆ ƒˆ _tˆ ƒˆ _ˆ  ¡ }ˆ  ˆ  ¡ |¡ ˆ jj ˆ  d¡¡ tˆ tdƒˆ jdˆ _ˆ j ˆ  d¡¡ ˆ jjj ¡  tˆ jjjˆ jfƒ ˆ  ˆ  d¡¡ d ˆ _dˆ _d d gˆ _d ˆ _tƒ }|  dddd¡ td	ƒ}t!j"d
kr:t#d| ƒ}nt#|ƒ}| $|¡ t%ˆ ƒˆ _&ˆ j& 'tdƒtdƒg¡ ˆ j&j( )ˆ j*¡ t+ ,d¡sªt+ ,dd¡sªˆ j& -¡  | -¡  | $ˆ j&¡ | .d¡ | $t#tdƒƒ¡ t/ˆ ƒˆ _0| $ˆ j0¡ t1ˆ ƒˆ _2ˆ j2 3d¡ | $ˆ j2¡ ˆ j0 4ˆ  d¡¡ ˆ j0 'ˆ  5¡ ¡ ˆ j0 6dd¡ ˆ j0j7 )‡ fdd„¡ dˆ _8ˆ  dd¡ˆ _9tˆ tdƒˆ j:dˆ _;tˆ tdƒˆ j<dˆ _=tˆ tdƒˆ j>dˆ _?t@ˆ ƒ}| Ad¡ | Bˆ j;¡ | Bˆ j?¡ tˆ tdƒˆ jCdˆ _Dˆ  d¡}ˆ jD |¡ tEˆ ˆ jFdˆ _G| $ˆ jG¡ ˆ  H¡  tEˆ tdƒtI Jd ¡d!}| KtLjM¡ tNˆ ƒ}	t|	ˆ j?ˆ j;ˆ j=d ˆ jDgƒ | O|	¡ | $|¡ ˆ j9rŽˆ  P¡  nˆ  Q¡  ˆ j; ˆ j9 ¡ ˆ j? ˆ j9¡ ˆ  *¡  tR|ƒ}
|
 $ˆ j¡ |
 $ˆ j¡ ˆ  S|
¡ tTtUˆ jƒd"ˆ _Vˆ jVjW )ˆ jX¡ ˆ jVjY )ˆ jZ¡ ˆ jj[}t\s6| ]¡  ^t_j`¡ |ja )ˆ jb¡ dˆ _cd S )#N)ÚmainzNo documentation availablerV   z
Wrap lines)ZtoggledÚ	rich_textFr   ZSourceÚdarwinz  ZConsolerQ   rR   rS   z>=0.8.1é
   ZObjectTZmax_history_entriesr/   c                s   ˆ   ¡ S )N)Úforce_refresh)rI   )r3   r5   r6   rr     s    zHelp.__init__.<locals>.<lambda>Ú	rich_modez
Plain TextzShow Sourcez	Rich TextzAutomatic importr7   )Z	triggeredZOptionsZtooloptions)ry   Úicon)r   )dr   r   r0   r?   ÚconsoleZinitialize_pluginr   Úno_doc_stringÚ_last_console_cbÚ_last_editor_cbro   Ú
plain_textr`   r–   Úget_color_schemeÚset_plain_text_fontÚget_plugin_fontrs   Útoggle_wrap_moder>   r&   Úwrap_actionÚ
setCheckedZreadonly_menuZaddSeparatorr%   Úset_rich_text_fontrE   ÚlockedÚ_last_textsÚ_last_editor_docr
   re   ÚsysÚplatformr   r[   r   Úsource_comboZaddItemsZcurrentIndexChangedrt   Úsource_changedr   rX   rd   Z
addSpacingr.   Úcombor   Úobject_editru   ZsetMaxCountÚload_historyZsetItemTextrI   r†   Ú	rich_helpÚtoggle_plain_textÚplain_text_actionÚtoggle_show_sourceÚshow_source_actionÚtoggle_rich_textÚrich_text_actionr   ZsetExclusiveZ	addActionÚtoggle_auto_importÚauto_import_actionr'   Útoggle_lockedÚlocked_buttonÚ_update_lock_iconÚimar›   ZsetPopupModer   ZInstantPopupr   ZsetMenuÚswitch_to_rich_textÚswitch_to_plain_textr(   r\   r{   r$   Ú_sphinx_threadr   Ú_on_sphinx_thread_html_readyr   Ú_on_sphinx_thread_error_msgra   r   ZpageZsetLinkDelegationPolicyr   ZDelegateAllLinksZlinkClickedÚhandle_link_clicksÚ_starting_up)r3   r4   rv   Zlayout_editZtxtZsource_labelZhelp_actionsZauto_import_stateZoptions_buttonZmenurf   Zviewr5   )r3   r6   r0   M  sÆ    






















zHelp.__init__c             C   s   | j  | j j| ¡ dS )z3Action to be performed on first plugin registrationN)r•   Ztabify_pluginsZvariableexplorer)r3   r5   r5   r6   Úon_first_registrationÜ  s    zHelp.on_first_registrationc             C   s   t dƒS )zReturn widget titler”   )r   )r3   r5   r5   r6   Úget_plugin_titleà  s    zHelp.get_plugin_titlec             C   s
   t  d¡S )zReturn widget iconr1   )r¾   r›   )r3   r5   r5   r6   Úget_plugin_iconä  s    zHelp.get_plugin_iconc             C   s   | j  ¡  ¡  | j S )zq
        Return the widget to give focus to when
        this plugin's dockwidget is raised on top-level
        )r¯   ZlineEditZ	selectAll)r3   r5   r5   r6   Úget_focus_widgetè  s    zHelp.get_focus_widgetc             C   s   g S )z*Return a list of actions related to pluginr5   )r3   r5   r5   r6   Úget_plugin_actionsð  s    zHelp.get_plugin_actionsc             C   sD   | j  | jj¡ | j | ¡ | jj | ¡ | jjj| _| jj| _dS )z'Register plugin in Spyder's main windowN)	rq   rt   r•   Zplugin_focus_changedZadd_dockwidgetrœ   Zset_helprE   r?   )r3   r5   r5   r6   Úregister_pluginô  s
    zHelp.register_pluginFc             C   s   dS )z3Perform actions before parent main window is closedTr5   )r3   Z
cancelabler5   r5   r6   Úclosing_pluginý  s    zHelp.closing_pluginc             C   s    | j rd| _ |  ¡  |  ¡  dS )zRefresh widgetFN)rÅ   r¿   Úshow_intro_message)r3   r5   r5   r6   Úrefresh_plugin  s    zHelp.refresh_pluginc             C   s8   |   ¡ }|  ¡ }| jdd}| j||d |  |¡ dS )zUpdate font from PreferencesT)r–   )rv   N)r¡   r£   r¢   r§   )r3   rv   ri   Z	rich_fontr5   r5   r6   Úupdate_font  s
    zHelp.update_fontc       	      C   s–   d}|   ¡ }d}d}|  |¡}| j |¡ d}|  |¡}||krJ|  |¡ ||kr\|  |¡ ||krn|  |¡ | jjj	|gd | jj
j	|gd dS )z*Apply configuration file's plugin settingsZcolor_scheme_nameZconnect_to_oirV   rT   )ÚoptionsN)r¡   r>   r¥   r¦   Úset_plain_text_color_schemer¤   Útoggle_math_moder•   rs   Úapply_plugin_settingsÚ
ipyconsole)	r3   rÐ   Zcolor_scheme_nZcolor_scheme_oZ	connect_nZwrap_nZwrap_oZmath_nZmath_or5   r5   r6   rÓ     s     




zHelp.apply_plugin_settingsc             C   s   | j  ¡ dkS )z Return True if source is Consoler   )r­   ÚcurrentIndex)r3   r5   r5   r6   r9   (  s    zHelp.source_is_consolec             C   s   | j  d¡ d S )NrW   )r­   ÚsetCurrentIndex)r3   r5   r5   r6   Úswitch_to_editor_source,  s    zHelp.switch_to_editor_sourcec             C   s   | j  d¡ d S )Nr   )r­   rÖ   )r3   r5   r5   r6   Úswitch_to_console_source/  s    zHelp.switch_to_console_sourcec             C   sn   |   ¡ r6| j ¡  | j ¡  | j d¡ | j d¡ n,| j ¡  | j ¡  | j d¡ | j d¡ |  	¡  d S )NT)
r9   r¯   Úshowr°   rd   r¶   rY   rº   ZsetDisabledÚrestore_text)r3   Úindexr5   r5   r6   r®   2  s    



zHelp.source_changedc             C   s   |   ¡ r|| _n|| _d S )N)r9   rž   rŸ   )r3   Úcallbackr5   r5   r6   Ú	save_textA  s    zHelp.save_textc             C   s~   |   ¡ r| j}n| j}|d kr>|  ¡ r2| j ¡  qz| j ¡  n<|d }|dd … }||Ž  t|ƒ| jkrr|  ¡  n|  	¡  d S )Nr   rW   )
r9   rž   rŸ   Úis_plain_text_moder    rn   r–   r   r¿   rÀ   )r3   ÚcbÚfuncÚargsr5   r5   r6   rÚ   G  s    
zHelp.restore_textc             C   s   | j  ¡ r| j jS | jjS d S )N)r    Ú	isVisiblerb   r–   )r3   r5   r5   r6   rb   [  s    
zHelp.find_widgetc             C   s   | j j||  ¡ d dS )zSet rich text mode font)rg   N)r–   rh   r£   )r3   ri   r5   r5   r6   r§   b  s    zHelp.set_rich_text_fontc             C   s   | j j||d dS )zSet plain text mode font)rv   N)r    rh   )r3   ri   rv   r5   r5   r6   r¢   f  s    zHelp.set_plain_text_fontc             C   s   | j  |¡ dS )z Set plain text mode color schemeN)r    rw   )r3   rv   r5   r5   r6   rÑ   j  s    z Help.set_plain_text_color_schemec             C   s   | j j |¡ |  d|¡ dS )zToggle wrap moderV   N)r    rs   r¤   Ú
set_option)r3   Úcheckedr5   r5   r6   r¤   n  s    zHelp.toggle_wrap_modec             C   s   |   d|¡ dS )zToggle math moderT   N)rã   )r3   rä   r5   r5   r6   rÒ   t  s    zHelp.toggle_math_modec             C   s
   | j  ¡ S )z(Return True if plain text mode is active)r    râ   )r3   r5   r5   r6   rÞ   x  s    zHelp.is_plain_text_modec             C   s
   | j  ¡ S )z'Return True if rich text mode is active)r–   râ   )r3   r5   r5   r6   Úis_rich_text_mode|  s    zHelp.is_rich_text_modec             C   s*   d| _ | j ¡  | j ¡  | j d¡ dS )zSwitch to plain text modeFTN)r²   r    rÙ   r–   rd   r´   r¦   )r3   r5   r5   r6   rÀ   €  s    

zHelp.switch_to_plain_textc             C   s6   d| _ | j ¡  | j ¡  | j d¡ | j d¡ dS )zSwitch to rich text modeTFN)r²   r    rd   r–   rÙ   r¸   r¦   r¶   )r3   r5   r5   r6   r¿   ‡  s
    

zHelp.switch_to_rich_textc          	   C   sÌ   t |ƒtkr¢|d }|r@d dt|ƒ d|ddt|ƒ dg¡}nd}|d rdd d||d dg¡}nd}|d r†d d	|d d
g¡}nd}d ||||d g¡}n|}| j ||¡ |  | jj||g¡ dS )zSet plain text docsr‡   r/   ú=rU   z

rˆ   zDefinition: r‰   zType: z

----

r†   N)rŠ   r‹   ÚjoinÚlenr    rx   rÝ   )r3   ry   rz   r‡   Z	rst_titleZ
definitionr‰   Z	full_textr5   r5   r6   Úset_plain_text  s$    

zHelp.set_plain_textc             C   s&   | j  ||¡ |  | j j||g¡ dS )zSet rich textN)r–   rl   rÝ   )r3   rj   rk   r5   r5   r6   Úset_rich_text_html®  s    zHelp.set_rich_text_htmlc             C   s´   t dƒ}t dƒ}tjdkr d}nd}|  ¡ r€t dƒ}t dƒ}t dƒ}|d	| d
 dd| d f }|  t||||ƒt t¡¡ n0dt dƒ }||d|f }||7 }| j	|dd d S )NzçHere you can get help of any object by pressing %s in front of it, either on the Editor or the Console.%sHelp can also be shown automatically after writing a left parenthesis next to an object. You can activate this behavior in %s.zPreferences > Helpr—   zCmd+IzCtrl+IZUsagezNew to Spyder? Read ourÚtutorialz<b>z</b>z<br><br>z<i>z</i>z

%szMPlease consider installing Sphinx to get documentation rendered in rich text.z

F)rz   )
r   r«   r¬   rå   rê   r#   r   ÚfromLocalFiler    ré   )r3   Zintro_messageZprefsZshortcutÚtitleZtutorial_messagerë   Zinstall_sphinxr5   r5   r6   rÍ   ³  s$    

zHelp.show_intro_messager/   c             C   s,   |   ¡  |  ¡  t||d}|  ||¡ dS )zShow text in rich mode)Úcollapserƒ   N)Úswitch_to_pluginr¿   r!   Úrender_sphinx_doc)r3   ry   rî   rƒ   r~   r5   r5   r6   Úshow_rich_textÑ  s    zHelp.show_rich_textc             C   s"   |   ¡  |  ¡  | j|dd dS )zShow text in plain modeF)rz   N)rï   rÀ   ré   )r3   ry   r5   r5   r6   Úshow_plain_textØ  s    zHelp.show_plain_textc             C   s:   |   ¡  tdƒ}t |d¡}t|ƒ ¡ }| j|dd dS )zAShow the Spyder tutorial in the Help plugin, opening it if neededzspyder.utils.helpztutorial.rstT)rî   N)rï   r   Úosprç   ÚopenÚreadrñ   )r3   Ztutorial_pathrë   ry   r5   r5   r6   Úshow_tutorialÞ  s
    zHelp.show_tutorialc             C   sJ   t | ¡ ƒ}|dkr|  ¡  n(| d¡r4t |¡ n| jj t	|ƒ¡ d S )Nzspy://tutorialZhttp)
r   ZtoStringrö   Ú
startswithr   Z
start_filer–   ra   Úloadr   )r3   rm   r5   r5   r6   rÄ   ç  s    

zHelp.handle_link_clicksc             C   s6   |   ¡ r| jd dd n| jd k	r2| j| jdd d S )NT)r™   )r9   Úset_object_textrª   Úset_editor_doc)r3   r5   r5   r6   r™   ñ  s    
zHelp.force_refreshc             C   s¨   | j r|sdS |  ¡  d}|dkr4t| j ¡ ƒ}d}| j||d}|rN|sNdS |r^| j |¡ |rj|  ¡  | jdk	r€| j 	d¡ | j
||d | jdk	r¤| j 	d¡ dS )zSet object analyzed by HelpNTF)Úignore_unknown)Úforce)r¨   rØ   r   r¯   r:   Ú	show_helpZadd_textÚsave_historyÚ
dockwidgetÚblockSignalsÚ_Help__eventually_raise_help)r3   ry   r™   rû   Zadd_to_comboÚfoundr5   r5   r6   rù   ÷  s&    


zHelp.set_object_textc             C   sŽ   | j r|sdS |  ¡  || _| j |d ¡ | jr>|  |¡ n| j|dd | jdk	rb| j 	d¡ | j
|d |d | jdk	rŠ| j 	d¡ dS )z„
        Use the help plugin to show docstring dictionary computed
        with introspection plugin from the Editor plugin
        NÚobj_textF)rz   Tr†   )rü   )r¨   r×   rª   r°   ZsetTextr²   rð   ré   rÿ   r   r  )r3   r}   r™   r5   r5   r6   rú     s    


zHelp.set_editor_docc             C   sŒ   | j  ¡ }t| jdƒr~| jr~|s*| j ¡ r~| js~|sB|| j| kr~| j | j¡}| j	j|kr~| jj
d k	r~| jj
j|kr~|  ¡  || j|< d S )NÚtabifiedDockWidgets)r­   rÕ   Úhasattrr•   rÿ   râ   Zismaximizedr©   r  rœ   rÔ   rï   )r3   ry   rü   rÛ   Zdockwidgetsr5   r5   r6   Z__eventually_raise_help'  s    
zHelp.__eventually_raise_helpc             C   s0   t  | j¡r(dd„ t| jdƒ ¡ D ƒ}ng }|S )z4Load history from a text file in user home directoryc             S   s   g | ]}|  d d¡‘qS )rU   r/   )Úreplace)Ú.0Úliner5   r5   r6   ú
<listcomp>8  s   z%Help.load_history.<locals>.<listcomp>Úr)ró   ÚisfileÚLOG_PATHrô   Ú	readlines)r3   ÚobjÚhistoryr5   r5   r6   r±   5  s
    zHelp.load_historyc          	      sR   y4t ˆ jdƒ d ‡ fdd„tˆ j ¡ ƒD ƒ¡¡ W n ttfk
rL   Y nX dS )z2Save history to a text file in user home directoryÚwrU   c                s   g | ]}t ˆ j |¡ƒ‘qS r5   )r   r¯   ZitemText)r  rÛ   )r3   r5   r6   r	  B  s   z%Help.save_history.<locals>.<listcomp>N)	rô   r  Úwriterç   Úranger¯   ÚcountÚUnicodeDecodeErrorÚEnvironmentError)r3   r5   )r3   r6   rþ   >  s    
zHelp.save_historyc             C   s,   |r|| _ |  ¡  |  ¡  |  d| ¡ dS )zToggle plain text docstringrš   N)r†   rÀ   r™   rã   )r3   rä   r5   r5   r6   r³   G  s
    zHelp.toggle_plain_textc             C   s.   |r|   ¡  | | _|  ¡  |  d| ¡ dS )zToggle show source coderš   N)rÀ   r†   r™   rã   )r3   rä   r5   r5   r6   rµ   P  s
    zHelp.toggle_show_sourcec             C   s$   |r| | _ |  ¡  |  d|¡ dS )z3Toggle between sphinxified docstrings or plain onesrš   N)r†   r¿   rã   )r3   rä   r5   r5   r6   r·   Y  s    zHelp.toggle_rich_textc             C   s"   | j  ¡  |  d|¡ |  ¡  dS )zToggle automatic import featurer7   N)r¯   rH   rã   r™   )r3   rä   r5   r5   r6   r¹   a  s    
zHelp.toggle_auto_importc             C   s   | j  | _ |  ¡  dS )zP
        Toggle locked state
        locked = disable link with Console
        N)r¨   r½   )r3   r5   r5   r6   r»   h  s    
zHelp.toggle_lockedc             C   sL   | j rt d¡nt d¡}| j |¡ | j r4tdƒntdƒ}| j |¡ dS )zUpdate locked state iconÚlockZ	lock_openZUnlockZLockN)r¨   r¾   r›   r¼   ZsetIconr   rZ   )r3   r›   Ztipr5   r5   r6   r½   q  s    zHelp._update_lock_iconc             C   s
   || _ dS )zBind to shellN)rE   )r3   rE   r5   r5   r6   Ú	set_shellx  s    zHelp.set_shellc             C   sp   t | jdƒr"t | jdƒrj| j ¡ sjd| _| jjdk	rX| jj ¡ }|dk	rX|jdk	rX|| _| jdkrj| j| _| jS )z{
        Return shell which is currently bound to Help,
        or another running shell if it has been terminated
        Úget_docÚ
is_runningN)r  rE   r  r•   rÔ   Zget_current_shellwidgetZkernel_clientr?   )r3   rE   r5   r5   r6   rA   |  s    

zHelp.get_shellc             C   sD   | j jdk	r$| j j ¡ }t |¡}nd}| j |||  d¡|¡ dS )z3Transform doc string dictionary to HTML and show itNr/   rT   )r•   rs   Zget_current_filenameró   ÚdirnamerÁ   r…   r>   )r3   r}   r~   ÚfnameZdnamer5   r5   r6   rð     s    zHelp.render_sphinx_docc             C   s    | j  ¡  |  |t t¡¡ dS )z3Set our sphinx documentation based on thread resultN)rÁ   r‚   rê   r   rì   r    )r3   rj   r5   r5   r6   rÂ   ˜  s    
z!Help._on_sphinx_thread_html_readyc             C   sB   | j  ¡  | j d¡ t d¡}t | tdƒtdƒ||f ¡ dS )z2 Display error message on Sphinx rich text failureTr-   r”   z•The following error occured when calling <b>Sphinx %s</b>. <br>Incompatible Sphinx version or doc string decoding failed.<br><br>Error message:<br>%sN)	rÁ   r‚   r´   r¦   r   r]   r   Zcriticalr   )r3   r   r^   r5   r5   r6   rÃ     s    

z Help._on_sphinx_thread_error_msgc             C   sú   |   ¡ }|dkrdS t|ƒ}| |¡sT|  d¡rH| jj|ddrH| j}nd}d}d}|dk	rp| |¡}| |¡}d}| jrŒ|  |¡ |dk	S | j	rº|}|dkrè|}|dkrè| j
}|rèdS n.|}|dkrä|}|dkrètdƒ}|rèdS nd}| j||d dS )z	Show helpNr7   T)r8   FzNo source code available.)rz   )rA   r   r@   r>   r?   r  Ú
get_sourcer²   rð   r†   r   r   ré   )r3   r  rû   rE   r}   Zsource_textrz   Zhlp_textr5   r5   r6   rý   ª  sH    




zHelp.show_help)N)F)N)N)Fr/   )FF)F)F)N)N)F)DrK   rL   rM   rN   ZCONF_SECTIONrP   ZCONFIGWIDGET_CLASSr   r  r   ZFONT_SIZE_DELTAr   rq   r0   rÆ   rÇ   rÈ   rÉ   rÊ   rË   rÌ   rÎ   rÏ   rÓ   r9   r×   rØ   r®   rÝ   rÚ   Úpropertyrb   r§   r¢   rÑ   r   rO   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  rA   rð   rÂ   rÃ   rý   r5   r5   r5   r6   r”   A  sv   
 	
	


	




					
r”   )KrN   r;   Úos.pathÚpathró   rB   r«   Zqtpyr   Zqtpy.QtCorer   r   r   r   Zqtpy.QtWidgetsr   r   r	   r
   r   r   r   r   r   r   r   r   Zqtpy.QtWebEngineWidgetsr   r   Zspyderr   Zspyder.config.baser   r   r   Zspyder.config.fontsr   Zspyder.pluginsr   Zspyder.plugins.configdialogr   Zspyder.py3compatr   r   Zspyder.utilsr   r¾   r   Zspyder.utils.help.sphinxifyr    r!   r"   r#   r$   Zspyder.utils.qthelpersr%   r&   r'   r(   Zspyder.widgets.browserr)   Zspyder.widgets.comboboxesr*   Zspyder.widgets.findreplacer+   Zspyder.widgets.sourcecoder,   Úaddr.   rP   r`   ro   r{   r”   r5   r5   r5   r6   Ú<module>   s<   89=3I