B
    ]\H                 @   s   d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	m
Z
mZ ddlmZ ddlmZmZmZ ddlmZ G d	d
 d
ejZG dd deZdd ZedkrddlZeejd  dS )z4PostProcessor for serving reveal.js HTML slideshows.    )print_functionN)webioloop
httpserverloggen)AsyncHTTPClient)BoolUnicodeInt   )PostProcessorBasec               @   s   e Zd ZdZejdd ZdS )ProxyHandlerz9handler the proxies requests from a local prefix to a CDNc             c   sd   d | jd |g}| jd }||V }x(dD ] }||jkr0| ||j|  q0W | |j dS )zproxy a request to a CDN/cdnclient)zContent-TypezCache-ControlZDatezLast-ModifiedZExpiresN)joinZsettingsZfetchZheadersZ
set_headerZfinishZbody)selfprefixurlZ	proxy_urlr   Zresponseheader r   =lib/python3.7/site-packages/nbconvert/postprocessors/serve.pyget   s    


zProxyHandler.getN)__name__
__module____qualname____doc__r   	coroutiner   r   r   r   r   r      s   r   c               @   s   e Zd ZdZedddjddZedddjddZedd	djddZ	ed
ddjddZ
edddjddZedddjddZdd ZdS )ServePostProcessorzyPost processor designed to serve files
    
    Proxies reveal.js requests to a CDN if no local reveal.js is present
    Tz+Should the browser be opened automatically?)help)Zconfig a  Specify what browser should be used to open slides. See
                      https://docs.python.org/3/library/webbrowser.html#webbrowser.register
                      to see how keys are mapped to browser executables. If 
                      not specified, the default browser will be determined 
                      by the `webbrowser` 
                      standard library module, which allows setting of the BROWSER 
                      environment variable to override it.
                      z6https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.5.0zURL for reveal.js CDN.z	reveal.jszURL prefix for reveal.jsz	127.0.0.1zThe IP address to listen on.i@  z!port for the server to listen on.c       	   
      s  t j|\}}dtjd|ifdtjdd| ifg}d| jks| jdrLnTt jt j	|| jrv| j
d| j n*| j
d	| j| j |d
d| j tf tj|| jt d}| j
t
_t|}|j| j| jd d| j| j|f td  td | jrvy4t| jpd  fdd}tj|d  W n: tjk
rt } z| j
 d|  d W dd}~X Y nX yt!j"#   W n t$k
r   td Y nX dS )z+Serve the build directory with a webserver.z/(.+)pathr   r   z/%sz://z//zServing local %szRedirecting %s requests to %sr   z
/(%s)/(.*))r   r   )Zaddresszhttp://%s:%i/%szServing your slides at %sz!Use Control-C to stop this serverNc                  s    j ddS )N   )new)openr   )browserr   r   r   <lambda>a   s    z0ServePostProcessor.postprocess.<locals>.<lambda>)targetzNo web browser found: %s.z
Interrupted)%osr"   splitr   ZStaticFileHandlerZRedirectHandlerreveal_prefix
startswithisdirr   r   info
reveal_cdninsertr   ZApplicationr   Zapp_logr   Z
HTTPServerZlistenportipprintopen_in_browser
webbrowserr   r&   	threadingZThreadstartErrorZwarningr   ZIOLoopinstanceKeyboardInterrupt)	r   inputdirnamefilenameZhandlersZappZhttp_serverber   )r&   r   r   postprocess?   s<    

zServePostProcessor.postprocessN)r   r   r   r   r	   tagr4   r
   r&   r/   r+   r2   r   r1   r@   r   r   r   r   r   "   s   r   c             C   s   t  }||  dS )z-allow running this module to serve the slidesN)r   )r"   Zserverr   r   r   mainl   s    rB   __main__)r   Z
__future__r   r)   r5   r6   Ztornador   r   r   r   r   Ztornado.httpclientr   Z	traitletsr	   r
   r   baser   ZRequestHandlerr   r   rB   r   sysargvr   r   r   r   <module>   s   J