latex.py
113 lines
| 4.4 KiB
| text/x-python
|
PythonLexer
Jonathan Frederic
|
r10485 | """Latex exporter for the notebook conversion pipeline. | |
Jonathan Frederic
|
r10479 | ||
This module defines Exporter, a highly configurable converter | |||
that uses Jinja2 to export notebook files into different format. | |||
You can register both pre-transformers that will act on the notebook format | |||
Jonathan Frederic
|
r10578 | before conversion and jinja filter that would then be available in the templates | |
Jonathan Frederic
|
r10479 | """ | |
#----------------------------------------------------------------------------- | |||
# 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
|
r10585 | ||
# Stdlib imports | |||
import io | |||
import os | |||
# IPython imports | |||
from IPython.config.configurable import Configurable | |||
from IPython.nbformat import current as nbformat | |||
from IPython.utils.traitlets import MetaHasTraits, Unicode, List, Bool | |||
from IPython.utils.text import indent | |||
# other libs/dependencies | |||
from jinja2 import Environment, FileSystemLoader | |||
from markdown import markdown | |||
Jonathan Frederic
|
r10587 | # local import | |
import exporter | |||
Jonathan Frederic
|
r10585 | import filters.latex | |
import filters.pygments | |||
Jonathan Frederic
|
r10587 | from transformers.latex import LatexTransformer | |
Jonathan Frederic
|
r10479 | #----------------------------------------------------------------------------- | |
# Globals and constants | |||
#----------------------------------------------------------------------------- | |||
#Latex Jinja2 constants | |||
LATEX_TEMPLATE_PATH = "/../templates/tex/" | |||
LATEX_TEMPLATE_SKELETON_PATH = "/../templates/tex/skeleton/" | |||
LATEX_TEMPLATE_EXTENSION = ".tplx" | |||
#Special Jinja2 syntax that will not conflict when exporting latex. | |||
LATEX_JINJA_COMMENT_BLOCK = ["((=", "=))"] | |||
LATEX_JINJA_VARIABLE_BLOCK = ["(((", ")))"] | |||
LATEX_JINJA_LOGIC_BLOCK = ["((*", "*))"] | |||
#----------------------------------------------------------------------------- | |||
# Classes and functions | |||
#----------------------------------------------------------------------------- | |||
Jonathan Frederic
|
r10587 | class LatexExporter(exporter.Exporter): | |
""" A Jinja2 latex exporter | |||
Jonathan Frederic
|
r10479 | ||
Jonathan Frederic
|
r10587 | Preprocess the ipynb files, feed it through jinja templates, | |
Jonathan Frederic
|
r10479 | and spit an converted files and a data object with other data | |
should be mostly configurable | |||
""" | |||
Jonathan Frederic
|
r10587 | def __init__(self, preprocessors=None, jinja_filters=None, config=None, **kw): | |
Jonathan Frederic
|
r10588 | ||
#Call base class constructor. | |||
Jonathan Frederic
|
r10587 | super(exporter.Exporter, self).__init__(preprocessors, jinja_filters, config, **kw) | |
Jonathan Frederic
|
r10578 | ||
Jonathan Frederic
|
r10588 | #Set defaults | |
self.file_extension = "tex" | |||
self._set_datatype_priority(['latex', 'svg', 'png', 'jpg', 'jpeg' , 'text']) | |||
self.extract_figure_transformer.enabled = True | |||
self.extract_figure_transformer.extra_ext_map={'svg':'pdf'} | |||
self.template_file = "latex_base" | |||
Jonathan Frederic
|
r10578 | def _init_environment(self): | |
self.ext = LATEX_TEMPLATE_EXTENSION | |||
Jonathan Frederic
|
r10587 | self.environment = Environment( | |
Jonathan Frederic
|
r10578 | loader=FileSystemLoader([ | |
os.path.dirname(os.path.realpath(__file__)) + LATEX_TEMPLATE_PATH, | |||
os.path.dirname(os.path.realpath(__file__)) + LATEX_TEMPLATE_SKELETON_PATH, | |||
]), | |||
Jonathan Frederic
|
r10587 | extensions=exporter.JINJA_EXTENSIONS | |
Jonathan Frederic
|
r10578 | ) | |
#Set special Jinja2 syntax that will not conflict with latex. | |||
Jonathan Frederic
|
r10587 | self.environment.block_start_string = LATEX_JINJA_LOGIC_BLOCK[0] | |
self.environment.block_end_string = LATEX_JINJA_LOGIC_BLOCK[1] | |||
self.environment.variable_start_string = LATEX_JINJA_VARIABLE_BLOCK[0] | |||
self.environment.variable_end_string = LATEX_JINJA_VARIABLE_BLOCK[1] | |||
self.environment.comment_start_string = LATEX_JINJA_COMMENT_BLOCK[0] | |||
self.environment.comment_end_string = LATEX_JINJA_COMMENT_BLOCK[1] | |||
def _register_filters(self): | |||
#Register the filters of the base class. | |||
super(exporter.Exporter, self)._register_filters() | |||
#Add latex filters to the Jinja2 environment | |||
self.register_filter('escape_tex', filters.latex.escape_tex) | |||
self.register_filter('highlight', filters.pygments.highlight2latex) | |||
def _register_transformers(self): | |||
#Register the transformers of the base class. | |||
super(exporter.Exporter, self)._register_transformers() | |||
#Register latex transformer | |||
self.register_transformer(LatexTransformer) | |||