
    oiG                         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m	Z	m
Z
mZm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 ddlm Z  ddl!m"Z" ddl#m$Z$  G d de      Z%y)    N)partial)deepcopy)AsyncGenerator	GeneratorListTupleUnion)ensure_async)recursive_update)CellExecutionError)ClearOutputPreprocessor)LoggingConfigurableVoilaConfiguration   )VoilaExecutorstrip_code_cell_warnings)VoilaExporter)collect_template_paths)ENV_VARIABLEc                        e Zd ZdZ fdZddZ	 	 ddeedf   defdZ		 	 ddeedf   de
ee   ef   fdZ	 	 ddeedf   defd	Zd
 Zd Zd Zd Zd Zd Zd Zd ZddZ xZS )NotebookRendererz%Render the notebook into HTML string.c                    t         |           |j                  d      | _        |j                  dg       | _        |j                  dg       | _        |j                  dg       | _        |j                  dd       | _        |j                  d      | _        |j                  d      | _	        |j                  d      | _
        |j                  d	      | _        | j                  j                  | _        |j                  d
      | _        t        |j                  d            | _        d| _        d| _        d| _        g | _        |j                  d      | _        |j                  d      | _        y )Nrequest_handlerroot_dirnotebook_pathtemplate_pathstraitlet_configvoila_configurationconfig_managercontents_managerkernel_spec_managerbase_urlpage_configpython3Fmathjax_urlmathjax_config)super__init__getr   r   r   r   r   r   r    r!   r"   prelaunch_hookr#   r   r$   default_kernel_namekernel_startedstop_generatorrendered_cacher&   r'   )selfkwargs	__class__s     _/home/ubuntu/docker-apps/notebooks/venv/lib/python3.12/site-packages/voila/notebook_renderer.pyr)   zNotebookRenderer.__init__%   s2   %zz*;<

:r2#ZZ<$jj)92>%zz*;TB7=zzBW7X $jj)9: &

+= >#)::.C#D "66EE

:.#FJJ}$=>#, ##)+!::m4$jj)9:    returnNc           
        K   | j                   }| j                  |       d{   | _        t        j                  j                  |      | _        | j                  r;| j                  | j                  | j                  | j                        }|r|| _        t        j                  j                  |      \  }}t        j                  j                  |      d   }d}d| j                  j                  v r@| j                  j                  dv r(| j                  j                  d   j                  d      }| j                  j                  dk(  r|j                  dd      }||n|}|rt        ddg|      | _        |xs | j                  j"                  | _        | j                  j&                  }	d| j                  j                  v rA| j                  j(                  dv r)| j                  j                  d   j                  d	|	      }	| j                  j(                  dk(  r|j                  d	d      }
