sphinx.py
264 lines
| 9.3 KiB
| text/x-python
|
PythonLexer
Jonathan Frederic
|
r10436 | """Module that allows custom Sphinx parameters to be set on the notebook and | ||
Jonathan Frederic
|
r10674 | on the 'other' object passed into Jinja. Called prior to Jinja conversion | ||
process. | ||||
Jonathan Frederic
|
r9772 | """ | ||
Jonathan Frederic
|
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 | ||||
#----------------------------------------------------------------------------- | ||||
Jonathan Frederic
|
r10674 | |||
Jonathan Frederic
|
r10436 | from __future__ import print_function, absolute_import | ||
Jonathan Frederic
|
r9772 | |||
Jonathan Frederic
|
r10436 | # Stdlib imports | ||
Jonathan Frederic
|
r9772 | import os.path | ||
# Used to set the default date to today's date | ||||
from datetime import date | ||||
Jonathan Frederic
|
r10436 | # Third-party imports | ||
Jonathan Frederic
|
r9780 | # Needed for Pygments latex definitions. | ||
from pygments.formatters import LatexFormatter | ||||
Jonathan Frederic
|
r10436 | # Our own imports | ||
# Configurable traitlets | ||||
from IPython.utils.traitlets import Unicode, Bool | ||||
Jonathan Frederic
|
r12402 | from IPython.utils import text | ||
Jonathan Frederic
|
r10436 | |||
Paul Ivanov
|
r12219 | # Needed to override preprocessor | ||
from .base import (Preprocessor) | ||||
Jonathan Frederic
|
r9772 | |||
Brian E. Granger
|
r11089 | from IPython.nbconvert.utils import console | ||
Jonathan Frederic
|
r10674 | |||
Jonathan Frederic
|
r10436 | #----------------------------------------------------------------------------- | ||
# Classes and functions | ||||
#----------------------------------------------------------------------------- | ||||
Jonathan Frederic
|
r10674 | |||
Paul Ivanov
|
r12219 | class SphinxPreprocessor(Preprocessor): | ||
Jonathan Frederic
|
r9772 | """ | ||
Paul Ivanov
|
r12219 | Sphinx utility preprocessor. | ||
Jonathan Frederic
|
r9772 | |||
Paul Ivanov
|
r12219 | This preprocessor is used to set variables needed by the latex to build | ||
Jonathan Frederic
|
r9772 | Sphinx stylized templates. | ||
""" | ||||
Matthias BUSSONNIER
|
r10875 | interactive = Bool(False, config=True, help=""" | ||
Jonathan Frederic
|
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. | ||||
""") | ||||
Jonathan Frederic
|
r9772 | |||
author = Unicode("Unknown Author", config=True, help="Author name") | ||||
Jonathan Frederic
|
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" | ||||
""") | ||||
Jonathan Frederic
|
r9772 | |||
Jonathan Frederic
|
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" | ||||
""") | ||||
Jonathan Frederic
|
r9772 | |||
Jonathan Frederic
|
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" | ||||
""") | ||||
Jonathan Frederic
|
r9772 | |||
Jonathan Frederic
|
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) | ||||
""") | ||||
Jonathan Frederic
|
r9772 | |||
Jonathan Frederic
|
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) | ||||
""") | ||||
Jonathan Frederic
|
r9939 | |||
Jonathan Frederic
|
r9949 | center_output = Bool(False, config=True, help=""" | ||
Jonathan Frederic
|
r10674 | Optional attempt to center all output. If this is false, no additional | ||
formatting is applied. | ||||
""") | ||||
Jonathan Frederic
|
r9949 | |||
use_headers = Bool(True, config=True, help=""" | ||||
Jonathan Frederic
|
r10674 | Whether not a header should be added to the document. | ||
""") | ||||
Jonathan Frederic
|
r9949 | |||
Jonathan Frederic
|
r10674 | #Allow the user to override the title of the notebook (useful for | ||
#fancy document titles that the file system doesn't support.) | ||||
Jonathan Frederic
|
r10174 | overridetitle = Unicode("", config=True, help="") | ||
Jonathan Frederic
|
r10674 | |||
Jonathan Frederic
|
r10174 | |||
Paul Ivanov
|
r12219 | def preprocess(self, nb, resources): | ||
Jonathan Frederic
|
r9775 | """ | ||
Paul Ivanov
|
r12219 | Sphinx preprocessing to apply on each notebook. | ||
Jonathan Frederic
|
r10674 | |||
Parameters | ||||
---------- | ||||
nb : NotebookNode | ||||
Notebook being converted | ||||
resources : dictionary | ||||
Additional resources used in the conversion process. Allows | ||||
Paul Ivanov
|
r12219 | preprocessors to pass variables into the Jinja engine. | ||
Jonathan Frederic
|
r9775 | """ | ||
MinRK
|
r12084 | # import sphinx here, so that sphinx is not a dependency when it's not used | ||
import sphinx | ||||
Jonathan Frederic
|
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. | ||||
Jonathan Frederic
|
r12143 | if not isinstance(resources["sphinx"], dict): | ||
Jonathan Frederic
|
r10674 | resources["sphinx"] = {} | ||
Jonathan Frederic
|
r9918 | |||
Jonathan Frederic
|
r9772 | if self.interactive: | ||
# Prompt the user for additional meta data that doesn't exist currently | ||||
# but would be usefull for Sphinx. | ||||
Jonathan Frederic
|
r11383 | resources["sphinx"]["author"] = self._prompt_author() | ||
resources["sphinx"]["version"] = self._prompt_version() | ||||
resources["sphinx"]["release"] = self._prompt_release() | ||||
resources["sphinx"]["date"] = self._prompt_date() | ||||
Jonathan Frederic
|
r9772 | |||
# Prompt the user for the document style. | ||||
Jonathan Frederic
|
r10674 | resources["sphinx"]["chapterstyle"] = self._prompt_chapter_title_style() | ||
resources["sphinx"]["outputstyle"] = self._prompt_output_style() | ||||
Jonathan Frederic
|
r9949 | |||
# Small options | ||||
Brian E. Granger
|
r11089 | resources["sphinx"]["centeroutput"] = console.prompt_boolean("Do you want to center the output? (false)", False) | ||
resources["sphinx"]["header"] = console.prompt_boolean("Should a Sphinx document header be used? (true)", True) | ||||
Jonathan Frederic
|
r9772 | else: | ||
# Try to use the traitlets. | ||||
Jonathan Frederic
|
r11383 | resources["sphinx"]["author"] = self.author | ||
resources["sphinx"]["version"] = self.version | ||||
resources["sphinx"]["release"] = self.release | ||||
Jonathan Frederic
|
r9772 | |||
Jonathan Frederic
|
r9949 | # Use todays date if none is provided. | ||
Jonathan Frederic
|
r11383 | if self.publish_date: | ||
resources["sphinx"]["date"] = self.publish_date | ||||
elif len(resources['metadata']['modified_date'].strip()) == 0: | ||||
Jonathan Frederic
|
r12402 | resources["sphinx"]["date"] = date.today().strftime(text.date_format) | ||
Jonathan Frederic
|
r9772 | else: | ||
Jonathan Frederic
|
r11383 | resources["sphinx"]["date"] = resources['metadata']['modified_date'] | ||
Jonathan Frederic
|
r9949 | |||
# Sphinx traitlets. | ||||
Jonathan Frederic
|
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 | ||||
Jonathan Frederic
|
r9772 | |||
# Find and pass in the path to the Sphinx dependencies. | ||||
MinRK
|
r12055 | resources["sphinx"]["texinputs"] = os.path.realpath(os.path.join(sphinx.package_dir, "texinputs")) | ||
Jonathan Frederic
|
r9772 | |||
Jonathan Frederic
|
r9780 | # Generate Pygments definitions for Latex | ||
Jonathan Frederic
|
r10674 | resources["sphinx"]["pygment_definitions"] = self._generate_pygments_latex_def() | ||
Jonathan Frederic
|
r9780 | |||
Jonathan Frederic
|
r10174 | if not (self.overridetitle == None or len(self.overridetitle.strip()) == 0): | ||
Jonathan Frederic
|
r11383 | resources['metadata']['name'] = self.overridetitle | ||
Jonathan Frederic
|
r10174 | |||
Jonathan Frederic
|
r9772 | # End | ||
Jonathan Frederic
|
r10674 | return nb, resources | ||
Jonathan Frederic
|
r9780 | |||
def _generate_pygments_latex_def(self): | ||||
Jonathan Frederic
|
r10674 | """ | ||
Generate the pygments latex definitions that allows pygments | ||||
to work in latex. | ||||
""" | ||||
Jonathan Frederic
|
r9780 | return LatexFormatter().get_style_defs() | ||
Jonathan Frederic
|
r9772 | |||
Jonathan Frederic
|
r10674 | |||
Jonathan Frederic
|
r9772 | def _prompt_author(self): | ||
Jonathan Frederic
|
r10674 | """ | ||
Prompt the user to input an Author name | ||||
""" | ||||
Brian E. Granger
|
r11089 | return console.input("Author name: ") | ||
Jonathan Frederic
|
r10674 | |||
Jonathan Frederic
|
r9772 | |||
def _prompt_version(self): | ||||
Jonathan Frederic
|
r10674 | """ | ||
prompt the user to enter a version number | ||||
""" | ||||
Brian E. Granger
|
r11089 | return console.input("Version (ie ""1.0.0""): ") | ||
Jonathan Frederic
|
r10674 | |||
Jonathan Frederic
|
r9772 | |||
def _prompt_release(self): | ||||
Jonathan Frederic
|
r10674 | """ | ||
Prompt the user to input a release name | ||||
""" | ||||
Brian E. Granger
|
r11089 | return console.input("Release Name (ie ""Rough draft""): ") | ||
Jonathan Frederic
|
r10674 | |||
Jonathan Frederic
|
r9772 | |||
Jonathan Frederic
|
r11383 | def _prompt_date(self, resources): | ||
Jonathan Frederic
|
r10674 | """ | ||
Prompt the user to enter a date | ||||
""" | ||||
Jonathan Frederic
|
r11383 | if resources['metadata']['modified_date']: | ||
default_date = resources['metadata']['modified_date'] | ||||
else: | ||||
Jonathan Frederic
|
r12402 | default_date = date.today().strftime(text.date_format) | ||
Jonathan Frederic
|
r11383 | |||
Brian E. Granger
|
r11089 | user_date = console.input("Date (deafults to \"" + default_date + "\"): ") | ||
Jonathan Frederic
|
r9772 | if len(user_date.strip()) == 0: | ||
user_date = default_date | ||||
return user_date | ||||
Jonathan Frederic
|
r10674 | |||
Jonathan Frederic
|
r9939 | def _prompt_output_style(self): | ||
Jonathan Frederic
|
r10674 | """ | ||
MinRK
|
r11046 | Prompts the user to pick an IPython output style. | ||
Jonathan Frederic
|
r10674 | """ | ||
Jonathan Frederic
|
r9939 | |||
# Dictionary of available output styles | ||||
styles = {1: "simple", | ||||
2: "notebook"} | ||||
#Append comments to the menu when displaying it to the user. | ||||
Jonathan Frederic
|
r10037 | comments = {1: "(recommended for long code segments)", | ||
2: "(default)"} | ||||
Jonathan Frederic
|
r9939 | |||
Brian E. Granger
|
r11089 | return console.prompt_dictionary(styles, default_style=2, menu_comments=comments) | ||
Jonathan Frederic
|
r10674 | |||
Jonathan Frederic
|
r9939 | |||
Jonathan Frederic
|
r9772 | def _prompt_chapter_title_style(self): | ||
Jonathan Frederic
|
r10674 | """ | ||
Prompts the user to pick a Sphinx chapter style | ||||
""" | ||||
Jonathan Frederic
|
r9772 | |||
# Dictionary of available Sphinx styles | ||||
styles = {1: "Bjarne", | ||||
2: "Lenny", | ||||
3: "Glenn", | ||||
4: "Conny", | ||||
5: "Rejne", | ||||
6: "Sonny"} | ||||
Jonathan Frederic
|
r9938 | #Append comments to the menu when displaying it to the user. | ||
comments = {1: "(default)", | ||||
6: "(for international documents)"} | ||||
Brian E. Granger
|
r11089 | return console.prompt_dictionary(styles, menu_comments=comments) | ||