o
    lig,                  
   @   st  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yK Z zededZ[ww 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  ej!"dG dd dej#Z$ej#dd d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TimerTornadoz3.7c                   @      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   `/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/matplotlib/backends/backend_webagg.pyrun-      zServerThread.runN)__name__
__module____qualname__r   r   r   r   r   r   +   s    r   c                   C   s   t jj  S r   r   r   r   r   r   <lambda>2   s    r   )targetc                   @   s$   e Zd ZejZeddddZdS )FigureManagerWebAggN)blockc                C   sd   t   djt jt jt jd}tjd r%dd l}|	|s$t
d| nt
d| t   d S )Nzhttp://{address}:{port}{prefix})addressportprefixzwebagg.open_in_browserr   zTo view figure, visit {0})WebAggApplication
initializeformatr!   r"   
url_prefixmplrcParams
webbrowseropenprintr   )clsr    urlr*   r   r   r   pyplot_show8   s   

zFigureManagerWebAgg.pyplot_show)r   r   r   coreNavigationToolbar2WebAgg_toolbar2_classclassmethodr/   r   r   r   r   r   5   s    r   c                   @   s   e Zd ZeZdS )FigureCanvasWebAggN)r   r   r   r   manager_classr   r   r   r   r4   K   s    r4   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 )r$   Fc                   @   r   )zWebAggApplication.FavIconc                 C   s(   |  dd | tt d  d S )NContent-Typez	image/pngzimages/matplotlib.png)
set_headerwriter   r(   get_data_path
read_bytesr   r   r   r   getT   s   zWebAggApplication.FavIcon.getNr   r   r   r;   r   r   r   r   FavIconS       r=   c                       *   e Zd Zdd fdd
Zdd Z  ZS )z"WebAggApplication.SingleFigurePage r'   c                       || _ t j||fi | d S r   r'   super__init__r   applicationrequestr'   kwargs	__class__r   r   rE   Z      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}/reqr#   zsingle_figure.html)r#   ws_urifig_id	toolitemscanvas)intr   get_fig_managerr&   rH   r'   renderr0   r1   rR   rS   )r   fignummanagerrP   r   r   r   r;   ^   s   

z&WebAggApplication.SingleFigurePage.getr   r   r   rE   r;   __classcell__r   r   rJ   r   SingleFigurePageY       r[   c                       r?   )z WebAggApplication.AllFiguresPager@   rA   c                   rB   r   rC   rF   rJ   r   r   rE   m   rL   z)WebAggApplication.AllFiguresPage.__init__c                 C   s:   dj | j| jd}| jd| j|ttj tj	j
d d S )NrM   rN   zall_figures.html)r#   rP   figuresrR   )r&   rH   r'   rV   sortedr   figsitemsr0   r1   rR   )r   rP   r   r   r   r;   q   s   
z$WebAggApplication.AllFiguresPage.getrY   r   r   rJ   r   AllFiguresPagel   r\   ra   c                   @   r   )zWebAggApplication.MplJsc                 C   s$   |  dd tj }| | d S )Nr6   zapplication/javascript)r7   r0   r   get_javascriptr8   )r   
js_contentr   r   r   r;   |   s   
zWebAggApplication.MplJs.getNr<   r   r   r   r   MplJs{   r>   rd   c                   @   r   )zWebAggApplication.Downloadc                 C   sR   t |}t|}| dtj|d t }|jj	j
||d | |  d S )Nr6   binary)r&   )rT   r   rU   r7   	mimetypes	types_mapr;   r   rS   figuresavefigr8   getvalue)r   rW   fmtrX   buffr   r   r   r;      s   
zWebAggApplication.Download.getNr<   r   r   r   r   Download   r>   rm   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r| d d S d S )Nset_nodelayT)rT   rW   r   rU   rX   add_web_sockethasattrrn   )r   rW   r   r   r   r+      s   

