a
    s=ic*                  
   @   sj  d Z ddlm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
Z
ddlZddlZddlZddlZzddlZW n. ey Z zedeW Y dZ[n
dZ[0 0 ddlZddl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  G dd dej!Z"e" Z#G dd dej$Z$G dd dej%Z&G dd dej'j(Z)dd Z*ej+G dd deZ,dS )z8
Displays Agg images in the browser, with interactivity
    )contextmanagerN)BytesIO)Pathz$The WebAgg backend requires Tornado.)_Backend)Gcf   )backend_webagg_core)TimerAsyncioTimerTornadoc                   @   s   e Zd Zdd ZdS )ServerThreadc                 C   s   t jj   d S N)tornadoioloopIOLoopinstancestartself r   s/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/matplotlib/backends/backend_webagg.pyrun,   s    zServerThread.runN)__name__
__module____qualname__r   r   r   r   r   r   +   s   r   c                   @   s   e Zd ZejZdS )FigureManagerWebAggN)r   r   r   coreNavigationToolbar2WebAggZ_toolbar2_classr   r   r   r   r   3   s   r   c                   @   s   e Zd ZeZdS )FigureCanvasWebAggN)r   r   r   r   Zmanager_classr   r   r   r   r   7   s   r   c                       s   e Zd ZdZdZG dd dejjZG dd dejjZ	G dd dejjZ
G dd	 d	ejjZG d
d dejjZG dd dejjZd fdd	ZedddZedd Z  ZS )WebAggApplicationFc                   @   s   e Zd Zdd ZdS )zWebAggApplication.FavIconc                 C   s(   |  dd | tt d  d S )NContent-Typez	image/pngzimages/matplotlib.png)
set_headerwriter   mplget_data_path
read_bytesr   r   r   r   get@   s    zWebAggApplication.FavIcon.getNr   r   r   r%   r   r   r   r   FavIcon?   s   r'   c                       s*   e Zd Zdd fdd
Zdd Z  ZS )z"WebAggApplication.SingleFigurePage 
url_prefixc                   s    || _ t j||fi | d S r   r*   super__init__r   Zapplicationrequestr*   kwargs	__class__r   r   r-   F   s    z+WebAggApplication.SingleFigurePage.__init__c                 C   sF   t |}t|}dj| j| jd}| jd| j||tjj	|j
d d S )Nws://{req.host}{prefix}/reqprefixzsingle_figure.html)r6   ws_urifig_id	toolitemscanvas)intr   get_fig_managerformatr/   r*   renderr   r   r9   r:   )r   fignummanagerr7   r   r   r   r%   J   s    
z&WebAggApplication.SingleFigurePage.getr   r   r   r-   r%   __classcell__r   r   r1   r   SingleFigurePageE   s   rC   c                       s*   e Zd Zdd fdd
Zdd Z  ZS )z WebAggApplication.AllFiguresPager(   r)   c                   s    || _ t j||fi | d S r   r+   r.   r1   r   r   r-   Y   s    z)WebAggApplication.AllFiguresPage.__init__c                 C   s:   dj | j| jd}| jd| j|ttj tj	j
d d S )Nr3   r4   zall_figures.html)r6   r7   Zfiguresr9   )r=   r/   r*   r>   sortedr   Zfigsitemsr   r   r9   )r   r7   r   r   r   r%   ]   s    z$WebAggApplication.AllFiguresPage.getrA   r   r   r1   r   AllFiguresPageX   s   rF   c                   @   s   e Zd Zdd ZdS )zWebAggApplication.MplJsc                 C   s$   |  dd tj }| | d S )Nr   zapplication/javascript)r    r   r   Zget_javascriptr!   )r   Z
js_contentr   r   r   r%   h   s    
zWebAggApplication.MplJs.getNr&   r   r   r   r   MplJsg   s   rG   c                   @   s   e Zd Zdd ZdS )zWebAggApplication.Downloadc                 C   sR   t |}t|}| dtj|d t }|jj	j
||d | |  d S )Nr   binary)r=   )r;   r   r<   r    	mimetypes	types_mapr%   r   r:   figureZsavefigr!   getvalue)r   r?   fmtr@   Zbuffr   r   r   r%   p   s    
zWebAggApplication.Download.getNr&   r   r   r   r   Downloado   s   rN   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )zWebAggApplication.WebSocketTc                 C   s<   t || _t| j| _| j|  t| dr8| d d S )Nset_nodelayT)r;   r?   r   r<   r@   Zadd_web_sockethasattrrO   )r   r?   r   r   r   open|   s
    

