a
     ³Ša8  ã                   @   sl  d Z ddlmZ ddlZddlZddlmZmZm	Z	m
Z
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mZ dd
lmZmZ ddlmZ ddl m!Z! edƒZ"dZ#G dd„ dƒZ$G dd„ dƒZ%G dd„ dƒZ&ddgZ'z$ddlm(Z( di fdd„Z)e)e_(W n e*y.   Y n0 G dd„ deƒZ+G dd„ deƒZ,dd„ Z-e.d krhe-ƒ  dS )!z
PyDoc widget.
é    N)ÚQtÚQThreadÚQUrlÚSignalÚSlot)ÚQCursor)Ú	WEBENGINE)ÚQApplicationÚQLabelÚQVBoxLayout)Úget_translation)ÚPluginMainWidget)Ú_start_serverÚ_url_handler)ÚFrameWebViewÚWebViewActions)ÚUrlComboBox)ÚFindReplaceZspyderi°u  c                   @   s   e Zd ZdZdZdS )ÚPydocBrowserActionsÚhome_actionÚfind_actionN)Ú__name__Ú
__module__Ú__qualname__ÚHomeÚFind© r   r   ú@lib/python3.9/site-packages/spyder/plugins/onlinehelp/widgets.pyr   (   s   r   c                   @   s   e Zd ZdZdS )ÚPydocBrowserMainToolbarSectionsZmain_sectionN)r   r   r   ÚMainr   r   r   r   r   .   s   r   c                   @   s   e Zd ZdZdZdS )ÚPydocBrowserToolbarItemsZpackage_labelÚ	url_comboN)r   r   r   ÚPackageLabelÚUrlCombor   r   r   r   r    2   s   r    Znumpyz
numpy.core)Ú
safeimportc                 C   s   | t v rd}t| ||dS )Nr   )Ú	forceloadÚcache)ÚDIRECT_PYDOC_IMPORT_MODULESr$   )Úpathr%   r&   r   r   r   Úspyder_safeimportA   s    r)   c                   @   sF   e Zd ZdZeƒ Zdd„ Zdd„ Zdd„ Zdd	„ Z	d
d„ Z
dd„ ZdS )ÚPydocServerz
    Pydoc server.
    c                 C   s&   t  | ¡ || _d | _d| _d| _d S )NF)r   Ú__init__ÚportÚserverÚcompleteÚclosed)Úselfr,   r   r   r   r+   Q   s
    
zPydocServer.__init__c                 C   s   |   ttd| jd¡ d S )Nz	127.0.0.1)Zhostnamer,   )Úcallbackr   r   r,   ©r0   r   r   r   ÚrunY   s    ýÿzPydocServer.runc                 C   s$   || _ | jr|  ¡  n
| j ¡  d S ©N)r-   r/   Úquit_serverÚsig_server_startedÚemit)r0   r-   r   r   r   r1   b   s    
zPydocServer.callbackc                 C   s
   d| _ d S ©NT)r.   r2   r   r   r   Ú	completeri   s    zPydocServer.completerc                 C   s"   |   ¡ rdS | jdu rdS | jjS )zCheck if the server is runningTNF)Ú	isRunningr-   Úservingr2   r   r   r   Ú
is_runningl   s
    
zPydocServer.is_runningc                 C   s*   d| _ | jd u rd S | jjr&| j ¡  d S r8   )r/   r-   r;   Ústopr2   r   r   r   r5   w   s
    
