ó
 m[c           @` sË  d  Z  d d l m Z m Z m Z m 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 y d d l Z Wn e k
 rÓ e d ƒ ‚ n Xd 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 d	 d l m  Z  d e j! f d „  ƒ  YZ" e" ƒ  Z# d e j$ f d „  ƒ  YZ% d e j& j' f d „  ƒ  YZ( d „  Z) e j* d e f d „  ƒ  Yƒ Z+ d S(   u8   
Displays Agg images in the browser, with interactivity
i    (   t   absolute_importt   divisiont   print_functiont   unicode_literalsN(   t   contextmanageru$   The WebAgg backend requires Tornado.(   t   rcParams(   t   _Backend(   t   Gcfi   (   t   backend_webagg_core(   t   TimerTornadot   ServerThreadc           B` s   e  Z d  „  Z RS(   c         C` s   t  j j j ƒ  j ƒ  d  S(   N(   t   tornadot   ioloopt   IOLoopt   instancet   start(   t   self(    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyt   run-   s    (   t   __name__t
   __module__R   (    (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyR
   ,   s   t   FigureCanvasWebAggc           B` s   e  Z d  „  Z d „  Z RS(   c         C` s   t  ƒ  d  S(   N(   t   show(   R   (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyR   4   s    c         O` s   t  | | Ž  S(   N(   R	   (   R   t   argst   kwargs(    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyt	   new_timer8   s    (   R   R   R   R   (    (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyR   3   s   	t   WebAggApplicationc           B` sï   e  Z e Z e Z d  e j j f d „  ƒ  YZ d e j j f d „  ƒ  YZ	 d e j j f d „  ƒ  YZ
 d e j j f d „  ƒ  YZ d e j j f d	 „  ƒ  YZ d
 e j j f d „  ƒ  YZ d d „ Z e d d d d „ ƒ Z e d „  ƒ Z RS(   t   FavIconc           B` s   e  Z d  „  Z RS(   c         C` s~   t  j j t  j j t  j j t ƒ ƒ d d ƒ } |  j d d ƒ t t  j j | d ƒ d ƒ  } |  j | j ƒ  ƒ Wd  QXd  S(   Nu   mpl-datau   imagesu   Content-Typeu	   image/pngu   matplotlib.pngu   rb(	   t   ost   patht   joint   dirnamet   __file__t
   set_headert   opent   writet   read(   R   t
   image_patht   fd(    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyt   getA   s    	(   R   R   R&   (    (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyR   @   s   t   SingleFigurePagec           B` s   e  Z d  „  Z d „  Z RS(   c         K` s5   | j  d d ƒ |  _ t j j j |  | | |  d  S(   Nu
   url_prefixu    (   t   popt
   url_prefixR   t   webt   RequestHandlert   __init__(   R   t   applicationt   requestR   (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyR,   L   s    c         C` st   t  | ƒ } t j | ƒ } d j d |  j d |  j ƒ } |  j d d |  j d | d | d t j j	 d | j
 ƒd  S(	   Nu   ws://{req.host}{prefix}/t   reqt   prefixu   single_figure.htmlt   ws_urit   fig_idt	   toolitemst   canvas(   t   intR   t   get_fig_managert   formatR.   R)   t   rendert   coret   NavigationToolbar2WebAggR3   R4   (   R   t   fignumt   managerR1   (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyR&   Q   s    	(   R   R   R,   R&   (    (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyR'   K   s   	t   AllFiguresPagec           B` s   e  Z d  „  Z d „  Z RS(   c         K` s5   | j  d d ƒ |  _ t j j j |  | | |  d  S(   Nu
   url_prefixu    (   R(   R)   R   R*   R+   R,   (   R   R-   R.   R   (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyR,   `   s    c      
   C` s_   d j  d |  j d |  j ƒ } |  j d d |  j d | d t t j j ƒ  ƒ d t j	 j
 ƒd  S(   Nu   ws://{req.host}{prefix}/R/   R0   u   all_figures.htmlR1   t   figuresR3   (   R7   R.   R)   R8   t   sortedR   t   figst   itemsR9   R:   R3   (   R   R1   (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyR&   e   s    	(   R   R   R,   R&   (    (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyR=   _   s   	t   MplJsc           B` s   e  Z d  „  Z RS(   c         C` s0   |  j  d d ƒ t j j ƒ  } |  j | ƒ d  S(   Nu   Content-Typeu   application/javascript(   R    R9   t   FigureManagerWebAggt   get_javascriptR"   (   R   t
   js_content(    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyR&   p   s    (   R   R   R&   (    (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyRB   o   s   t   Downloadc           B` s   e  Z d  „  Z RS(   c         C` s±   t  | ƒ } t j | ƒ } i d d 6d d 6d d 6d d 6d d	 6d
 d 6d d 6d d 6} |  j d | j | d ƒ ƒ t j ƒ  } | j j j	 | d | ƒ|  j
 | j ƒ  ƒ d  S(   Nu   application/postscriptu   psu   epsu   application/pdfu   pdfu   image/svg+xmlu   svgu	   image/pngu   pngu
   image/jpegu   jpegu
   image/tiffu   tifu   application/emfu   emfu   Content-Typeu   binaryR7   (   R5   R   R6   R    R&   t   sixt   BytesIOR4   t   figuret   savefigR"   t   getvalue(   R   R;   t   fmtR<   t	   mimetypest   buff(    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyR&   x   s    
(   R   R   R&   (    (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyRF   w   s   t	   WebSocketc           B` s;   e  Z e Z d  „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C` sW   t  | ƒ |  _ t j |  j ƒ |  _ |  j j |  ƒ t |  d ƒ rS |  j t ƒ n  d  S(   Nu   set_nodelay(	   R5   R;   R   R6   R<   t   add_web_sockett   hasattrt   set_nodelayt   True(   R   R;   (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyR!   ‘   s
    c         C` s   |  j  j |  ƒ d  S(   N(   R<   t   remove_web_socket(   R   (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyt   on_close˜   s    c         C` sa   t  j | ƒ } | d d k r/ | d |  _ n. t j |  j ƒ } | d  k	 r] | j | ƒ n  d  S(   Nu   typeu   supports_binaryu   value(   t   jsont   loadst   supports_binaryR   R6   R;   t   Nonet   handle_json(   R   t   messageR<   (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyt
   on_message›   s    c         C` s   |  j  t j | ƒ ƒ d  S(   N(   t   write_messageRV   t   dumps(   R   t   content(    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyt	   send_jsonª   s    c         C` sT   |  j  r |  j | d t ƒn1 d j | j d ƒ j d d ƒ ƒ } |  j | ƒ d  S(   Nt   binaryu   data:image/png;base64,{0}u   base64u   
u    (   RX   R]   RS   R7   t   encodet   replace(   R   t   blobt   data_uri(    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyt   send_binary­   s
    	(	   R   R   RS   RX   R!   RU   R\   R`   Rf   (    (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyRO   Ž   s   				u    c      	   C` sø   | r5 | d d k r& | d d k s5 t  d ƒ ‚ n  t t |  ƒ j | d t j j i t j j	 ƒ  d 6f | d |  j
 f | d |  j i | d	 6f | d
 |  j i | d	 6f | d |  j f | d |  j f | d |  j f g d t j j	 ƒ  ƒd  S(   Ni    u   /iÿÿÿÿu6   url_prefix must start with a "/" and not end with one.u   /_static/(.*)u   pathu   /favicon.icou	   /([0-9]+)u
   url_prefixu   /?u
   /js/mpl.jsu   /([0-9]+)/wsu   /([0-9]+)/download.([a-z0-9.]+)t   template_path(   t   AssertionErrort   superR   R,   R   R*   t   StaticFileHandlerR9   RC   t   get_static_file_pathR   R'   R=   RB   RO   RF   (   R   R)   (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyR,   µ   s"    #	c         C` s  |  j  r d  S|  d | ƒ } | |  _ d „  } d  } | d  k rP t d |  _ n	 | |  _ t d |  _ xv | |  j t d ƒ D]^ } y | j | |  j ƒ Wn. t j k
 rÊ } | j	 t	 j
 k rÛ ‚  qÛ q} X| |  _ t } Pq} W| sô t d ƒ ‚ n  t |  _  d  S(   NR)   c         s` se   x& t  t d | ƒ ƒ D] } |  | Vq Wx5 t  | d ƒ D]# } |  t j d | d | ƒ Vq: Wd S(   uâ   
            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].
            i   iþÿÿÿi   N(   t   ranget   mint   randomt   randint(   t   portt   nt   i(    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyt   random_portsä   s    u   webagg.addressu   webagg.portu   webagg.port_retriesuS   The webagg server could not be started because an available port could not be found(   t   initializedR)   RY   R   t   addressRp   t   listent   sockett   errort   errnot
   EADDRINUSERS   t
   SystemExit(   t   clsR)   Rp   Ru   t   appRs   t   successt   e(    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyt
   initializeØ   s.    				
	c         ` s‡   ˆ  j  r d  St j j j ƒ  ‰ ‡  ‡ f d †  ‰ t ‡ ‡ f d †  ƒ } t ˆ  _  t d ƒ t j	 j
 ƒ  | ƒ   ˆ j ƒ  Wd  QXd  S(   Nc           ` s.   ˆ j  ƒ  t d ƒ t j j ƒ  t ˆ  _ d  S(   Nu   Server is stopped(   t   stopt   printt   syst   stdoutt   flusht   Falset   started(    (   R|   R   (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyt   shutdown  s    

c          3` sE   t  j  t  j ‡  ‡ f d †  ƒ }  z	 d  VWd  t  j  t  j |  ƒ Xd  S(   Nc         ` s   ˆ  j  ˆ ƒ S(   N(   t   add_callback_from_signal(   t   sigt   frame(   R   Rˆ   (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyt   <lambda>!  s    (   t   signalt   SIGINT(   t   old_handler(   R   Rˆ   (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyt   catch_sigint  s    	u"   Press Ctrl+C to stop WebAgg server(   R‡   R   R   R   R   R   RS   R‚   Rƒ   R„   R…   R   (   R|   R   (    (   R|   R   Rˆ   sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyR   	  s    			

N(   R   R   R†   Rt   R‡   R   R*   R+   R   R'   R=   RB   RF   t	   websockett   WebSocketHandlerRO   R,   t   classmethodRY   R€   R   (    (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyR   <   s   '#0c         C` sÃ   d d  l  } t j ƒ  t j ƒ  s/ t j ƒ  n  t t j j	 t
 j j ƒ  d ƒ ƒ  } | j ƒ  } Wd  QX|  j } | j j | ƒ } | j d t j d | d t
 j j d |  j d t j ƒ j d ƒ S(	   Ni    u   ipython_inline_figure.htmlR0   R2   R3   R4   Rp   u   utf-8(   t   tornado.templateR   R€   t   webagg_server_threadt   is_aliveR   R!   R   R   R   R9   RC   Rk   R#   t   numbert   templatet   Templatet   generateR)   R:   R3   R4   Rp   t   decode(   RI   R   R%   t   tplR;   t   t(    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyt   ipython_inline_display0  s     
				t   _BackendWebAggc           B` s5   e  Z e Z e j Z e d  „  ƒ Z e d „  ƒ Z	 RS(   c         C` s   |  j  j ƒ  d  S(   N(   R4   t	   draw_idle(   R<   (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyt   trigger_manager_drawL  s    c          C` so   t  j ƒ  d j d t  j d t  j ƒ }  t d rN d d  l } | j |  ƒ n t d j |  ƒ ƒ t  j	 ƒ  d  S(   Nu   http://127.0.0.1:{port}{prefix}Rp   R0   u   webagg.open_in_browseri    u   To view figure, visit {0}(
   R   R€   R7   Rp   R)   R   t
   webbrowserR!   R‚   R   (   t   urlR¢   (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyR   P  s    
		
(
   R   R   R   t   FigureCanvasR9   RC   t   FigureManagert   staticmethodR¡   R   (    (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyRŸ   G  s   	(,   t   __doc__t
   __future__R    R   R   R   RG   t
   contextlibR   Ry   RV   R   Rn   Rƒ   R   Rw   t	   threadingR   t   ImportErrort   RuntimeErrort   tornado.webt   tornado.ioloopt   tornado.websockett
   matplotlibR   t   matplotlib.backend_basesR   t   matplotlib._pylab_helpersR   t    R   R9   R	   t   ThreadR
   R•   t   FigureCanvasWebAggCoreR   R*   t   ApplicationR   Rž   t   exportRŸ   (    (    (    sA   lib/python2.7/site-packages/matplotlib/backends/backend_webagg.pyt   <module>   s<   "		ô		