o
    tfq                     @   s   d 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 ddlmZ ddlmZ d	d
lmZmZmZ dZejdkrJdZndZdd Zdd Zdd ZG dd deZG dd deZdZde efde e efgZdS )zTornado handlers for nbconvert.    N)run_sync)ensure_async)	from_dict)web)app_log)
authorized   )FilesRedirectHandlerJupyterHandler
path_regexZ	nbconvertwin32z	%B %d, %Yz
%B %-d, %Yc                    s6   g }t | D ]\ }}| fdd|D  q|S )z'Find the resource files in a directory.c                    s   g | ]	}t j |qS  )ospathjoin).0fdirpathr   j/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/jupyter_server/nbconvert/handlers.py
<listcomp>"   s    z'find_resource_files.<locals>.<listcomp>)r   walkextend)Zoutput_files_dirfiles_	filenamesr   r   r   find_resource_files   s   r   c                 C   s   | dd}|s
dS tj|d d }| | | dd | dd	 t }tj	|d
tj
d}tj|d |d  }|||d | D ]\}	}
|tj|	|
 qK|  | |  dS )zZip up the output and resource files and respond with the zip file.

    Returns True if it has served a zip file, False if there are no resource
    files, in which case we serve the plain output file.
    ZoutputsNFr   z.zipContent-Typezapplication/zipCache-Control.no-store, no-cache, must-revalidate, max-age=0w)modecompressionoutput_extensionzutf-8T)getr   r   splitextset_attachment_header
set_headerioBytesIOzipfileZipFileZIP_DEFLATEDwritestrencodeitemsbasenameclosefinishgetvalue)handlernameoutput	resourcesZoutput_fileszip_filenamebufferZzipfZoutput_filenamefilenamedatar   r   r   respond_zip&   s    
r<   c              
   K   s   zddl m} W n ty } z	tdd| |d}~ww z|| }W n ty9 } z	tdd|  |d}~ww z|d	i |W S  ty] } ztd| tdd| |d}~ww )
z+get an exporter, raising appropriate errorsr   )get_exporter  zCould not import nbconvert: %sNi  zNo exporter for format: %sz Could not construct Exporter: %sr   )	Znbconvert.exporters.baser=   ImportErrorr   	HTTPErrorKeyError	Exceptionr   	exception)formatkwargsr=   eexporterr   r   r   r=   D   s&   r=   c                   @   s*   e Zd ZdZeZdZeje	dd Z
dS )NbconvertFileHandlerzAn nbconvert file handler.)GETc              
      s  |    t|| j| jd |d}t| jdr(| j|}tj	
|\}}nd}t| jj|dI dH }|d }|d dkrFt| |S |d	 | d
|d  |d t}tj	|d }	|	|d| jjd d|ru|d d< zt fddI dH \}
}W n ty } z| jd| tdd| |d}~ww t| ||
|rdS | dd dkrtj	|d |d  }| |  jr| dd j  | dd | |
 dS )z(Get a notebook file in a desired format.)configlog/_get_os_pathN)r   r5   typenotebookcontentzLast-ModifiedZlast_modifiedr   )r5   Zmodified_date
config_dirmetadatarQ   rS   r   c                      s    j dS )Nr7   )from_notebook_noder   rG   nbZresource_dictr   r   <lambda>   s    z*NbconvertFileHandler.get.<locals>.<lambda>znbconvert failed: %rr>   nbconvert failed: %sdownloadfalsetruer#   r   %s; charset=utf-8r   r   ) Zcheck_xsrf_cookier=   rJ   rK   striphasattrZcontents_managerrM   r   r   splitr   r$   r	   Zredirect_to_filesr'   strftimedate_formatr%   applicationsettingsr   rB   rC   r   r@   r<   Zget_argumentlowerr&   output_mimetyper2   )selfrD   r   Zos_pathZext_resources_dirr0   modelr5   Zmod_dateZnb_titler6   r7   rF   r:   r   rV   r   r$   _   sN   


zNbconvertFileHandler.getN)__name__
__module____qualname____doc__AUTH_RESOURCEauth_resourceSUPPORTED_METHODSr   authenticatedr   r$   r   r   r   r   rH   Y       rH   c                   @   s*   e Zd ZdZdZeZeje	dd Z
dS )NbconvertPostHandlerzAn nbconvert post handler.)POSTc              
      s   t |jd  }|dusJ |ddt|d zt fddI dH \}}W n tyE } z	tdd	| |d}~ww t	||rOdS  j
r[d
d j
  | dS )z,Convert a notebook file to a desired format.)rJ   Nr5   znotebook.ipynbrP   c                      s.    j dd d ijjd ddS )Nr5   .rQ   rR   rT   )rU   rfindrc   rd   r   rG   r5   Znbnoderg   r   r   rX      s    
z+NbconvertPostHandler.post.<locals>.<lambda>r>   rY   r   r]   )r=   rJ   Zget_json_bodyr$   r   r   rB   r   r@   r<   rf   r'   r2   )rg   rD   rh   r6   r7   rF   r   rv   r   post   s&   	zNbconvertPostHandler.postN)ri   rj   rk   rl   ro   rm   rn   r   rp   r   rw   r   r   r   r   rr      rq   rr   z(?P<format>\w+)z/nbconvert/%sz/nbconvert/)rl   r(   r   sysr*   Zanyio.to_threadr   Zjupyter_core.utilsr   Znbformatr   tornador   Ztornado.logr   Zjupyter_server.auth.decoratorr   Zbase.handlersr	   r
   r   rm   platformrb   r   r<   r=   rH   rr   Z_format_regexZdefault_handlersr   r   r   r   <module>   s2    
E,