zPydocServer.quit_serverN)r   r   r   Ú__doc__r   r6   r+   r3   r1   r9   r<   r5   r   r   r   r   r*   K   s   	r*   c                       s  e Zd ZdZdZeƒ Zd<‡ fdd„	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dd„ Zdd„ Zdd„ Zdd„ Zeeƒd=dd„ƒ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d0d1„ Zd2d3„ Z eƒ d4d5„ ƒZ!d6d7„ Z"d8d9„ Z#eeƒd:d;„ ƒZ$‡  Z%S )>ÚPydocBrowserzPyDoc browser widget.TNc                    sz  t ƒ j|||d dˆ _d ˆ _d ˆ _ttdƒƒˆ _tj	ˆ j_
tˆ tjdˆ _tˆ ˆ  d¡dˆ _tˆ ƒˆ _ˆ j ˆ j¡ ˆ j ¡  ˆ j ˆ  d¡¡ tdƒ}ˆ j ¡  |¡ ˆ j ¡  |¡ ˆ j ¡  ˆ j ˆ  d	¡¡ tƒ }| ˆ j¡ | d
¡ | ˆ j¡ ˆ  |¡ ˆ jj  ‡ fdd„¡ ˆ jj!  ˆ j"¡ ˆ jj#  ˆ j$¡ ˆ jj%  ˆ j&¡ ˆ jj'  ˆ j(¡ t)svˆ jj*  ˆ j+¡ d S )N)ÚparentFúPackage:)Zid_Úhandle_links)rB   Zmax_history_entriesz&Write a package name here, e.g. pandasZzoom_factoré   c                    s   ˆ   ¡ S r4   )Ú_handle_url_combo_activation)Úxr2   r   r   Ú<lambda>³   ó    z'PydocBrowser.__init__.<locals>.<lambda>),Úsuperr+   Ú_is_runningÚhome_urlr-   r
   Ú_Úlabelr    r"   ZIDr   r#   r!   r   Zget_confÚwebviewr   Úfind_widgetZ
set_editorÚhideZsetMaxCountÚlineEditZsetPlaceholderTextZ
setToolTipÚsetupZset_zoom_factorr   Z	addWidgetZ
addSpacingZ	setLayoutZvalidÚconnectZloadStartedÚ_startZloadFinishedÚ_finishZtitleChangedZsetWindowTitleZ
urlChangedÚ_change_urlr   ZiconChangedÚ_handle_icon_change)r0   ÚnameÚpluginr@   ÚtipZlayout©Ú	__class__r2   r   r+   Œ   sH    
ÿþ





ÿzPydocBrowser.__init__c                 C   s   t dƒS )NzOnline help©rK   r2   r   r   r   Ú	get_title¾   s    zPydocBrowser.get_titlec                 C   s   | j  ¡  ¡  | j S r4   )r!   rP   Z	selectAllr2   r   r   r   Úget_focus_widgetÁ   s    zPydocBrowser.get_focus_widgetc           	      C   s
  | j tjtdƒtdƒ|  d¡| jd}| j tjtdƒtdƒ|  d¡| jdd}|  t	j
¡}|  t	j¡}|  ¡ }|  t	j¡|  t	j¡|||| j| j|  t	j¡|  t	j¡|f
D ]}| j||tjd	 qª| jj |j¡ |  ¡  ¡ D ]\}}|rÞ| j |¡ qÞ| j | j¡ d S )
Nr   Úhome)ÚtextrY   ÚiconZ	triggeredr   z	Find textÚfindF)r`   rY   ra   ZtoggledÚinitial)ÚtoolbarZsection) Zcreate_actionr   r   rK   Zcreate_iconÚgo_homer   Útoggle_find_widgetÚ
get_actionr   ÚStopÚRefreshZget_main_toolbarZBackZForwardrL   r!   ZZoomInZZoomOutZadd_item_to_toolbarr   r   rN   Zvisibility_changedrR   Z
setCheckedZget_actionsÚitemsrM   Z	addActionÚsig_toggle_view_changedÚ
initialize)	r0   r   r   Ústop_actionÚrefresh_actionrd   ÚitemÚ__Úactionr   r   r   rQ   Å   sD    ûú

üýzPydocBrowser.setupc                 C   s6   |   tj¡}|   tj¡}| | j ¡ | | j¡ d S r4   )rg   r   rh   ri   Z
setVisiblerI   )r0   rm   rn   r   r   r   Úupdate_actionsô   s    zPydocBrowser.update_actionsc                 C   s   d| _ |  ¡  |  ¡  dS )zWebview load started.TN)rI   Zstart_spinnerrr   r2   r   r   r   rS   ý   s    zPydocBrowser._startc                 C   s$   d| _ |  ¡  |  ¡  | j ¡  dS )zWebview load finished.FN)rI   Zstop_spinnerrr   Úsig_load_finishedr7   )r0   Úcoder   r   r   rT     s    zPydocBrowser._finishc                 C   s   |   ¡  t ¡  dS )zLoad home page.N)re   r	   ZrestoreOverrideCursorr2   r   r   r   Ú_continue_initialization
  s    z%PydocBrowser._continue_initializationc                 C   sF   | j s&t| j ¡ ƒ}|  |  |¡¡ n|  tj¡ 	¡  |  
¡  ¡  dS )z#Load URL from combo box first item.N)rI   Ústrr!   ZcurrentTextÚgo_toÚtext_to_urlrg   r   rh   Ztriggerr^   ZsetFocus©r0   r`   r   r   r   rD     s
    z)PydocBrowser._handle_url_combo_activationc                 C   s   | j  |  |¡¡ dS )zF
        Displayed URL has changed -> updating URL combo box.
        N)r!   Zadd_textÚurl_to_text©r0   Úurlr   r   r   rU     s    zPydocBrowser._change_urlc                 C   s.   | j  | j  ¡ | j ¡ ¡ |  | j ¡ ¡ dS )z&
        Handle icon changes.
        N)r!   ZsetItemIconZcurrentIndexrM   ra   ZsetWindowIconr2   r   r   r   rV     s    ÿz PydocBrowser._handle_icon_changec                 C   s   | j  ¡  | ¡  d S r4   )r-   r5   Zaccept)r0   Zeventr   r   r   Ú
