Skip to content
Snippets Groups Projects
execute.py 2.88 KiB
Newer Older
from pathlib import Path

from mkdocs.structure.files import File
from mkdocs.plugins import BasePlugin
import nbconvert
from nbconvert.preprocessors import ExtractOutputPreprocessor
from traitlets.config import Config
import jupytext
import os
Anton Akhmerov's avatar
Anton Akhmerov committed
output_extractor = ExtractOutputPreprocessor()
output_extractor.extract_output_types = (
    output_extractor.extract_output_types
    | {'application/vnd.plotly.v1+json'}
)


class AlreadySavedFile(File):
    def copy_file(self, dirty=False):
        pass


exporter = nbconvert.TemplateExporter(
    config=Config(dict(
        TemplateExporter=dict(
            preprocessors=[
                nbconvert.preprocessors.ExecutePreprocessor,
Anton Akhmerov's avatar
Anton Akhmerov committed
                output_extractor,
            exclude_input=False,
            extra_template_basedirs=[str(Path(__file__).parent / "templates")],
            template_file='mkdocs_markdown/index.md.j2',
Anton Akhmerov's avatar
Anton Akhmerov committed
        ),
        NbConvertBase=dict(
            display_data_priority=[
                'application/vnd.plotly.v1+json',
Anton Akhmerov's avatar
Anton Akhmerov committed
                'text/html',
                'text/markdown',
                'image/svg+xml',
                'text/latex',
                'image/png',
                'image/jpeg',
                'text/plain'
            ]
        ),
writer = nbconvert.writers.FilesWriter(build_directory=str())


class Plugin(BasePlugin):
    def __init__(self):
        self.output_map = {}
    def on_page_read_source(
        self, page, config, **kwargs
    ):
        os.environ["PLOTLY_RENDERER"] = "plotly_mimetype"
        src_path = page.file.abs_src_path
        notebook = jupytext.read(src_path)
        output, resources = exporter.from_notebook_node(
            notebook,
            resources={
                "unique_key": page.file.src_path,
                # Compute the relative URL
                "output_files_dir": "_execute_outputs",
                "metadata": {
                    "path": Path(src_path).parent
                }
            }
        )
        build_directory = Path(config["site_dir"])
        nbconvert.writers.FilesWriter(
            build_directory=str(build_directory)
        ).write(output, resources, "out.md")
        out = build_directory / "out.md"
        source = out.read_text()
        out.unlink()
        self.output_map[src_path] = list(resources["outputs"].keys())
        return source
    def on_page_markdown(self, markdown, page, config, files):
        src_path = page.file.abs_src_path
        for file in self.output_map.pop(page.file.abs_src_path):
            files.append(
                AlreadySavedFile(
                    str(file),
                    config['docs_dir'],
                    config['site_dir'],
                    config['use_directory_urls']
                )
            )
plugin_instance = Plugin()
on_page_read_source = plugin_instance.on_page_read_source
on_page_markdown = plugin_instance.on_page_markdown