
    G8c*                        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	 ddlZ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ejB                        Z" e"       Z# G d dejH                        Z$ G d dejJ                        Z& G d dejN                  jP                        Z)d Z*ejV                   G d de             Z,y# e$ rZ ed      edZ[ww xY w)z8
Displays Agg images in the browser, with interactivity
    )contextmanagerN)BytesIO)Pathz$The WebAgg backend requires Tornado.)_Backend)Gcf   )backend_webagg_core)TimerAsyncioTimerTornadoc                       e Zd Zd Zy)ServerThreadc                 p    t         j                  j                  j                         j	                          y N)tornadoioloopIOLoopinstancestartselfs    D/usr/lib/python3/dist-packages/matplotlib/backends/backend_webagg.pyrunzServerThread.run,   s!    &&(..0    N)__name__
__module____qualname__r    r   r   r   r   +   s    1r   r   c                   $    e Zd Zej                  Zy)FigureManagerWebAggN)r   r   r   coreNavigationToolbar2WebAgg_toolbar2_classr   r   r   r   r   3   s    33Or   r   c                       e Zd ZeZy)FigureCanvasWebAggN)r   r   r   r   manager_classr   r   r   r$   r$   7   s    'Mr   r$   c                       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 )WebAggApplicationFc                       e Zd Zd Zy)WebAggApplication.FavIconc                     | j                  dd       | j                  t        t        j                         d      j                                y )NContent-Typez	image/pngzimages/matplotlib.png)
set_headerwriter   mplget_data_path
read_bytesr   s    r   getzWebAggApplication.FavIcon.get@   s9    OONK8JJtC--/355?Z\Cr   Nr   r   r   r1   r   r   r   FavIconr)   ?   s    	Cr   r3   c                   *     e Zd Zdd fd
Zd Z xZS )"WebAggApplication.SingleFigurePage 
url_prefixc                6    || _         t        |   ||fi | y r   r8   super__init__r   applicationrequestr8   kwargs	__class__s        r   r<   z+WebAggApplication.SingleFigurePage.__init__F       (DOG['<V<r   c                    t        |      }t        j                  |      }dj                  | j                  | j
                        }| j                  d| j
                  ||t        j                  j                  |j                         y )Nws://{req.host}{prefix}/reqprefixzsingle_figure.html)rG   ws_urifig_id	toolitemscanvas)intr   get_fig_managerformatr?   r8   renderr    r!   rJ   rK   )r   fignummanagerrH   s       r   r1   z&WebAggApplication.SingleFigurePage.getJ   su    [F))&1G/664<<>Boo 7 OFKK$77AA~~  'r   r   r   r   r<   r1   __classcell__rA   s   @r   SingleFigurePager5   E   s    ?A 	=	'r   rU   c                   *     e Zd Zdd fd
Zd Z xZS ) WebAggApplication.AllFiguresPager6   r7   c                6    || _         t        |   ||fi | y r   r:   r=   s        r   r<   z)WebAggApplication.AllFiguresPage.__init__Y   rB   r   c           	         dj                  | j                  | j                        }| j                  d| j                  |t	        t
        j                  j                               t        j                  j                         y )NrD   rE   zall_figures.html)rG   rH   figuresrJ   )rN   r?   r8   rO   sortedr   figsitemsr    r!   rJ   )r   rH   s     r   r1   z$WebAggApplication.AllFiguresPage.get]   sf    /664<<>Boo 7 OFKK"sxx~~/077AA  Cr   rR   rT   s   @r   AllFiguresPagerW   X   s    ?A 	=	Cr   r^   c                       e Zd Zd Zy)WebAggApplication.MplJsc                     | j                  dd       t        j                  j                         }| j	                  |       y )Nr+   zapplication/javascript)r,   r    r   get_javascriptr-   )r   
