
    P/Ph+                        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n# e$ rZ ed          edZ[ww xY 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           Z! G d dej"                  Z" G d dej#                  Z$ G d dej%        j&                  Z'd Z(ej)         G d de                      Z*dS )z7Displays Agg images in the browser, with interactivity.    )contextmanagerN)BytesIO)Pathz$The WebAgg backend requires Tornado.)_Backend)Gcf   )backend_webagg_core)TimerAsyncioTimerTornadoc                  l    t           j        j                                                                        S N)tornadoioloopIOLoopinstancestart     b/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/matplotlib/backends/backend_webagg.py<lambda>r   )   s#    7>(113399;; r   )targetc                   8    e Zd Zej        Zeddd            ZdS )FigureManagerWebAggN)blockc                v   t                                            d                    t           j        t           j        t           j                  }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 )WebAggApplication
initializeformatr   r   
url_prefixmplrcParams
webbrowseropenprintr   )clsr   urlr%   s       r   pyplot_showzFigureManagerWebAgg.pyplot_show/   s    $$&&&/66%-"'$/ 7 1 1
 <01 	2??3'' 64s445550300111!!!!!r   )__name__
__module____qualname__coreNavigationToolbar2WebAgg_toolbar2_classclassmethodr*   r   r   r   r   r   ,   sB        3O"& " " " " [" " "r   r   c                       e Zd ZeZdS )FigureCanvasWebAggN)r+   r,   r-   r   manager_classr   r   r   r3   r3   B   s        'MMMr   r3   c                   v    e Zd ZdZdZ G d dej        j                  Z G d dej        j                  Z	 G d dej        j                  Z
 G d d	ej        j                  Z G d
 dej        j                  Z G d dej        j                  Zd fd	Zedd            Zed             Z xZS )r   Fc                       e Zd Zd ZdS )WebAggApplication.FavIconc                     |                      dd           |                     t          t          j                    d                                                     d S )NContent-Typez	image/pngzimages/matplotlib.png)
set_headerwriter   r#   get_data_path
read_bytesselfs    r   getzWebAggApplication.FavIcon.getK   s^    OONK888JJtC-//35 55?Z\\C C C C Cr   Nr+   r,   r-   r@   r   r   r   FavIconr7   J   s(        	C 	C 	C 	C 	Cr   rB   c                   *     e Zd Zdd fd
Zd Z xZS )"WebAggApplication.SingleFigurePage r"   c                L    || _          t                      j        ||fi | d S r   r"   super__init__r?   applicationrequestr"   kwargs	__class__s        r   rJ   z+WebAggApplication.SingleFigurePage.__init__Q   1    (DOEGG['<<V<<<<<r   c                     t          |          }t          j        |          }d| j        j         | j         d}|                     d| j        ||t          j        j	        |j
                   d S )Nws:///zsingle_figure.html)r   ws_urifig_id	toolitemscanvas)intr   get_fig_managerrM   hostr"   renderr.   r/   rV   rW   )r?   fignummanagerrT   s       r   r@   z&WebAggApplication.SingleFigurePage.getU   sz    [[F)&11GBT\.BBBBFKK$7A~  ' ' ' ' 'r   r+   r,   r-   rJ   r@   __classcell__rO   s   @r   SingleFigurePagerD   P   sT        ?A 	= 	= 	= 	= 	= 	= 	=	' 	' 	' 	' 	' 	' 	'r   ra   c                   *     e Zd Zdd fd
Zd Z xZS ) WebAggApplication.AllFiguresPagerE   rF   c                L    || _          t                      j        ||fi | d S r   rH   rK   s        r   rJ   z)WebAggApplication.AllFiguresPage.__init__c   rP   r   c           	          d| j         j         | j         d}|                     d| j        |t	          t
          j                                                  t          j	        j
                   d S )NrR   rS   zall_figures.html)r   rT   figuresrV   )rM   rZ   r"   r[   sortedr   figsitemsr.   r/   rV   )r?   rT   s     r   r@   z$WebAggApplication.AllFiguresPage.getg   ss    BT\.BBBBFKK"sx~~//007A  C C C C Cr   r^   r`   s   @r   AllFiguresPagerc   b   s[        ?A 	= 	= 	= 	= 	= 	= 	=	C 	C 	C 	C 	C 	C 	Cr   rj   c                       e Zd Zd ZdS )WebAggApplication.MplJsc                     |                      dd           t          j                                        }|                     |           d S )Nr9   zapplication/javascript)r:   r.   r   get_javascriptr;   )r?   
