Merge pull request #2752 from tk0miya/jinja2ized_latex_template

Jinja2-ize latex writer
This commit is contained in:
Takeshi KOMIYA 2016-07-07 22:16:16 +09:00 committed by GitHub
commit 19abdb0198
3 changed files with 106 additions and 47 deletions

View File

@ -0,0 +1,42 @@
%% Generated by Sphinx.
\def\sphinxdocclass{<%= docclass %>}
\newif\ifsphinxKeepOldNames <%= keepoldnames %>
\documentclass[<%= papersize %>,<%= pointsize %><%= classoptions %>]{<%= wrapperclass %>}
\ifdefined\pdfpxdimen
\let\sphinxpxdimen\pdfpxdimen\else\newdimen\sphinxpxdimen
\fi \sphinxpxdimen=<%= pxunit %>\relax
\usepackage{iftex}
<%= passoptionstopackages %>
<%= inputenc %>
<%= utf8extra %>
<%= cmappkg %>
<%= fontenc %>
<%= amsmath %>
<%= babel %>
<%= fontpkg %>
<%= fncychap %>
<%= longtable %>
\usepackage{sphinx}
\usepackage{multirow}
\usepackage{eqparbox}
<%= usepackages %>
<%= contentsname %>
<%= numfig_format %>
<%= pageautorefname %>
<%= tocdepth %>
<%= secnumdepth %>
<%= preamble %>
\title{<%= title %>}
\date{<%= date %>}
\release{<%= release %>}
\author{<%= author %>}
\newcommand{\sphinxlogo}{<%= logo %>}
\renewcommand{\releasename}{<%= releasename %>}
<%= makeindex %>
<%= body %>
<%= footer %>
<%= indices %>
\renewcommand{\indexname}{<%= indexname %>}
<%= printindex %>
\end{document}

57
sphinx/util/template.py Normal file
View File

@ -0,0 +1,57 @@
# -*- coding: utf-8 -*-
"""
sphinx.util.template
~~~~~~~~~~~~~~~~~~~~
Templates utility functions for Sphinx.
:copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
import os
from jinja2.sandbox import SandboxedEnvironment
from sphinx import package_dir
from sphinx.jinja2glue import SphinxFileSystemLoader
class BaseRenderer(object):
def __init__(self, loader=None):
self.env = SandboxedEnvironment(loader=loader)
self.env.filters['repr'] = repr
def render(self, template_name, context):
return self.env.get_template(template_name).render(context)
def render_string(self, source, context):
return self.env.from_string(source).render(context)
class FileRenderer(BaseRenderer):
def __init__(self, search_path):
loader = SphinxFileSystemLoader(search_path)
super(FileRenderer, self).__init__(loader)
@classmethod
def render_from_file(cls, filename, context):
dirname = os.path.dirname(filename)
basename = os.path.basename(filename)
return cls(dirname).render(basename, context)
class SphinxRenderer(FileRenderer):
def __init__(self):
super(SphinxRenderer, self).__init__(os.path.join(package_dir, 'templates'))
class LaTeXRenderer(SphinxRenderer):
def __init__(self):
super(LaTeXRenderer, self).__init__()
# use JSP/eRuby like tagging instead because curly bracket; the default
# tagging of jinja2 is not good for LaTeX sources.
self.env.variable_start_string = '<%='
self.env.variable_end_string = '%>'
self.env.block_start_string = '<%'
self.env.block_end_string = '%>'

View File

@ -28,46 +28,10 @@ from sphinx.locale import admonitionlabels, _
from sphinx.util import split_into
from sphinx.util.i18n import format_date
from sphinx.util.nodes import clean_astext, traverse_parent
from sphinx.util.template import LaTeXRenderer
from sphinx.util.texescape import tex_escape_map, tex_replace_map
from sphinx.util.smartypants import educate_quotes_latex
HEADER = r'''%% Generated by Sphinx.
\def\sphinxdocclass{%(docclass)s}
\newif\ifsphinxKeepOldNames %(keepoldnames)s
\documentclass[%(papersize)s,%(pointsize)s%(classoptions)s]{%(wrapperclass)s}
\ifdefined\pdfpxdimen
\let\sphinxpxdimen\pdfpxdimen\else\newdimen\sphinxpxdimen
\fi \sphinxpxdimen=%(pxunit)s\relax
\usepackage{iftex}
%(passoptionstopackages)s
%(inputenc)s
%(utf8extra)s
%(cmappkg)s
%(fontenc)s
%(amsmath)s
%(babel)s
%(fontpkg)s
%(fncychap)s
%(longtable)s
\usepackage{sphinx}
\usepackage{multirow}
\usepackage{eqparbox}
%(usepackages)s
%(contentsname)s
%(numfig_format)s
%(pageautorefname)s
%(tocdepth)s
%(secnumdepth)s
%(preamble)s
\title{%(title)s}
\date{%(date)s}
\release{%(release)s}
\author{%(author)s}
\newcommand{\sphinxlogo}{%(logo)s}
\renewcommand{\releasename}{%(releasename)s}
%(makeindex)s
'''
BEGIN_DOC = r'''
\begin{document}
@ -76,12 +40,8 @@ BEGIN_DOC = r'''
%(tableofcontents)s
'''
FOOTER = r'''
\renewcommand{\indexname}{%(indexname)s}
%(printindex)s
\end{document}
'''
DEFAULT_TEMPLATE = 'latex/content.tex_t'
URI_SCHEMES = ('mailto:', 'http:', 'https:', 'ftp:')
SECNUMDEPTH = 3
@ -543,11 +503,11 @@ class LaTeXTranslator(nodes.NodeVisitor):
return docclass
def astext(self):
return (HEADER % self.elements +
u''.join(self.body) +
'\n' + self.elements['footer'] + '\n' +
self.generate_indices() +
FOOTER % self.elements)
self.elements.update({
'body': u''.join(self.body),
'indices': self.generate_indices()
})
return LaTeXRenderer().render(DEFAULT_TEMPLATE, self.elements)
def hypertarget(self, id, withdoc=True, anchor=True):
if withdoc: