70 lines
2.8 KiB
Python
70 lines
2.8 KiB
Python
|
"""Generic script exporter class for any kernel language"""
|
||
|
|
||
|
# Copyright (c) Jupyter Development Team.
|
||
|
# Distributed under the terms of the Modified BSD License.
|
||
|
|
||
|
import entrypoints
|
||
|
from .templateexporter import TemplateExporter
|
||
|
|
||
|
from traitlets import Dict, default
|
||
|
from .base import get_exporter
|
||
|
|
||
|
|
||
|
class ScriptExporter(TemplateExporter):
|
||
|
# Caches of already looked-up and instantiated exporters for delegation:
|
||
|
_exporters = Dict()
|
||
|
_lang_exporters = Dict()
|
||
|
export_from_notebook = "Script"
|
||
|
|
||
|
@default('template_file')
|
||
|
def _template_file_default(self):
|
||
|
return 'script.j2'
|
||
|
|
||
|
@default('template_name')
|
||
|
def _template_name_default(self):
|
||
|
return 'script'
|
||
|
|
||
|
def _get_language_exporter(self, lang_name):
|
||
|
"""Find an exporter for the language name from notebook metadata.
|
||
|
|
||
|
Uses the nbconvert.exporters.script group of entry points.
|
||
|
Returns None if no exporter is found.
|
||
|
"""
|
||
|
if lang_name not in self._lang_exporters:
|
||
|
try:
|
||
|
Exporter = entrypoints.get_single(
|
||
|
'nbconvert.exporters.script', lang_name).load()
|
||
|
except entrypoints.NoSuchEntryPoint:
|
||
|
self._lang_exporters[lang_name] = None
|
||
|
else:
|
||
|
# TODO: passing config is wrong, but changing this revealed more complicated issues
|
||
|
self._lang_exporters[lang_name] = Exporter(config=self.config, parent=self)
|
||
|
return self._lang_exporters[lang_name]
|
||
|
|
||
|
def from_notebook_node(self, nb, resources=None, **kw):
|
||
|
langinfo = nb.metadata.get('language_info', {})
|
||
|
|
||
|
# delegate to custom exporter, if specified
|
||
|
exporter_name = langinfo.get('nbconvert_exporter')
|
||
|
if exporter_name and exporter_name != 'script':
|
||
|
self.log.debug("Loading script exporter: %s", exporter_name)
|
||
|
if exporter_name not in self._exporters:
|
||
|
Exporter = get_exporter(exporter_name)
|
||
|
# TODO: passing config is wrong, but changing this revealed more complicated issues
|
||
|
self._exporters[exporter_name] = Exporter(config=self.config, parent=self)
|
||
|
exporter = self._exporters[exporter_name]
|
||
|
return exporter.from_notebook_node(nb, resources, **kw)
|
||
|
|
||
|
# Look up a script exporter for this notebook's language
|
||
|
lang_name = langinfo.get('name')
|
||
|
if lang_name:
|
||
|
self.log.debug("Using script exporter for language: %s", lang_name)
|
||
|
exporter = self._get_language_exporter(lang_name)
|
||
|
if exporter is not None:
|
||
|
return exporter.from_notebook_node(nb, resources, **kw)
|
||
|
|
||
|
# Fall back to plain script export
|
||
|
self.file_extension = langinfo.get('file_extension', '.txt')
|
||
|
self.output_mimetype = langinfo.get('mimetype', 'text/plain')
|
||
|
return super().from_notebook_node(nb, resources, **kw)
|