js_contents     r   r1   zWebAggApplication.MplJs.geth   s1    OON,DE11@@BJJJz"r   Nr2   r   r   r   MplJsr`   g   s    	#r   rd   c                       e Zd Zd Zy)WebAggApplication.Downloadc                 D   t        |      }t        j                  |      }| j                  dt        j
                  j                  |d             t               }|j                  j                  j                  ||       | j                  |j                                y )Nr+   binary)rN   )rL   r   rM   r,   	mimetypes	types_mapr1   r   rK   figuresavefigr-   getvalue)r   rP   fmtrQ   buffs        r   r1   zWebAggApplication.Download.getp   sv    [F))&1GOO	 3 3 7 7X FH9DNN!!))$s);JJt}}'r   Nr2   r   r   r   Downloadrf   o   s    	(r   rp   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)WebAggApplication.WebSocketTc                     t        |      | _        t        j                  | j                        | _        | j                  j                  |        t        | d      r| j                  d       y y )Nset_nodelayT)rL   rP   r   rM   rQ   add_web_sockethasattrrt   )r   rP   s     r   openz WebAggApplication.WebSocket.open|   sR    f+DK..t{{;DLLL''-t]+  & ,r   c                 :    | j                   j                  |        y r   )rQ   remove_web_socketr   s    r   on_closez$WebAggApplication.WebSocket.on_close   s    LL**40r   c                     t        j                  |      }|d   dk(  r|d   | _        y t        j                  | j
                        }||j                  |       y y )Ntypesupports_binaryvalue)jsonloadsr}   r   rM   rP   handle_json)r   messagerQ   s      r   
on_messagez&WebAggApplication.WebSocket.on_message   s[    jj)G v"33'.w'7$--dkk: &''0 'r   c                 L    | j                  t        j                  |             y r   )write_messager   dumps)r   contents     r   	send_jsonz%WebAggApplication.WebSocket.send_json   s    tzz'23r   c                     | j                   r| j                  |d       y dj                  |j                  d      j	                  dd            }| j                  |       y )NT)rh   zdata:image/png;base64,{0}base64
r6   )r}   r   rN   encodereplace)r   blobdata_uris      r   send_binaryz'WebAggApplication.WebSocket.send_binary   sU    ##""4"56==KK)11$;=""8,r   N)	r   r   r   r}   rw   rz   r   r   r   r   r   r   	WebSocketrr   y   s     	'	1	1	4	-r   r   c                 R   |r|d   dk(  r|d   dk7  sJ d       t         |   |dz   t        j                  j                  dt
        j                  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                  j                                y )Nr   /z6url_prefix must start with a "/" and not end with one.z/_static/(.*)pathz/_images/(.*)imagesz/favicon.icoz	/([0-9]+)r8   z/?z
/js/mpl.jsz/([0-9]+)/wsz/([0-9]+)/download.([a-z0-9.]+))template_path)r;   r<   r   webStaticFileHandlerr    r   get_static_file_pathr   r.   r/   r3   rU   r^   rd   r   rp   )r   r8   rA   s     r   r<   zWebAggApplication.__init__   sX   a=C'JrNc,A IHIA 	 ....$22GGIJL
 ....$s002H=>@
 o-t||< l*D,A,A
+- e#T%8%8
+- m+TZZ8 o-t~~> @@ ;@ 22GGIC 	 !	Kr   c                    | j                   ry  | |      }|| _        d }|t        j                  d   | _        n|| _        t        j                  d   | _         || j
                  t        j                  d         D ].  }	 |j                  || j                         || _         d| _         y  t        d      # t        j                  $ r(}|j                  t        j                  k7  r Y d }~rd }~ww xY w)Nr7   c              3      K   t        t        d|            D ]	  }| |z     t        |dz
        D ]#  }| t        j                  d|z  d|z        z    % yw)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is      r   random_portsz2WebAggApplication.initialize.<locals>.random_ports   s`      3q!9% Qh1q5\ ;V^^BFAE:::;s   AAzwebagg.addresszwebagg.portzwebagg.port_retrieszSThe webagg server could not be started because an available port could not be foundT)initializedr8   r.   rcParamsaddressr   listensocketerrorerrno
