3636
3737NB_FORMAT_VERSION = 4
3838
39+ def get_language_from_nb_metadata (metadata ):
40+ ks_lang = metadata .kernelspec .get ("language" , None )
41+ li_name = None
42+ li = metadata .get ("language_info" , None )
43+ if li :
44+ li_name = metadata .language_info .get ("name" , None )
45+ return ks_lang or li_name
46+
3947# exception to indicate the kernel needs restarting
4048class RestartKernel (Exception ):
4149 pass
@@ -192,7 +200,7 @@ def notebook_execute(options, status):
192200 nb_parameterize (nb , quarto_kernel_setup_options ["params" ])
193201
194202 # insert setup cell
195- setup_cell = nb_setup_cell (nb . metadata . kernelspec , quarto_kernel_setup_options )
203+ setup_cell = nb_setup_cell (nb , quarto_kernel_setup_options )
196204 nb .cells .insert (0 , setup_cell )
197205
198206 nb_cache = retrieve_nb_from_cache (nb , status , ** quarto_kernel_setup_options )
@@ -254,7 +262,8 @@ def handle_meta_object(obj):
254262 if cell .cell_type == 'code' :
255263 total_code_cells += 1
256264 # map cells to their labels
257- label = nb_cell_yaml_options (client .nb .metadata .kernelspec .language , cell ).get ('label' , '' )
265+ language = get_language_from_nb_metadata (client .nb .metadata )
266+ label = nb_cell_yaml_options (language , cell ).get ('label' , '' )
258267 cell_labels .append (label )
259268 # find max label length
260269 max_label_len = max (max_label_len , len (label ))
@@ -350,7 +359,7 @@ def handle_meta_object(obj):
350359 nb_write (client .nb , input )
351360
352361 # execute cleanup cell
353- cleanup_cell = nb_cleanup_cell (nb . metadata . kernelspec , resource_dir )
362+ cleanup_cell = nb_cleanup_cell (nb , resource_dir )
354363 if cleanup_cell :
355364 kernel_supports_daemonization = True
356365 nb .cells .append (cleanup_cell )
@@ -425,18 +434,20 @@ async def get_info():
425434def nb_write (nb , input ):
426435 nbformat .write (nb , input , version = NB_FORMAT_VERSION )
427436
428- def nb_setup_cell (kernelspec , options ):
437+ def nb_setup_cell (nb , options ):
429438 options = dict (options )
430439 options ["allow_empty" ] = True
431- return nb_language_cell ('setup' , kernelspec , ** options )
440+ return nb_language_cell ('setup' , nb , ** options )
432441
433- def nb_cleanup_cell (kernelspec , resource_dir ):
434- return nb_language_cell ('cleanup' , kernelspec , resource_dir , False )
442+ def nb_cleanup_cell (nb , resource_dir ):
443+ return nb_language_cell ('cleanup' , nb , resource_dir , False )
435444
436- def nb_language_cell (name , kernelspec , resource_dir , allow_empty , ** args ):
437- trace (json .dumps (kernelspec , indent = 2 ))
445+ def nb_language_cell (name , nb , resource_dir , allow_empty , ** args ):
446+ kernelspec = nb .metadata .kernelspec
447+ language = get_language_from_nb_metadata (nb .metadata )
448+ trace (json .dumps (nb .metadata , indent = 2 ))
438449 source = ''
439- lang_dir = os .path .join (resource_dir , 'jupyter' , 'lang' , kernelspec . language )
450+ lang_dir = os .path .join (resource_dir , 'jupyter' , 'lang' , language )
440451 if os .path .isdir (lang_dir ):
441452 cell_file = glob .glob (os .path .join (lang_dir , name + '.*' ))
442453 # base64-encode the run_path given
@@ -445,7 +456,7 @@ def nb_language_cell(name, kernelspec, resource_dir, allow_empty, **args):
445456 with open (cell_file [0 ], 'r' ) as file :
446457 source = file .read ().format (** args )
447458 else :
448- trace (f'No { kernelspec . language } directory found in { lang_dir } ' )
459+ trace (f'No { language } directory found in { lang_dir } ' )
449460 trace (f'Will look for explicit quarto setup cell information in kernelspec dir' )
450461 try :
451462 with open (os .path .join (kernelspec .path , f"quarto_{ name } _cell" ), 'r' ) as file :
@@ -500,8 +511,9 @@ def nb_kernel_dependencies(setup_cell):
500511
501512def cell_execute (client , cell , index , execution_count , eval_default , store_history ):
502513
514+ language = get_language_from_nb_metadata (client .nb .metadata )
503515 # read cell options
504- cell_options = nb_cell_yaml_options (client . nb . metadata . kernelspec . language , cell )
516+ cell_options = nb_cell_yaml_options (language , cell )
505517
506518 # check options for eval and error
507519 eval = cell_options .get ('eval' , eval_default )
@@ -560,7 +572,7 @@ def clear_user_expressions():
560572 del metadata ["user_expressions" ]
561573
562574 # find expressions in source
563- language = client .nb .metadata . kernelspec . language
575+ language = get_language_from_nb_metadata ( client .nb .metadata )
564576 source = '' .join (cell .source )
565577 expressions = re .findall (
566578 fr'(?:^|[^`])`{{{ language } }}[ \t]([^`]+)`' ,
@@ -623,7 +635,7 @@ def nb_parameterize(nb, params):
623635
624636 # alias kernel name and language
625637 kernel_name = nb .metadata .kernelspec .name
626- language = nb .metadata . kernelspec . language
638+ language = get_language_from_nb_metadata ( nb .metadata )
627639
628640 # find params index and note any tags/yaml on it (exit if no params)
629641 params_index = find_first_tagged_cell_index (nb , "parameters" )
@@ -701,7 +713,7 @@ def find_first_tagged_cell_index(nb, tag):
701713 return parameters_indices [0 ]
702714
703715def nb_strip_yaml_options (client , source ):
704- yaml_lines = nb_cell_yaml_lines (client .nb .metadata . kernelspec . language , source )
716+ yaml_lines = nb_cell_yaml_lines (get_language_from_nb_metadata ( client .nb .metadata ) , source )
705717 num_yaml_lines = len (yaml_lines )
706718 if num_yaml_lines > 0 :
707719 return "\n " .join (source .splitlines ()[num_yaml_lines :])
0 commit comments