U
    kuf%                  	   @  s   d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	 ddl
mZ ddlmZ dd	lmZmZ d
d Zd)ddZdd Zdd ZdddddddddZdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( ZdS )*z-Code for converting notebooks to and from v3.    )annotationsN)
get_logger)v3	validator)generate_corpus_id)NotebookNode   )nbformatnbformat_minorc              
   C  sX   ddl m}m} z|| |d W n2 |k
rR } zt d|| W 5 d}~X Y nX dS )z(Log validation errors, if there are any.r   )ValidationErrorvalidate)versionz"Notebook JSON is not valid v%i: %sN)r	   r   r   r   error)nbr   r   r   e r   7/tmp/pip-unpacked-wheel-zj9qk9v2/nbformat/v4/convert.py_warn_if_invalid   s
    r   c           	      C  sH  |s| d }|s<d| kr4|dkr.d}t |d}n| d }|dkrt| | | dd}| d	d}|pld| j_|pxd| j_t| _t| _g  | d
< }| dg D ] }|d
 D ]}|	t
| qq| jdd | jdd t| t | S |dkr8|tkr| S |dk r&| jD ]}t |_q|| j_t| _| S td| dS )aW  Convert a notebook to latest v4.

    Parameters
    ----------
    nb : NotebookNode
        The Python representation of the notebook to convert.
    from_version : int
        The original version of the notebook to convert.
    from_minor : int
        The original minor version of the notebook to convert (only relevant for v >= 3).
    r	   r
      zEThe v4 notebook does not include the nbformat minor, which is needed.r      orig_nbformatNorig_nbformat_minorcells
worksheetsname 	signature   zZCannot convert a notebook directly from v%s to v4.  Try using the nbformat.convert module.)r   r   r   popmetadatar   r   r	   r
   appendupgrade_cellr   random_cell_idid
ValueError)	r   Zfrom_versionZ
from_minormsgr   r   r   wscellr   r   r   upgrade   sN    






r(   c                 C  s   |  dt  t | _| jdkrn| dd d| krD| d| jd< | dd| _| dd| _t	| j
| _
nT| jd	krd
| _| dd}djd| d| dd d| _n| jdkrd
| _| S )zupgrade a cell from v3 to v4

    heading cell:
        - -> markdown heading
    code cell:
        - remove language metadata
        - cell.input -> cell.source
        - cell.prompt_number -> cell.execution_count
        - update outputs
    r   codelanguager   	collapsedinputprompt_numberNheadingmarkdownlevelr   z{hashes} {single_line}# source)hashesZsingle_linehtml)
setdefaultr   r"   r#   	cell_typer   r   r3   execution_countupgrade_outputsoutputsformatjoinget
splitlines)r'   r0   r   r   r   r!   f   s&    



r!   c                 C  s   | j dkrJd| _| dd| _| dd| _| jdd| _t| j| _nb| j d	kr| 	dd}d
|kr|
drtd|}|dk	st| \}}d| _ || _t|| _| dd | dd | S )a  downgrade a cell from v4 to v3

    code cell:
        - set cell.language
        - cell.input <- cell.source
        - cell.prompt_number <- cell.execution_count
        - update outputs
    markdown cell:
        - single-line heading -> heading cell
    r)   pythonr3   r   r8   Nr+   Fr/   
r1   z(#+)\s*(.*)r.   r#   attachments)r7   r*   r   r,   r-   r   r+   downgrade_outputsr:   r=   
startswithrematchAssertionErrorgroupsr3   lenr0   )r'   r3   rE   prefixtextr   r   r   downgrade_cell   s$    


rK   z
text/plainz	text/htmlzimage/svg+xml	image/png
image/jpegz
text/latexapplication/jsonzapplication/javascript)rJ   r5   svgZpngZjpegZlatexjsonZ
javascriptc                 C  s,   t  D ]\}}|| kr| || |< q| S )z4convert dict with v3 aliases to plain mime-type keys)	_mime_mapitemsr   )daliasmimer   r   r   to_mime_key   s    rV   c                 C  s.   i }t  D ]\}}|| kr| | ||< q|S )z.convert dict with mime-type keys to v3 aliases)rQ   rR   )rS   Zd2rT   rU   r   r   r   from_mime_key   s
    rW   c                 C  s  | d dkr|  dt  | d dkr>d| d< | dd| d< i }t| D ]}|d	krXqJ| |||< qJt| || d
< t| j d|krt|d |d< dD ],}||krt|| t	r|| 
d||< qn4| d dkrd| d< n| d dkr| dd| d< | S )zupgrade a single code cell output from v3 to v4

    - pyout -> execute_result
    - pyerr -> error
    - output.type -> output.data.mime/type
    - mime-type keys
    - stream.stream -> stream.name
    output_type>   display_datapyoutr   rZ   execute_resultr-   Nr8   >   r8   rX   r   datarN   )rL   rM   asciipyerrr   streamstdoutr   )r6   r   r   listrV   r   rP   loads
isinstancebytesdecode)outputr\   keyr   r   r   upgrade_output   s.    	

rh   c                 C  s   | d dkrz| d dkr0d| d< |  dd| d< |  di }d	|krVt|d	 |d	< t|}| | t| d
i  n0| d dkrd| d< n| d dkr|  d| d< | S )zdowngrade a single code cell output to v3 from v4

    - pyout <- execute_result
    - pyerr <- error
    - output.data.mime/type -> output.type
    - un-mime-type keys
    - stream.stream <- stream.name
    rX   >   rY   r[   r[   rZ   r8   Nr-   r\   rN   r   r   r^   r_   r   )r   rP   dumpsrW   updater=   )rf   r\   r   r   r   downgrade_output   s    	

rk   c                 C  s   dd | D S )z,upgrade outputs of a code cell from v3 to v4c                 S  s   g | ]}t |qS r   )rh   .0opr   r   r   
<listcomp>  s     z#upgrade_outputs.<locals>.<listcomp>r   r:   r   r   r   r9     s    r9   c                 C  s   dd | D S )z.downgrade outputs of a code cell to v3 from v4c                 S  s   g | ]}t |qS r   )rk   rl   r   r   r   ro     s     z%downgrade_outputs.<locals>.<listcomp>r   rp   r   r   r   rB   	  s    rB   c                 C  s   | j t kr| S t| t  tj | _ tj| _dd | dD }tj|dg| _| jdd t| tj  | jdt | _	| jdt| _
| S )	zConvert a v4 notebook to v3.

    Parameters
    ----------
    nb : NotebookNode
        The Python representation of the notebook to convert.
    c                 S  s   g | ]}t |qS r   )rK   )rm   r'   r   r   r   ro     s     zdowngrade.<locals>.<listcomp>r   )r   r   r   r   r   )r	   r   r   r
   r   Znew_worksheetr   r   r6   r   r   )r   r   r   r   r   	downgrade  s    

rq   )NN)__doc__
__future__r   rP   rD   Ztraitlets.logr   r	   r   r   Znbformat.corpus.wordsr   r"   Znbformat.notebooknoder   Znbbaser
   r   r(   r!   rK   rQ   rV   rW   rh   rk   r9   rB   rq   r   r   r   r   <module>   s8   

I! 	%