EADDRINUSE
SystemExit)clsr8   r   r   appr   es          r   
initializezWebAggApplication.initialize   s    ?? Z(#
	; ?,,'78CK!CK<<. !$.C!DF 	+D

4-
   	+ *+ + << 77e... /s   B;;C6C11C6c                 X     j                   ry 	 t        j                  j                  j	                          fdt
        fd       }d _         t        d       t        j                  j                           |       5  j                          d d d        y # 1 sw Y   y xY w)Nc                      j                          t        d       t        j                  j	                          d _        y )NzServer is stoppedF)stopprintsysstdoutflushstarted)r   r   s   r   shutdownz)WebAggApplication.start.<locals>.shutdown  s,    KKM%&JJCKr   c               3     K   t        j                   t         j                  fd      } 	 d  t        j                   t         j                  |        y # t        j                   t         j                  |        w xY ww)Nc                 &    j                        S r   )add_callback_from_signal)sigframer   r   s     r   <lambda>z?WebAggApplication.start.<locals>.catch_sigint.<locals>.<lambda>  s    6#B#B8#L r   )signalSIGINT)old_handlerr   r   s    r   catch_sigintz-WebAggApplication.start.<locals>.catch_sigint
  sL      --LNK:fmm[9fmm[9s   )A?A %A?&A<<A?Tz"Press Ctrl+C to stop WebAgg server)r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   s   ` @@r   r   zWebAggApplication.start   s    ;;	 &&//1	  
	: 
	: 23

^ 	LLN	 	 	s   B  B))r6   )r6   NN)r   r   r   r   r   r   r   RequestHandlerr3   rU   r^   rd   rp   	websocketWebSocketHandlerr   r<   classmethodr   r   rS   rT   s   @r   r'   r'   ;   s    KGC'++,, C'7;;55 '&C33 C#** #(7;;-- (%-G%%66 %-N&KP + +Z # #r   r'   c                    dd l }t        j                          t        j	                         st        j                          | j                  }t        t        j                  j                         d      j                         }|j                  j                  |      }|j                  t        j                  |t        j                   j"                  | j$                  t        j&                        j)                  d      S )Nr   zipython_inline_figure.html)rG   rI   rJ   rK   r   zutf-8)tornado.templater'   r   webagg_server_threadis_aliver   numberr   r    r   r   	read_texttemplateTemplategenerater8   r!   rJ   rK   r   decode)rk   r   rP   tplts        r   ipython_inline_displayr     s      "((*""$]]F
t''<<>+--6Y[ !!#&A:: ++//99}}##  %
 &,VG_5r   c                   *    e Zd ZeZeZeddd       Zy)_BackendWebAggN)blockc                    t         j                          dj                  t         j                  t         j                  t         j
                        }t        j                  d   r0dd l}|j                  |      s5t        dj                  |             nt        dj                  |             t         j                          y )Nzhttp://{address}:{port}{prefix})r   r   rG   zwebagg.open_in_browserr   zTo view figure, visit {0})r'   r   rN   r   r   r8   r.   r   
webbrowserrw   r   r   )r   urlr   s      r   showz_BackendWebAgg.show5  s    $$&/66%--"''$// 7 1
 <<01??3'188=>-44S9:!r   )	r   r   r   r$   FigureCanvasr   FigureManagerstaticmethodr   r   r   r   r   r   0  s!    %L'M " "r   r   )-__doc__
contextlibr   r   ior   r   ri   pathlibr   r   r   r   r   	threadingr   ImportErrorerrRuntimeErrortornado.webtornado.iolooptornado.websocket
matplotlibr.   matplotlib.backend_basesr   matplotlib._pylab_helpersr   r6   r	   r    r
   r   Threadr   r   r   FigureCanvasWebAggCorer$   r   Applicationr'   r   exportr   r   r   r   <module>r      s    &       
   H     - ) ) 19## 1
 $~ 4$22 4(44 (_// _D5& 
"X " "k  H
=
>CGHs   C' 'C:,	C55C: