Source code for pyquickhelper.helpgen.process_notebook_api

# -*- coding: utf-8 -*-
"""
Direct calls to IPython API without running a command line


:githublink:`%|py|6`
"""
import os
from .utils_sphinx_doc_helpers import HelpGenException


[docs]def get_exporter(format, add_writer=False): """ Returns the :epkg:`IPython` exporter associated to a format. :param format: string (see below) :param add_writer: add writer as well :return: class Available formats: *slides*, *pdf*, *latex*, *markdown*, *html*, *rst*, *python*, *notebook*, *template*. ..versionchanged:: 1.7 Add parameter *add_writer*. :githublink:`%|py|23` """ if format == "python": from nbconvert import PythonExporter exp = PythonExporter elif format == "slides": from nbconvert import SlidesExporter exp = SlidesExporter elif format == "html": from nbconvert import HTMLExporter exp = HTMLExporter elif format == "pdf": from nbconvert import PDFExporter exp = PDFExporter elif format == "template": from nbconvert import TemplateExporter exp = TemplateExporter elif format == "markdown": from nbconvert import MarkdownExporter exp = MarkdownExporter elif format == "notebook": from nbconvert import NotebookExporter exp = NotebookExporter elif format == "rst": from .notebook_exporter import UpgradedRSTExporter exp = UpgradedRSTExporter elif format == "lagex": from nbconvert import LatexExporter exp = LatexExporter else: form = "slides, pdf, latex, markdown, html, rst, python, notebook, template" raise ValueError( "unexpected format: {0}, it should be in:\n{1}".format(format, form)) if add_writer: from nbconvert.writers import FilesWriter return exp, FilesWriter return exp
[docs]def nb2slides(nb_file, outfile, add_tag=True): """ Converts a notebook into slides, it copies :epkg:`reveal.js` if not present in the folder of the output. :param nb_file: notebook file or a stream or a :func:`read_nb <pyquickhelper.ipythonhelper.notebook_helper.read_nb>` :param outfile: output file (a string) :param add_tag: call :meth:`add_tag_slide <pyquickhelper.ipythonhelper.notebook_runner.NotebookRunner.add_tag_slide>` :return: impacted files See `How do I convert a IPython Notebook into a Python file via commandline? <http://stackoverflow.com/questions/17077494/how-do-i-convert-a-ipython-notebook-into-a-python-file-via-commandline>`_ .. exref:: :title: Convert a notebook into slides By default, the function automatically adds sections if there is none and it copies the javascript from reveal.js at the right place. :: from pyquickhelper.helpgen import nb2slides nb2slides("nb.ipynb", "convert.slides.html") :githublink:`%|py|85` """ from ..ipythonhelper import NotebookRunner, read_nb from .post_process import post_process_slides_output if isinstance(nb_file, NotebookRunner): nb = nb_file.nb else: nbr = read_nb(nb_file, kernel=False) nb = nbr.nb if add_tag: run = NotebookRunner(nb, kernel=False) run.add_tag_slide() nb = run.nb exporter = get_exporter("slides")() source = exporter.from_notebook_node(nb)[0] with open(outfile, 'w+', encoding="utf8") as fh: fh.writelines(source) # post_processing post_process_slides_output(outfile, False, False, False, False) res = [outfile] # we copy javascript dependencies, reveal.js dirname = os.path.dirname(outfile) reveal = os.path.join(dirname, "reveal.js") if not os.path.exists(reveal): from .install_js_dep import install_javascript_tools cp = install_javascript_tools(None, dest=dirname) res.extend(cp) return res
[docs]def nb2html(nb_file, outfile, exc=True): """ Converts a notebook into HTML. :param nb_file: notebook file or a stream or a :func:`read_nb <pyquickhelper.ipythonhelper.notebook_helper.read_nb>` :param outfile: output file (a string) :param exc: raises an exception (True) or a warning (False) :return: impacted files :githublink:`%|py|129` """ from ..ipythonhelper import NotebookRunner, read_nb if isinstance(nb_file, NotebookRunner): nb = nb_file.nb else: nbr = read_nb(nb_file, kernel=False) nb = nbr.nb exporter = get_exporter("html")() source = exporter.from_notebook_node(nb)[0] with open(outfile, 'w+', encoding="utf8") as fh: fh.writelines(source) # post_processing from .post_process import post_process_html_output post_process_html_output(outfile, False, False, False, exc=exc) res = [outfile] return res
[docs]def nb2rst(nb_file, outfile, exc=True, post_process=True): """ Converts a notebook into :epkg:`RST`. :param nb_file: notebook file or a stream or a :func:`read_nb <pyquickhelper.ipythonhelper.notebook_helper.read_nb>` :param outfile: output file (a string) :param exc: raises an exception (True) or a warning (False) :param post_process: calls :func:`post_process_rst_output <pyquickhelper.helpgen.post_process.post_process_rst_output>` :return: impacted files :githublink:`%|py|160` """ from ..ipythonhelper import NotebookRunner, read_nb if isinstance(nb_file, NotebookRunner): nb = nb_file.nb else: nbr = read_nb(nb_file, kernel=False) nb = nbr.nb exp_class, writer_class = get_exporter("rst", add_writer=True) exporter = exp_class() writer = writer_class() unique_key = os.path.splitext(os.path.split(outfile)[-1])[0] source, meta = exporter.from_notebook_node( nb, resources=dict(unique_key=unique_key)) name, ext = os.path.splitext(outfile) if ext != '.rst': raise ValueError("'{0}' should have extension '.rst'".format(outfile)) writer.build_directory = os.path.dirname(outfile) writer.write(source, meta, notebook_name=name) # post_processing if post_process: from .post_process import post_process_rst_output try: post_process_rst_output(outfile, False, False, False, False, False, exc=exc) except HelpGenException as e: raise HelpGenException( # pragma: no cover "Unable to postprocess notebook '{}' with writer '{}' and " "exporter '{}'".format( getattr(nb_file, '_filename', nb_file), type(writer), type(exporter))) from e res = [outfile] return res