|
|
n|	}	|	| _        | j&                  | j*                  d
<   | j,                  | j&                  | j$                  d|i| j*                  d| _        | j                  j0                  j2                  j.                  }dt5        t7        |            v r!ddlm} |j.                  j;                  |      }t=        |t>              s|jA                         }|rtC        | j.                  |       | jD                   d| jF                   }tI        | j                   | j$                  | jJ                  | jL                  | j&                  | j,                  | j                  jN                  |      | _(        | j                  jR                  r4d| jP                  _*        d| jP                  _+        d| jP                  _,        yy7 ֭w)z"Initialize the notebook generator.N)notebookcwdr   voila)YESNOTEBOOKtemplater:   	nbconvertthemejupyterLabThemename)r#   r>   r<   metadatar$   DeferredConfigStringr   r   z?config=)r   template_nameconfigr!   r>   r#   show_marginsr&   T)-r   load_notebookr7   ospathdirnamer8   r+   r   splitsplitextrA   r   allow_template_overrider*   r   r   r<   rC   r>   allow_theme_overrider$   r#   	resourcesrD   r   strtypeconfigurationfrom_string
isinstancedictto_dictr   r&   r'   r   r   r!   rE   exporterstrip_sourcesexclude_inputexclude_output_promptexclude_input_prompt)r0   r1   r   returned_notebook_basenamenotebook_nametemplate_overridetemplate_argtheme_override	theme_argextra_resourcesr   mathjax_full_urls                 r3   
initializezNotebookRenderer.initialize:   sf    **"00??77??=1 !% 3 3$$t}}$(( !4 ! ! 1ggmmM28((215 !t}}---((@@DWW $ 6 6w ? C CJ O##;;uD!::j$7L , 8>O  "8+&(9#D /S$2J2J2S2S1177t}}---((==ATT!]]33G<@@N ##88EA

7D1I*3*?Y^N#
.2jj*+ZZ**/++
 2299LLVV "So)>%??90::FFWO/40-557OT^^_="../x8K8K7LM%..,,''!22**]]11>>(	
 ##11*.DMM'26DMM/15DMM. 2s @s   !O<O9OO<	kernel_idc                 b   t        | j                  ||      }dd|| j                  | j                  j                  d}| j                  j                  r| j
                  |d<   n| j                  |d<   | j                  j                  | j                  | j                  || j                        S )N)rf   kernel_futurer9   zvoila.js)frontendmain_jskernel_startnotebook_executeprogressive_renderingcell_generator)rN   extra_contextr$   )r   _jinja_kernel_start_jinja_notebook_executer   rm   '_jinja_cell_generator_without_execution_jinja_cell_generatorrV   generate_from_notebook_noder7   rN   r$   )r0   rf   rh   inner_kernel_startro   s        r3   generate_content_generatorz+NotebookRenderer.generate_content_generator   s    
 %$$	
  !. $ < <%)%=%=%S%S
 ##99<< *+ /3.H.HM*+ }}88MMnn'((	 9 
 	