z WebAggApplication.WebSocket.openc                 C   s   | j |  d S r   )r@   Zremove_web_socketr   r   r   r   on_close   s    z$WebAggApplication.WebSocket.on_closec                 C   sD   t |}|d dkr"|d | _nt| j}|d ur@|| d S )Ntypesupports_binaryvalue)jsonloadsrT   r   r<   r?   Zhandle_json)r   messager@   r   r   r   
on_message   s    
z&WebAggApplication.WebSocket.on_messagec                 C   s   |  t| d S r   )write_messagerV   dumps)r   contentr   r   r   	send_json   s    z%WebAggApplication.WebSocket.send_jsonc                 C   s<   | j r| j|dd n"d|ddd}| | d S )NT)rH   zdata:image/png;base64,{0}base64
r(   )rT   rZ   r=   encodereplace)r   ZblobZdata_urir   r   r   send_binary   s    z'WebAggApplication.WebSocket.send_binaryN)	r   r   r   rT   rQ   rR   rY   r]   rb   r   r   r   r   	WebSockety   s   rc   r(   c              
      s   |r$|d dkr|d dks$J dt  j|d tjjdtj if|d tjjdtt	
 dif|d	 | jf|d
 | jd|if|d | jd|if|d | jf|d | jf|d | jfgtj d d S )Nr   /z6url_prefix must start with a "/" and not end with one.z/_static/(.*)pathz/_images/(.*)Zimagesz/favicon.icoz	/([0-9]+)r*   z/?z
/js/mpl.jsz/([0-9]+)/wsz/([0-9]+)/download.([a-z0-9.]+))Ztemplate_path)r,   r-   r   webZStaticFileHandlerr   r   get_static_file_pathr   r"   r#   r'   rC   rF   rG   rc   rN   )r   r*   r1   r   r   r-      s8    

 zWebAggApplication.__init__Nc                 C   s   | j r
d S | |d}|| _dd }|d u r8tjd | _n|| _tjd | _|| jtjd D ]V}z||| j W n4 tjy } z|j	t	j
kr W Y d }~q\d }~0 0 || _ qq\tdd| _ d S )	Nr)   c                 s   sN   t td|D ]}| | V  qt |d D ]}| td| d|  V  q*dS )z
            Generate a list of n random ports near the given port.

            The first 5 ports will be sequential, and the remaining n-5 will be
            randomly selected in the range [port-2*n, port+2*n].
                  N)rangeminrandomrandint)portnir   r   r   random_ports   s    z2WebAggApplication.initialize.<locals>.random_portszwebagg.addresszwebagg.portzwebagg.port_retrieszSThe webagg server could not be started because an available port could not be foundT)initializedr*   r"   rcParamsaddressrp   listensocketerrorerrno
EADDRINUSE
SystemExit)clsr*   rp   rv   Zapprs   er   r   r   
initialize   s.    
zWebAggApplication.initializec                    s    j r
d S tjj  fddtfdd}d _ td tj	  |  
  W d    n1 sr0    Y  d S )Nc                      s$      td tj  d _d S )NzServer is stoppedF)stopprintsysstdoutflushstartedr   )r}   r   r   r   shutdown  s    
z)WebAggApplication.start.<locals>.shutdownc               
   3   sF   t  t j fdd} zd V  W t  t j|  nt  t j|  0 d S )Nc                    s
     S r   )Zadd_callback_from_signal)sigframer   r   r   r   <lambda>      z?WebAggApplication.start.<locals>.catch_sigint.<locals>.<lambda>)signalSIGINT)Zold_handlerr   r   r   catch_sigint
  s    z-WebAggApplication.start.<locals>.catch_sigintTz"Press Ctrl+C to stop WebAgg server)r   r   r   r   r   r   r   r   r   r   r   )r}   r   r   )r}   r   r   r   r      s    	

zWebAggApplication.start)r(   )r(   NN)r   r   r   rt   r   r   rg   ZRequestHandlerr'   rC   rF   rG   rN   Z	websocketZWebSocketHandlerrc   r-   classmethodr   r   rB   r   r   r1   r   r   ;   s   
'(-r   c                 C   sj   dd l }t  t s t  | j}ttj	
 d }|j|}|jtj|tjj| jtjddS )Nr   zipython_inline_figure.html)r6   r8   r9   r:   rp   zutf-8)Ztornado.templater   r   webagg_server_threadis_aliver   numberr   r   r   rh   	read_texttemplateTemplategenerater*   r   r9   r:   rp   decode)rK   r   r?   Ztpltr   r   r   ipython_inline_display  s$    
r   c                   @   s&   e Zd ZeZeZeddddZdS )_BackendWebAggN)blockc                 C   sd   t   djt jt jt jd}tjd rJdd l}|	|sXt
d| nt
d| t   d S )Nzhttp://{address}:{port}{prefix})rv   rp   r6   zwebagg.open_in_browserr   zTo view figure, visit {0})r   r   r=   rv   rp   r*   r"   ru   
webbrowserrQ   r   r   )r   urlr   r   r   r   show5  s    

z_BackendWebAgg.show)	r   r   r   r   ZFigureCanvasr   ZFigureManagerstaticmethodr   r   r   r   r   r   0  s   r   )-__doc__
contextlibr   rz   ior   rV   rI   pathlibr   rn   r   r   rx   	threadingr   ImportErrorerrRuntimeErrorZtornado.webZtornado.ioloopZtornado.websocketZ
matplotlibr"   Zmatplotlib.backend_basesr   Zmatplotlib._pylab_helpersr   r(   r   r   r	   r
   Threadr   r   r   ZFigureCanvasWebAggCorer   rg   Applicationr   r   exportr   r   r   r   r   <module>   s@     c