js_contents     r   r@   zWebAggApplication.MplJs.getq   sC    OON,DEEE1@@BBJJJz"""""r   NrA   r   r   r   MplJsrl   p   s#        	# 	# 	# 	# 	#r   rp   c                       e Zd Zd ZdS )WebAggApplication.Downloadc                 `   t          |          }t          j        |          }|                     dt          j                            |d                     t                      }|j        j	        
                    ||           |                     |                                           d S )Nr9   binary)r!   )rX   r   rY   r:   	mimetypes	types_mapr@   r   rW   figuresavefigr;   getvalue)r?   r\   fmtr]   buffs        r   r@   zWebAggApplication.Download.gety   s    [[F)&11GOO	 3 7 7X F FH H H99DN!))$s);;;JJt}}'''''r   NrA   r   r   r   Downloadrr   x   s#        	( 	( 	( 	( 	(r   r|   c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )WebAggApplication.WebSocketTc                     t          |          | _        t          j        | j                  | _        | j                            |            t          | d          r|                     d           d S d S )Nset_nodelayT)rX   r\   r   rY   r]   add_web_sockethasattrr   )r?   r\   s     r   r&   z WebAggApplication.WebSocket.open   so    f++DK.t{;;DLL''---t]++ '  &&&&&' 'r   c                 :    | j                             |            d S r   )r]   remove_web_socketr>   s    r   on_closez$WebAggApplication.WebSocket.on_close   s    L**400000r   c                     t          j        |          }|d         dk    r|d         | _        d S t          j        | j                  }||                    |           d S d S )Ntypesupports_binaryvalue)jsonloadsr   r   rY   r\   handle_json)r?   messager]   s      r   
on_messagez&WebAggApplication.WebSocket.on_message   sr    j))G v"333'.w'7$$$-dk:: &''00000 '&r   c                 T    |                      t          j        |                     d S r   )write_messager   dumps)r?   contents     r   	send_jsonz%WebAggApplication.WebSocket.send_json   s&    tz'2233333r   c                     | j         r|                     |d           d S d                    |                    d                              dd                    }|                     |           d S )NT)rt   zdata:image/png;base64,{}base64
rE   )r   r   r!   encodereplace)r?   blobdata_uris      r   send_binaryz'WebAggApplication.WebSocket.send_binary   sz    # -""4"555555<<KK))11$;;= =""8,,,,,r   N)	r+   r,   r-   r   r&   r   r   r   r   r   r   r   	WebSocketr~      sd        	' 	' 	'	1 	1 	1	1 	1 	1	4 	4 	4	- 	- 	- 	- 	-r   r   rE   c                 4   |r"|d         dk    r|d         dk    s
J d            t                                          |dz   t          j        j        dt
          j                                        if|dz   t          j        j        dt          t          j
                    d          if|d	z   | j        f|d
z   | j        d|if|dz   | j        d|if|dz   | j        f|dz   | j        f|dz   | j        fgt
          j                                                   d S )Nr   rS   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)rI   rJ   r   webStaticFileHandlerr.   r   get_static_file_pathr   r#   r<   rB   ra   rj   rp   r   r|   )r?   r"   rO   s     r   rJ   zWebAggApplication.__init__   sl    	Ia=C''JrNc,A,A,AH -B,A,A 	 ...$2GGIIJL
 ...$s022H==>@
 o-t|< l*D,A
+- e#T%8
+- m+TZ8 o-t~> @@ ;@ 2GGIIC 	 !	K !	K !	K !	K !	Kr   Nc                    | j         rd S  | |          }|| _        d }|t          j        d         | _        n|| _        t          j        d         | _         || j        t          j        d                   D ]S}	 |                    || j                   || _         n<# t          $ r }|j        t          j	        k    r Y d }~Ld }~ww xY wt          d          d| _         d S )NrF   c              3      K   t          t          d|                    D ]	}| |z   V  
t          |dz
            D ]"}| t          j        d|z  d|z            z   V  #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is      r   random_portsz2WebAggApplication.initialize.<locals>.random_ports   s       3q!99%%  Qh1q5\\ ; ;V^BFAE:::::::; ;r   z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OSErrorerrno
EADDRINUSE
SystemExit)r(   r"   r   r   appr   es          r   r    zWebAggApplication.initialize   s(   ? 	F cZ(((#
	; 
	; 
	; ?,'78CKK!CK<. L!$.C!DF F 	+ 	+D

4---
      7e... /.... *+ + + s   <B  
C
*CC
c                     dd l }	 |                                 d _        n# t          $ r Y nw xY w j        rd S 	 t          j        j                                         fdt          fd            }d _        t          d           t          j                                          |            5                                   d d d            d S # 1 swxY w Y   d S )Nr   Tc                                                        t          d           t          j                                         d _        d S )NzServer is stoppedF)stopr'   sysstdoutflushstarted)r(   r   s   r   shutdownz)WebAggApplication.start.<locals>.shutdown  s>    KKMMM%&&&JCKKKr   c               3      K   t          j         t           j        fd          } 	 d V  t          j         t           j        |            d S # t          j         t           j        |            w xY w)Nc                 .                                   S r   )add_callback_from_signal)sigframer   r   s     r   r   z?WebAggApplication.start.<locals>.catch_sigint.<locals>.<lambda>  s    6#B#B8#L#L r   )signalSIGINT)old_handlerr   r   s    r   catch_sigintz-WebAggApplication.start.<locals>.catch_sigint  sp       -LLLLLN NK:fm[99999fm[9999s   A !A.z"Press Ctrl+C to stop WebAgg server)asyncioget_running_loopr   RuntimeErrorr   r   r   r   r   r'   r   r   r   r   )r(   r   r   r   r   s   `  @@r   r   zWebAggApplication.start   sq   	$$&&& CKK  	 	 	D	
 ; 	F	 &//11	  	  	  	  	  	  
	: 	: 	: 	: 	: 
	: 2333
\^^ 	 	LLNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   % 
229CC"C)rE   )rE   NN)r+   r,   r-   r   r   r   r   RequestHandlerrB   ra   rj   rp   r|   	websocketWebSocketHandlerr   rJ   r1   r    r   r_   r`   s   @r   r   r   F   s       KGC C C C C'+, C C C' ' ' ' '7;5 ' ' '$C C C C C3 C C C# # # # #* # # #( ( ( ( (7;- ( ( (%- %- %- %- %-G%6 %- %- %-N&K &K &K &K &K &KP + + + [+Z + + [+ + + + +r   r   c                 \   dd l }t                                           dd l}	 |                                 nB# t
          $ r5 t                                          st                                           Y nw xY w| j	        }t          t          j                                        d                                          }|j                            |          }|                    t          j        |t          j        j        | j        t          j                                      d          S )Nr   zipython_inline_figure.html)r   rU   rV   rW   r   zutf-8)tornado.templater   r    r   r   r   webagg_server_threadis_aliver   numberr   r.   r   r   	read_texttemplateTemplategenerater"   r/   rV   rW   r   decode)rw   r   r   r\   tplts         r   ipython_inline_displayr   .  s     """NNN)  """" ) ) )#,,.. 	) &&((() ]F
t'<<>>+- --6Y[[ !!#&&A:: +/9}#  % %
 &,VG__5s   8 <A76A7c                       e Zd ZeZeZdS )_BackendWebAggN)r+   r,   r-   r3   FigureCanvasr   FigureManagerr   r   r   r   r   E  s        %L'MMMr   r   )+__doc__
contextlibr   r   ior   r   ru   pathlibr   r   r   r   	threadingr   ImportErrorerrr   tornado.webtornado.iolooptornado.websocket
matplotlibr#   matplotlib.backend_basesr   matplotlib._pylab_helpersr   rE   r	   r.   r
   r   Threadr   r   FigureCanvasWebAggCorer3   r   Applicationr   r   exportr   r   r   r   <module>r      sd   = = & % % % % %                    



     HNNNN H H H
,=
>
>CGH                 - - - - - - ) ) ) ) ) ) ) ) ) ) ) )                (y';;= = = " " " " "$2 " " ",( ( ( ( (4 ( ( (e e e e e/ e e eP5 5 5. 
( ( ( ( (X ( ( ( ( (s   7 AAA