closeEvent)  s    
zPydocBrowser.closeEventc                 C   s   | j  |¡ dS )z€
        Load history.

        Parameters
        ----------
        history: list
            List of searched items.
        N)r!   ZaddItems)r0   Úhistoryr   r   r   Úload_history/  s    	zPydocBrowser.load_historyc                 C   s@   |r<| j du r<| j | j¡ t ttjƒ¡ t 	¡  |  
¡  dS )a/  
        Start pydoc server.

        Parameters
        ----------
        checked: bool, optional
            This method is connected to the `sig_toggle_view_changed` signal,
            so that the first time the widget is made visible it will start
            the server. Default is True.
        N)r-   rk   Ú
disconnectrl   r	   ZsetOverrideCursorr   r   Z
WaitCursorZprocessEventsÚstart_server)r0   Úcheckedr   r   r   rl   :  s
    zPydocBrowser.initializec                 C   s
   | j duS )z/Return True if pydoc server is already running.N)r-   r2   r   r   r   Úis_server_runningL  s    zPydocBrowser.is_server_runningc                 C   sj   | j du r|  d t¡¡ n$| j  ¡ r@| j j | j¡ | j  ¡  t	td| _ | j j 
| j¡ | j  ¡  dS )zStart pydoc server.Nzhttp://127.0.0.1:{}/)r,   )r-   Úset_home_urlÚformatÚPORTr:   r6   r€   ru   Úquitr*   rR   Ústartr2   r   r   r   r   P  s    

ÿ
ÿzPydocBrowser.start_serverc                 C   s@   | j du rdS | j  ¡ r<| j j | j¡ | j  ¡  | j  ¡  dS )zQuit the server.N)r-   r<   r6   r€   ru   r5   r‡   r2   r   r   r   r5   ^  s    

ÿ
zPydocBrowser.quit_serverc                 C   s   t dƒS )zReturn address label textrA   r\   r2   r   r   r   Ú	get_labeli  s    zPydocBrowser.get_labelc                 C   s   | j r| j ¡  dS )zReload page.N)r-   rM   Úreloadr2   r   r   r   rŠ   m  s    zPydocBrowser.reloadc                 C   s8   |dkr|d7 }|  d¡r&|dd… }t| j ¡ | ƒS )zŠ
        Convert text address into QUrl object.

        Parameters
        ----------
        text: str
            Url address.
        úabout:blankz.htmlú/rC   N)Ú
startswithr   rJ   ÚtoStringry   r   r   r   rx   r  s
    	
