script.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. """Generic script exporter class for any kernel language"""
  2. # Copyright (c) Jupyter Development Team.
  3. # Distributed under the terms of the Modified BSD License.
  4. import entrypoints
  5. from .templateexporter import TemplateExporter
  6. from traitlets import Dict, default
  7. from .base import get_exporter
  8. class ScriptExporter(TemplateExporter):
  9. # Caches of already looked-up and instantiated exporters for delegation:
  10. _exporters = Dict()
  11. _lang_exporters = Dict()
  12. export_from_notebook = "Script"
  13. @default('template_file')
  14. def _template_file_default(self):
  15. return 'script.tpl'
  16. def _get_language_exporter(self, lang_name):
  17. """Find an exporter for the language name from notebook metadata.
  18. Uses the nbconvert.exporters.script group of entry points.
  19. Returns None if no exporter is found.
  20. """
  21. if lang_name not in self._lang_exporters:
  22. try:
  23. Exporter = entrypoints.get_single(
  24. 'nbconvert.exporters.script', lang_name).load()
  25. except entrypoints.NoSuchEntryPoint:
  26. self._lang_exporters[lang_name] = None
  27. else:
  28. # TODO: passing config is wrong, but changing this revealed more complicated issues
  29. self._lang_exporters[lang_name] = Exporter(config=self.config, parent=self)
  30. return self._lang_exporters[lang_name]
  31. def from_notebook_node(self, nb, resources=None, **kw):
  32. langinfo = nb.metadata.get('language_info', {})
  33. # delegate to custom exporter, if specified
  34. exporter_name = langinfo.get('nbconvert_exporter')
  35. if exporter_name and exporter_name != 'script':
  36. self.log.debug("Loading script exporter: %s", exporter_name)
  37. if exporter_name not in self._exporters:
  38. Exporter = get_exporter(exporter_name)
  39. # TODO: passing config is wrong, but changing this revealed more complicated issues
  40. self._exporters[exporter_name] = Exporter(config=self.config, parent=self)
  41. exporter = self._exporters[exporter_name]
  42. return exporter.from_notebook_node(nb, resources, **kw)
  43. # Look up a script exporter for this notebook's language
  44. lang_name = langinfo.get('name')
  45. if lang_name:
  46. self.log.debug("Using script exporter for language: %s", lang_name)
  47. exporter = self._get_language_exporter(lang_name)
  48. if exporter is not None:
  49. return exporter.from_notebook_node(nb, resources, **kw)
  50. # Fall back to plain script export
  51. self.file_extension = langinfo.get('file_extension', '.txt')
  52. self.output_mimetype = langinfo.get('mimetype', 'text/plain')
  53. return super(ScriptExporter, self).from_notebook_node(nb, resources, **kw)