z WebAggApplication.WebSocket.openc                 C   s   | j |  d S r   )rX   remove_web_socketr   r   r   r   on_close   s   z$WebAggApplication.WebSocket.on_closec                 C   sJ   t |}|d dkr|d | _d S t| j}|d ur#|| d S d S )Ntypesupports_binaryvalue)jsonloadsrt   r   rU   rW   handle_json)r   messagerX   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   r   z%WebAggApplication.WebSocket.send_jsonc                 C   s>   | j r| j|dd d S d|ddd}| | d S )NT)re   zdata:image/png;base64,{0}base64
r@   )rt   r{   r&   encodereplace)r   blobdata_urir   r   r   send_binary   s   z'WebAggApplication.WebSocket.send_binaryN)	r   r   r   rt   r+   rr   rz   r~   r   r   r   r   r   	WebSocket   s    r   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/(.*)imagesz/favicon.icoz	/([0-9]+)r'   z/?z
/js/mpl.jsz/([0-9]+)/wsz/([0-9]+)/download.([a-z0-9.]+))template_path)rD   rE   r   webStaticFileHandlerr0   r   get_static_file_pathr   r(   r9   r=   r[   ra   rd   r   rm   )r   r'   rJ   r   r   rE      s8   

 
zWebAggApplication.__init__Nc                 C   s   | j rd S | |d}|| _dd }|d u rtjd | _n|| _tjd | _|| jtjd D ]*}z	||| j W n tjyS } z|j	t	j
krI W Y d }~q.d }~ww || _ ntdd| _ d S )	NrA   c                 s   sP    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)r"   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(   r)   r!   r"   listensocketerrorerrno
EADDRINUSE
SystemExit)r-   r'   r"   r!   appr   er   r   r   r%      s4   

zWebAggApplication.initializec                    s   dd l }z|  W n	 ty   Y nw d _ jrd S 	 tjj  fddtfdd}d _t	d t
j  |    W d    d S 1 sRw   Y  d S )Nr   Tc                      s$      td tj  d _d S )NzServer is stoppedF)stopr,   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|  d S t  t j|  w )Nc                    s
     S r   )add_callback_from_signal)sigframer   r   r   r   r   *  s   
 z?WebAggApplication.start.<locals>.catch_sigint.<locals>.<lambda>)signalSIGINT)old_handlerr   r   r   catch_sigint&  s   "z-WebAggApplication.start.<locals>.catch_sigintz"Press Ctrl+C to stop WebAgg server)asyncioget_running_loopRuntimeErrorr   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   r   r   r   r   RequestHandlerr=   r[   ra   rd   rm   	websocketWebSocketHandlerr   rE   r3   r%   r   rZ   r   r   rJ   r   r$   O   s    
'(-r$   c                 C   s   dd l }t  dd l}z|  W n ty#   t s!t  Y nw | j	}t
tj d }|j|}|jtj|tjj| jtjddS )Nr   zipython_inline_figure.html)r#   rQ   rR   rS   r"   zutf-8)tornado.templater$   r%   r   r   r   webagg_server_threadis_aliver   numberr   r0   r   r   	read_texttemplateTemplategenerater'   r1   rR   rS   r"   decode)rh   r   r   rW   tpltr   r   r   ipython_inline_display9  s4   
r   c                   @   s   e Zd ZeZeZdS )_BackendWebAggN)r   r   r   r4   FigureCanvasr   FigureManagerr   r   r   r   r   P  s    r   )/__doc__
contextlibr   r   ior   rv   rf   pathlibr   r   r   r   r   	threadingr   ImportErrorerrr   tornado.webtornado.iolooptornado.websocket
matplotlibr(   matplotlib.backend_basesr   matplotlib._pylab_helpersr   r@   r   r0   r	   r
   _api
deprecatedThreadr   r   r   FigureCanvasWebAggCorer4   r   Applicationr$   r   exportr   r   r   r   r   <module>   sL    

 k