zPydocBrowser.text_to_urlc                 C   sT   |  ¡ }d|v rdS d|v s$d|v r6|  ¡  d¡d S t t| ¡ ƒ¡d dd… S )	z—
        Convert QUrl object to displayed text in combo box.

        Parameters
        ----------
        url: QUrl
            Url address.
        r‹   zget?key=zsearch?key=ú=éÿÿÿÿr   rC   N)rŽ   ÚsplitÚospÚsplitextrv   r(   )r0   r|   Z
string_urlr   r   r   rz   ƒ  s    	zPydocBrowser.url_to_textc                 C   s   t |ƒ| _dS )zv
        Set home URL.

        Parameters
        ----------
        text: str
            Home url address.
        N)r   rJ   ry   r   r   r   r„   ”  s    	zPydocBrowser.set_home_urlc                 C   s   |   |¡ |  |¡ dS )z{
        Set current URL.

        Parameters
        ----------
        url: QUrl or str
            Url address.
        N)rU   rw   r{   r   r   r   Úset_urlŸ  s    	
zPydocBrowser.set_urlc                 C   s(   t |tƒrt|ƒ}n|}| j |¡ dS )z!
        Go to page URL.
        N)Ú
isinstancerv   r   rM   Úload)r0   Zurl_or_textr|   r   r   r   rw   «  s    

zPydocBrowser.go_toc                 C   s   | j dur|  | j ¡ dS )z"
        Go to home page.
        N)rJ   r”   r2   r   r   r   re   ¶  s    
zPydocBrowser.go_homec                 C   s
   | j  ¡ S )zt
        Get the current zoom factor.

        Returns
        -------
        int
            Zoom factor.
        )rM   Úget_zoom_factorr2   r   r   r   r—   ¾  s    	zPydocBrowser.get_zoom_factorc                 C   s2   g }t | j ¡ ƒD ]}| t| j |¡ƒ¡ q|S )zŽ
        Return the list of history items in the combobox.

        Returns
        -------
        list
            List of strings.
        )Úranger!   ÚcountÚappendrv   ZitemText)r0   r~   Úindexr   r   r   Úget_historyÉ  s    	zPydocBrowser.get_historyc                 C   s   |r| j  ¡  n
| j  ¡  dS )z£
        Show/hide the find widget.

        Parameters
        ----------
        state: bool
            True to show and False to hide the find widget.
        N)rN   ÚshowrO   )r0   Ústater   r   r   rf   Ø  s    
zPydocBrowser.toggle_find_widget)NNN)T)&r   r   r   r>   ZENABLE_SPINNERr   rs   r+   r]   r^   rQ   rr   rS   rT   ru   rD   rU   rV   r}   r   r   Úboolrl   rƒ   r   r5   r‰   rŠ   rx   rz   r„   r”   rw   re   r—   rœ   rf   Ú__classcell__r   r   rZ   r   r?   €   sD   2/	


r?   c                  C   sd   ddl m}  ddlm} |ƒ }d|_| dd}td|d}| ¡  | ¡  | ¡  t	 
| ¡ ¡ dS )	zRun web browser.r   )Úqapplication)Ú	MagicMockZ
onlinehelpé   )Z	test_timeN)rX   )Zspyder.utils.qthelpersr¡   Zunittest.mockr¢   ZCONF_SECTIONr?   Ú_setuprQ   r   ÚsysÚexitZexec_)r¡   r¢   Zplugin_mockZappZwidgetr   r   r   Útestè  s    
r§   Ú__main__)/r>   Úos.pathr(   r’   Úpydocr¥   Zqtpy.QtCorer   r   r   r   r   Z
qtpy.QtGuir   Zqtpy.QtWebEngineWidgetsr   Zqtpy.QtWidgetsr	   r
   r   Zspyder.api.translationsr   Zspyder.api.widgets.main_widgetr   Z%spyder.plugins.onlinehelp.pydoc_patchr   r   Zspyder.widgets.browserr   r   Zspyder.widgets.comboboxesr   Zspyder.widgets.findreplacer   rK   r†   r   r   r    r'   r$   r)   Ú	Exceptionr*   r?   r§   r   r   r   r   r   Ú<module>   s@   
5  j
