sphinx.py
281 lines
| 9.7 KiB
| text/x-python
|
PythonLexer
|
r10436 | """Module that allows custom Sphinx parameters to be set on the notebook and | |
|
r10674 | on the 'other' object passed into Jinja. Called prior to Jinja conversion | |
process. | |||
|
r9772 | """ | |
|
r10436 | #----------------------------------------------------------------------------- | |
# Copyright (c) 2013, the IPython Development Team. | |||
# | |||
# Distributed under the terms of the Modified BSD License. | |||
# | |||
# The full license is in the file COPYING.txt, distributed with this software. | |||
#----------------------------------------------------------------------------- | |||
#----------------------------------------------------------------------------- | |||
# Imports | |||
#----------------------------------------------------------------------------- | |||
|
r10674 | ||
|
r10436 | from __future__ import print_function, absolute_import | |
|
r9772 | ||
|
r10436 | # Stdlib imports | |
|
r9772 | # Used to find Sphinx package location | |
import sphinx | |||
import os.path | |||
# Used to set the default date to today's date | |||
from datetime import date | |||
|
r10436 | # Third-party imports | |
|
r9780 | # Needed for Pygments latex definitions. | |
from pygments.formatters import LatexFormatter | |||
|
r10436 | # Our own imports | |
# Configurable traitlets | |||
from IPython.utils.traitlets import Unicode, Bool | |||
|
r9772 | # Needed to override transformer | |
|
r10624 | from .activatable import (ActivatableTransformer) #TODO | |
|
r9772 | ||
|
r10674 | import nbconvert.utils.console | |
|
r10436 | #----------------------------------------------------------------------------- | |
# Classes and functions | |||
#----------------------------------------------------------------------------- | |||
|
r10674 | ||
|
r9775 | class SphinxTransformer(ActivatableTransformer): | |
|
r9772 | """ | |
Sphinx utility transformer. | |||
This transformer is used to set variables needed by the latex to build | |||
Sphinx stylized templates. | |||
""" | |||
interactive = Bool(True, config=True, help=""" | |||
|
r10674 | Allows you to define whether or not the Sphinx exporter will prompt | |
you for input during the conversion process. If this is set to false, | |||
the author, version, release, date, and chapter_style traits should | |||
be set. | |||
""") | |||
|
r9772 | ||
author = Unicode("Unknown Author", config=True, help="Author name") | |||
|
r10674 | version = Unicode("", config=True, help=""" | |
Version number | |||
You can leave this blank if you do not want to render a version number. | |||
Example: "1.0.0" | |||
""") | |||
|
r9772 | ||
|
r10674 | release = Unicode("", config=True, help=""" | |
Release name | |||
You can leave this blank if you do not want to render a release name. | |||
Example: "Rough Draft" | |||
""") | |||
|
r9772 | ||
|
r10674 | publish_date = Unicode("", config=True, help=""" | |
Publish date | |||
This is the date to render on the document as the publish date. | |||
Leave this blank to default to todays date. | |||
Example: "June 12, 1990" | |||
""") | |||
|
r9772 | ||
|
r10674 | chapter_style = Unicode("Bjarne", config=True, help=""" | |
Sphinx chapter style | |||
This is the style to use for the chapter headers in the document. | |||
You may choose one of the following: | |||
"Bjarne" (default) | |||
"Lenny" | |||
"Glenn" | |||
"Conny" | |||
"Rejne" | |||
"Sonny" (used for international documents) | |||
""") | |||
|
r9772 | ||
|
r10674 | output_style = Unicode("notebook", config=True, help=""" | |
Nbconvert Ipython | |||
notebook input/output formatting style. | |||
You may choose one of the following: | |||
"simple (recommended for long code segments)" | |||
"notebook" (default) | |||
""") | |||
|
r9939 | ||
|
r9949 | center_output = Bool(False, config=True, help=""" | |
|
r10674 | Optional attempt to center all output. If this is false, no additional | |
formatting is applied. | |||
""") | |||
|
r9949 | ||
use_headers = Bool(True, config=True, help=""" | |||
|
r10674 | Whether not a header should be added to the document. | |
""") | |||
|
r9949 | ||
|
r10674 | #Allow the user to override the title of the notebook (useful for | |
#fancy document titles that the file system doesn't support.) | |||
|
r10174 | overridetitle = Unicode("", config=True, help="") | |
|
r10674 | ||
|
r10174 | ||
|
r10674 | def __call__(self, nb, resources): | |
|
r9772 | """ | |
|
r10674 | Entrypoint | |
|
r9772 | Since we are not interested in any additional manipulation on a cell | |
by cell basis, we do not call the base implementation. | |||
|
r10674 | ||
Parameters | |||
---------- | |||
nb : NotebookNode | |||
Notebook being converted | |||
resources : dictionary | |||
Additional resources used in the conversion process. Allows | |||
transformers to pass variables into the Jinja engine. | |||
""" | |||
|
r9775 | if self.enabled: | |
|
r10674 | return self.transform(nb, resources) | |
|
r9807 | else: | |
|
r10674 | return nb,resources | |
|
r9772 | ||
|
r10674 | def transform(self, nb, resources): | |
|
r9775 | """ | |
Sphinx transformation to apply on each notebook. | |||
|
r10674 | ||
Parameters | |||
---------- | |||
nb : NotebookNode | |||
Notebook being converted | |||
resources : dictionary | |||
Additional resources used in the conversion process. Allows | |||
transformers to pass variables into the Jinja engine. | |||
|
r9775 | """ | |
|
r9918 | ||
# TODO: Add versatile method of additional notebook metadata. Include | |||
# handling of multiple files. For now use a temporay namespace, | |||
# '_draft' to signify that this needs to change. | |||
|
r9923 | if not "_draft" in nb.metadata: | |
nb.metadata._draft = {} | |||
|
r9937 | ||
|
r10674 | if not "sphinx" in resources: | |
resources["sphinx"] = {} | |||
|
r9918 | ||
|
r9772 | if self.interactive: | |
# Prompt the user for additional meta data that doesn't exist currently | |||
# but would be usefull for Sphinx. | |||
|
r9918 | nb.metadata._draft["author"] = self._prompt_author() | |
nb.metadata._draft["version"] = self._prompt_version() | |||
nb.metadata._draft["release"] = self._prompt_release() | |||
nb.metadata._draft["date"] = self._prompt_date() | |||
|
r9772 | ||
# Prompt the user for the document style. | |||
|
r10674 | resources["sphinx"]["chapterstyle"] = self._prompt_chapter_title_style() | |
resources["sphinx"]["outputstyle"] = self._prompt_output_style() | |||
|
r9949 | ||
# Small options | |||
|
r10674 | resources["sphinx"]["centeroutput"] = nbconvert.utils.console.prompt_boolean("Do you want to center the output? (false)", False) | |
resources["sphinx"]["header"] = nbconvert.utils.console.prompt_boolean("Should a Sphinx document header be used? (true)", True) | |||
|
r9772 | else: | |
# Try to use the traitlets. | |||
|
r9918 | nb.metadata._draft["author"] = self.author | |
nb.metadata._draft["version"] = self.version | |||
nb.metadata._draft["release"] = self.release | |||
|
r9772 | ||
|
r9949 | # Use todays date if none is provided. | |
|
r9936 | if len(self.publish_date.strip()) == 0: | |
|
r9918 | nb.metadata._draft["date"] = date.today().strftime("%B %-d, %Y") | |
|
r9772 | else: | |
|
r9936 | nb.metadata._draft["date"] = self.publish_date | |
|
r9949 | ||
# Sphinx traitlets. | |||
|
r10674 | resources["sphinx"]["chapterstyle"] = self.chapter_style | |
resources["sphinx"]["outputstyle"] = self.output_style | |||
resources["sphinx"]["centeroutput"] = self.center_output | |||
resources["sphinx"]["header"] = self.use_headers | |||
|
r9772 | ||
# Find and pass in the path to the Sphinx dependencies. | |||
|
r10674 | resources["sphinx"]["texinputs"] = os.path.abspath(sphinx.__file__ + "/../texinputs") | |
|
r9772 | ||
|
r9780 | # Generate Pygments definitions for Latex | |
|
r10674 | resources["sphinx"]["pygment_definitions"] = self._generate_pygments_latex_def() | |
|
r9780 | ||
|
r10174 | if not (self.overridetitle == None or len(self.overridetitle.strip()) == 0): | |
nb.metadata.name = self.overridetitle | |||
|
r9772 | # End | |
|
r10674 | return nb, resources | |
|
r9780 | ||
def _generate_pygments_latex_def(self): | |||
|
r10674 | """ | |
Generate the pygments latex definitions that allows pygments | |||
to work in latex. | |||
""" | |||
|
r9780 | return LatexFormatter().get_style_defs() | |
|
r9772 | ||
|
r10674 | ||
|
r9772 | def _prompt_author(self): | |
|
r10674 | """ | |
Prompt the user to input an Author name | |||
""" | |||
return nbconvert.utils.console.input("Author name: ") | |||
|
r9772 | ||
def _prompt_version(self): | |||
|
r10674 | """ | |
prompt the user to enter a version number | |||
""" | |||
return nbconvert.utils.console.input("Version (ie ""1.0.0""): ") | |||
|
r9772 | ||
def _prompt_release(self): | |||
|
r10674 | """ | |
Prompt the user to input a release name | |||
""" | |||
return nbconvert.utils.console.input("Release Name (ie ""Rough draft""): ") | |||
|
r9772 | ||
def _prompt_date(self): | |||
|
r10674 | """ | |
Prompt the user to enter a date | |||
""" | |||
|
r9772 | default_date = date.today().strftime("%B %-d, %Y") | |
|
r10674 | user_date = nbconvert.utils.console.input("Date (deafults to \"" + default_date + "\"): ") | |
|
r9772 | if len(user_date.strip()) == 0: | |
user_date = default_date | |||
return user_date | |||
|
r10674 | ||
|
r9939 | def _prompt_output_style(self): | |
|
r10674 | """ | |
Prompts the user to pick an iPython output style. | |||
""" | |||
|
r9939 | ||
# Dictionary of available output styles | |||
styles = {1: "simple", | |||
2: "notebook"} | |||
#Append comments to the menu when displaying it to the user. | |||
|
r10037 | comments = {1: "(recommended for long code segments)", | |
2: "(default)"} | |||
|
r9939 | ||
|
r10674 | return nbconvert.utils.console.prompt_dictionary(styles, default_style=2, menu_comments=comments) | |
|
r9939 | ||
|
r9772 | def _prompt_chapter_title_style(self): | |
|
r10674 | """ | |
Prompts the user to pick a Sphinx chapter style | |||
""" | |||
|
r9772 | ||
# Dictionary of available Sphinx styles | |||
styles = {1: "Bjarne", | |||
2: "Lenny", | |||
3: "Glenn", | |||
4: "Conny", | |||
5: "Rejne", | |||
6: "Sonny"} | |||
|
r9938 | #Append comments to the menu when displaying it to the user. | |
comments = {1: "(default)", | |||
6: "(for international documents)"} | |||
|
r10674 | return nbconvert.utils.console.prompt_dictionary(styles, menu_comments=comments) | |