r4   c                    K   g }| j                  ||      }|2 3 d{   \  }}|j                  |       | j                  r ||fS | j                  j                  |       J7 E6 ||fS w)zGenerate the HTML version of notebook, this process can be stopped
        anytime by setting `self.stop_generator=True`. The remaining cells can
        be rendered after by using the returned generator.
        N)rv   appendr.   r/   )r0   rf   rh   rendered	generatorhtml_snippetr\   s          r3   generate_content_hybridz(NotebookRenderer.generate_content_hybrid   s      33I}M	%. 	5 	5/,OOL)"""" &&|4		5Y
 ""s&   A*A%A#A%AA*#A%%A*c                 `   K   d}| j                  ||      2 3 d{   \  }}||z  }7 6 |S w)z&Generate the HTML version of notebook. N)rv   )r0   rf   rh   htmlr{   r\   s         r3   generate_content_strz%NotebookRenderer.generate_content_str   sN      %)%D%D}&
 	! 	!/, L D	! &
 s   .+)+
.+.c           	        K   | j                   rJ d       t        |       d {   }t        ||| j                  | j                  j
                        | _        | j                  j                          d {   | j                  _        |j                  j                  d   dk(  rMt        | j                  j                  j                  dt        j                   d| dd	             d {    d
| _         |S 7 7 7 w)Nzkernel was already started)kmrD   show_tracebackslanguagepythonz+import os
                    
os.environ["z"]="z"
                    Fstore_historyT)r-   r
   r   r   r   r   executorasync_start_new_kernel_clientkcrA   
kernelspecexecuter   VOILA_KERNEL_ID)r0   nbrf   rh   r   s        r3   rp   z$NotebookRenderer._jinja_kernel_start   s    &&D(DD&..%'' 44DD	
 "&!L!L!NN ;;!!*-9  ((##/#?#?"@YK P #(	 )    #/ / O
s5   "DC>AD8D 9A7D0D1D DDc                 2  K   | j                   j                  r,t               j                  |dd| j                  ii      \  }}n$| j
                  j                  d       d {   }|j                  |_        | j                          d {    y 7 .7 w)NrA   rH   F)
cleanup_kc)	r   rm   r   
preprocessr8   r   async_executecells_cleanup_resources)r0   r   rf   resultr\   s        r3   rq   z(NotebookRenderer._jinja_notebook_execute   s     
 ##99/1<<Z&$((!34IFA  ==66%6HHF<<%%'''	 I 	(s$   A"B$B%(BBBBc                   K   t               j                  |dd| j                  ii      \  }}|j                  D ]  }|j	                         }|  | j                          d {    y 7 w)NrA   rH   )r   r   r8   r   copyr   )r0   r   rf   r\   
input_celloutputs         r3   rr   z8NotebookRenderer._jinja_cell_generator_without_execution  sj     ')44fdhh/0
A (( 	J__&FL	 %%'''s   A%A/'A-(A/c           	       K   t               j                  |dd| j                  ii      \  }}t        |j                        D ]2  \  }}	 | j
                  j                  |d|d       d{   }| 4 | j9                          d{    y7 $# t        $ r |}Y |  .t        $ rg | j                  j                  d|       | j
                  j                         r&t        |       | j
                  j                  |       |}Y |  t        $ r}| j                  j                  d|       t        j                   j#                         }| j
                  j                         r0ddd	j%                  | j
                  j&                        d
g|_        nKdt+        |      j,                  t/        |      t1        j2                  t5        j6                          dg|_        Y d}~d}~ww xY w#  w xY w7 xw)z<Generator that will execute a single notebook cell at a timerA   rH   NFr   z(Error at server while executing cell: %rstreamstderrz:An exception occurred at the server (not the notebook). {})output_typer@   texterror)r   enameevalue	traceback)r   r   r8   	enumerater   r   execute_cellTimeoutErrorr   log	exceptionshould_strip_errorr   strip_code_cell_errors	Exceptionnbformatv4new_code_cellformatcell_error_instructionoutputsrP   __name__rO   r   format_exceptionsysexc_infor   )r0   r   rf   r\   cell_idxr   output_celles           r3   rs   z&NotebookRenderer._jinja_cell_generator  s    ')44fdhh/0
A %.bhh$7 *	" Hj)"$(MM$>$>he %? % P "!U*	"X %%'''U   (F "!E & "">
 ==335,Z8MM88D(4 "!3  "">
 'kk779==335 ,4$,$`$g$g $ D D%+K' ,3%)!W%5%5&)!f)2)C)CS\\^)T	+K'!2 "!'s   AH
"B,B-B1HHHBG6G9H&A&G6G9HG6CG1+G91G66G99H  Hc                 z   K   t        | j                  j                  j                                d {    y 7 wN)r
   r   r   stop_channels)r0   s    r3   r   z#NotebookRenderer._cleanup_resourcesG  s'     4==++99;<<<s   1;9;c                   K   t        | j                  j                  |             d {   }d|vr#t        j                  j                  d| d      t        j                  j                  |j                  dd            \  }}|j                  d      dk(  r6|d   }| j                  j                  r| j                  |       d {   }|S || j                  j                  v r6| j                  j                  |   }| j                  ||	       d {   }|S t        j                  j                  d
d|       7 7 z7 .w)N)rH   contenti  z can not be foundrH   r~   rP   r7   )r     zFailed to load )r
   r!   r*   tornadoweb	HTTPErrorrG   rH   rK   r   attempt_fix_notebookfix_notebookextension_language_mappingcreate_notebook)r0   rH   model__	extensionr7   r   s          r3   rF   zNotebookRenderer.load_notebookJ  s+    "4#8#8#<#<$#<#GHHE!++''v5F-GHH((62)>?I99V
*Y'H''<<!%!2!28!<<O$22MMM//JJ9UH!11%(1KKHO++''tf-EFF I = Ls5   )EEB EEAEE	*EE	Ec                   K   d|j                   vr#t        j                         |j                   _        |j                   j                  }|j	                  d| j
                        }t        | j                  j                                d{   }||vr|}|j	                  d|j                   j	                  di       j	                  dd            }| j                  |j                         |       d{   }| j                  j                  d||       ||j                   j                  _        ||   d	   d
   |j                   j                  _        ||   d	   d   |j                   j                  _        |S 7 7 w)zReturns a notebook object with a valid kernelspec.

        In case the kernel is not found, we search for a matching kernel based on the language.
        r   r@   Nr   language_infor~   kernel_specsz.Could not find a kernel named %r, will use  %rspecdisplay_name)rA   r   NotebookNoder   r*   r,   r
   r"   get_all_specsfind_kernel_name_for_languagelowerr   warningr@   r   r   )r0   r7   r   kernel_nameall_kernel_specsmissing_kernel_namer   s          r3   r   zNotebookRenderer.fix_notebook[  sv     x000+3+@+@+BH(&&11
 nnVT-E-EF!-d.F.F.T.T.V!WW.."-!~~H--11/2FJJ6SUVH !% B B /? !C ! K HH@# -8$$)4D[4Q5

5$$1 1A0Mf0U1
$$- / Xs&   B
FE>A*F7F 8BF Fc                 T  K   t        | j                  j                                d {   }| j                  ||       d {   }||   }t        j
                  j                  d|d   d   |d   d   |dit        j
                  j                  |d         g      }|S 7 z7 aw)	Nr   r   r   r   r   )r   r   r@   r   )rA   r   )r
   r"   r   r   r   r   new_notebookr   )r0   r   r   r   r   r   r7   s          r3   r   z NotebookRenderer.create_notebook  s     !-d.F.F.T.T.V!WW >>#3 ? 
 
  ,;;++$(L$@ $VZ 8' ;;,,U9-=>? , 	
  X
s"   'B(B$B(B&A B(&B(c                   K   || j                   j                  v r| j                   j                  |   S +t        | j                  j	                                d{   j                         D cg c].  \  }}|d   d   j                         |j                         k(  r|0 }}}|r|j                  fd       |d   S t        j                  j                  dd|z        7 c c}}w w)	zFinds a best matching kernel name given a kernel language.

        If multiple kernels matches are found, we try to return the same kernel name each time.
        Nr   r   c                     |    d   d   S )Nr   r    )r@   r   s    r3   <lambda>z@NotebookRenderer.find_kernel_name_for_language.<locals>.<lambda>  s    ,t*<V*D^*T r4   )keyr   r   z'No Jupyter kernel for language %r found)r   language_kernel_mappingr
   r"   r   itemsr   sortr   r   r   )r0   kernel_languager   r@   kernelmatchess     `   r3   r   z.NotebookRenderer.find_kernel_name_for_language  s     
 d66NNN++CCOTT!-d.F.F.T.T.V!WWL !- 2 2 4
ff~j)//1_5J5J5LL 
 

 LLTLU1:++''>P  X
s%   AC2C*C253C,(AC2,C2)r5   N)NNr   )r   
__module____qualname____doc__r)   re   r	   rO   r   rv   r   r   r   r|   r   rp   rq   rr   rs   r   rF   r   r   r   __classcell__)r2   s   @r3   r   r   "   s    /;*_6F '+$
d#$
 
	$
P '+#d## 
tCy)#	$	#( '+d# 
	6( (1(f=G"#J$r4   r   )&rG   r   r   	functoolsr   r   r   typingr   r   r   r   r	   r   tornado.webr   jupyter_core.utilsr
   jupyter_server.config_managerr   nbclient.exceptionsr   #nbconvert.preprocessors.clearoutputr   traitlets.config.configurabler   voila.configurationr   r   r   r   rV   r   pathsr   utilsr   r   r   r4   r3   <module>r      sO    
 
    @ @   + : 2 G = 2 < # ) E* Er4   