notebook_sphinxext.py
90 lines
| 2.7 KiB
| text/x-python
|
PythonLexer
/ nbconvert1 / notebook_sphinxext.py
Jake Vanderplas
|
r8465 | import sys | ||
import os.path | ||||
import re | ||||
import time | ||||
from docutils import io, nodes, statemachine, utils | ||||
Anthony Scopatz
|
r8898 | try: | ||
from docutils.utils.error_reporting import ErrorString # the new way | ||||
except ImportError: | ||||
from docutils.error_reporting import ErrorString # the old way | ||||
Jake Vanderplas
|
r8465 | from docutils.parsers.rst import Directive, convert_directive_function | ||
from docutils.parsers.rst import directives, roles, states | ||||
from docutils.parsers.rst.roles import set_classes | ||||
from docutils.transforms import misc | ||||
from nbconvert import ConverterHTML | ||||
Jake Vanderplas
|
r8476 | class Notebook(Directive): | ||
Jake Vanderplas
|
r8465 | """ | ||
Jake Vanderplas
|
r8476 | Use nbconvert to insert a notebook into the environment. | ||
This is based on the Raw directive in docutils | ||||
Jake Vanderplas
|
r8465 | """ | ||
required_arguments = 1 | ||||
optional_arguments = 0 | ||||
final_argument_whitespace = True | ||||
option_spec = {} | ||||
has_content = False | ||||
def run(self): | ||||
Jake Vanderplas
|
r8478 | # check if raw html is supported | ||
if not self.state.document.settings.raw_enabled: | ||||
Jake Vanderplas
|
r8465 | raise self.warning('"%s" directive disabled.' % self.name) | ||
Jake Vanderplas
|
r8478 | |||
# set up encoding | ||||
Jake Vanderplas
|
r8465 | attributes = {'format': 'html'} | ||
encoding = self.options.get( | ||||
'encoding', self.state.document.settings.input_encoding) | ||||
Jake Vanderplas
|
r8476 | e_handler = self.state.document.settings.input_encoding_error_handler | ||
Jake Vanderplas
|
r8465 | |||
# get path to notebook | ||||
source_dir = os.path.dirname( | ||||
os.path.abspath(self.state.document.current_source)) | ||||
Jake Vanderplas
|
r8478 | nb_path = os.path.normpath(os.path.join(source_dir, | ||
self.arguments[0])) | ||||
nb_path = utils.relative_path(None, nb_path) | ||||
Jake Vanderplas
|
r8465 | |||
# convert notebook to html | ||||
Jake Vanderplas
|
r8478 | converter = ConverterHTML(nb_path) | ||
converter.read() | ||||
# add HTML5 scoped attribute to header style tags | ||||
header = map(lambda s: s.replace('<style', '<style scoped="scoped"'), | ||||
converter.header_body()) | ||||
# concatenate raw html lines | ||||
lines = ['<div class="ipynotebook">'] | ||||
lines.extend(header) | ||||
lines.extend(converter.main_body()) | ||||
lines.append('</div>') | ||||
text = '\n'.join(lines) | ||||
Jake Vanderplas
|
r8465 | |||
Jake Vanderplas
|
r8478 | # add dependency | ||
self.state.document.settings.record_dependencies.add(nb_path) | ||||
attributes['source'] = nb_path | ||||
# create notebook node | ||||
Jake Vanderplas
|
r8476 | nb_node = notebook('', text, **attributes) | ||
Jake Vanderplas
|
r8478 | (nb_node.source, nb_node.line) = \ | ||
self.state_machine.get_source_and_line(self.lineno) | ||||
Jake Vanderplas
|
r8476 | return [nb_node] | ||
Jake Vanderplas
|
r8465 | |||
Jake Vanderplas
|
r8476 | class notebook(nodes.raw): | ||
Jake Vanderplas
|
r8465 | pass | ||
Jake Vanderplas
|
r8476 | |||
Jake Vanderplas
|
r8465 | def visit_notebook_node(self, node): | ||
self.visit_raw(node) | ||||
Jake Vanderplas
|
r8476 | |||
Jake Vanderplas
|
r8465 | def depart_notebook_node(self, node): | ||
self.depart_raw(node) | ||||
Jake Vanderplas
|
r8476 | |||
Jake Vanderplas
|
r8465 | def setup(app): | ||
app.add_node(notebook, | ||||
html=(visit_notebook_node, depart_notebook_node)) | ||||
app.add_directive('notebook', Notebook) | ||||