mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Implement field lists, print warnings instead of raising RuntimeErrors.
This commit is contained in:
parent
e4e6d92f0f
commit
fe94305a20
@ -299,7 +299,7 @@ class StandaloneHTMLBuilder(Builder):
|
||||
doc,
|
||||
source_class=DocTreeInput,
|
||||
reader=doctree.Reader(),
|
||||
writer=HTMLWriter(self.config, self.name),
|
||||
writer=HTMLWriter(self),
|
||||
settings_overrides={'output_encoding': 'unicode'}
|
||||
)
|
||||
|
||||
@ -307,7 +307,7 @@ class StandaloneHTMLBuilder(Builder):
|
||||
from .search import IndexBuilder
|
||||
self.indexer = IndexBuilder()
|
||||
self.load_indexer(filenames)
|
||||
self.docwriter = HTMLWriter(self.config, self.name)
|
||||
self.docwriter = HTMLWriter(self)
|
||||
self.docsettings = OptionParser(
|
||||
defaults=self.env.settings,
|
||||
components=(self.docwriter,)).get_default_values()
|
||||
@ -684,7 +684,7 @@ class LaTeXBuilder(Builder):
|
||||
for fname in ["glossary", "about", "license", "copyright"]:
|
||||
specials.append(self.env.get_doctree(fname+".rst"))
|
||||
|
||||
docwriter = LaTeXWriter(self.config, self.name)
|
||||
docwriter = LaTeXWriter(self)
|
||||
docsettings = OptionParser(
|
||||
defaults=self.env.settings,
|
||||
components=(docwriter,)).get_default_values()
|
||||
@ -728,7 +728,7 @@ class LaTeXBuilder(Builder):
|
||||
largetree.extend(specials)
|
||||
print
|
||||
print "resolving references..."
|
||||
# XXX problem here: :ref:s to distant PDF
|
||||
# XXX problem here: :ref:s to distant tex files
|
||||
self.env.resolve_references(largetree, indexfile, self)
|
||||
return largetree
|
||||
|
||||
|
@ -16,9 +16,9 @@ from .util.smartypants import sphinx_smarty_pants
|
||||
|
||||
|
||||
class HTMLWriter(Writer):
|
||||
def __init__(self, config, buildername):
|
||||
def __init__(self, builder):
|
||||
Writer.__init__(self)
|
||||
self.translator_class = translator_class(config, buildername)
|
||||
self.translator_class = translator_class(builder)
|
||||
|
||||
|
||||
version_text = {
|
||||
@ -27,7 +27,7 @@ version_text = {
|
||||
'versionadded': 'New in version %s',
|
||||
}
|
||||
|
||||
def translator_class(config, buildername):
|
||||
def translator_class(builder):
|
||||
class HTMLTranslator(BaseTranslator):
|
||||
"""
|
||||
Our custom HTML translator.
|
||||
@ -53,7 +53,7 @@ def translator_class(config, buildername):
|
||||
if node.parent['desctype'] in ('class', 'exception'):
|
||||
self.body.append('%s ' % node.parent['desctype'])
|
||||
def depart_desc_signature(self, node):
|
||||
if node['ids'] and buildername != 'htmlhelp':
|
||||
if node['ids'] and builder.name != 'htmlhelp':
|
||||
self.body.append(u'<a class="headerlink" href="#%s" ' % node['ids'][0] +
|
||||
u'title="Permalink to this definition">\u00B6</a>')
|
||||
self.body.append('</dt>\n')
|
||||
@ -245,7 +245,7 @@ def translator_class(config, buildername):
|
||||
|
||||
def depart_title(self, node):
|
||||
close_tag = self.context[-1]
|
||||
if buildername != 'htmlhelp' and \
|
||||
if builder.name != 'htmlhelp' and \
|
||||
close_tag.startswith(('</h', '</a></h')) and \
|
||||
node.parent.hasattr('ids') and node.parent['ids']:
|
||||
aname = node.parent['ids'][0]
|
||||
@ -302,7 +302,7 @@ def translator_class(config, buildername):
|
||||
text = sphinx_smarty_pants(text)
|
||||
return text
|
||||
|
||||
if config.get('html_use_smartypants', False):
|
||||
if builder.config.get('html_use_smartypants', False):
|
||||
return SmartyPantsHTMLTranslator
|
||||
else:
|
||||
return HTMLTranslator
|
||||
|
@ -30,7 +30,7 @@ HEADER = r'''%% Generated by Sphinx.
|
||||
\date{%(date)s}
|
||||
\release{%(release)s}
|
||||
\author{Guido van Rossum\\ %% XXX
|
||||
Fred L. Drake, Jr., editor} %% XXX
|
||||
Fred L. Drake, Jr., editor}
|
||||
\authoraddress{
|
||||
\strong{Python Software Foundation}\\
|
||||
Email: \email{docs@python.org}
|
||||
@ -55,13 +55,13 @@ class LaTeXWriter(writers.Writer):
|
||||
|
||||
output = None
|
||||
|
||||
def __init__(self, config, buildername):
|
||||
def __init__(self, builder):
|
||||
writers.Writer.__init__(self)
|
||||
self.config = config
|
||||
self.builder = builder
|
||||
|
||||
def translate(self):
|
||||
try:
|
||||
visitor = LaTeXTranslator(self.document, self.config)
|
||||
visitor = LaTeXTranslator(self.document, self.builder)
|
||||
self.document.walkabout(visitor)
|
||||
self.output = visitor.astext()
|
||||
except:
|
||||
@ -90,20 +90,22 @@ class LaTeXTranslator(nodes.NodeVisitor):
|
||||
sectionnames = ["chapter", "chapter", "section", "subsection",
|
||||
"subsubsection", "paragraph", "subparagraph"]
|
||||
|
||||
def __init__(self, document, config):
|
||||
def __init__(self, document, builder):
|
||||
nodes.NodeVisitor.__init__(self, document)
|
||||
self.builder = builder
|
||||
self.body = []
|
||||
docclass = document.settings.docclass
|
||||
paper = config.get('latex_paper_size', 'letter') + 'paper'
|
||||
paper = builder.config.get('latex_paper_size', 'letter') + 'paper'
|
||||
if paper == 'paper': # e.g. command line "-D latex_paper_size="
|
||||
paper = 'letterpaper'
|
||||
date = time.strftime(builder.config.get('today_fmt', '%B %d, %Y'))
|
||||
self.options = {'docclass': docclass,
|
||||
'papersize': paper,
|
||||
'pointsize': config.get('latex_font_size', '10pt'),
|
||||
'pointsize': builder.config.get('latex_font_size', '10pt'),
|
||||
'filename': document.settings.filename,
|
||||
'title': None, # is determined later
|
||||
'release': config['release'],
|
||||
'date': time.strftime(config.get('today_fmt', '%B %d, %Y')),
|
||||
'release': builder.config['release'],
|
||||
'date': date,
|
||||
}
|
||||
self.context = []
|
||||
self.descstack = []
|
||||
@ -198,8 +200,9 @@ class LaTeXTranslator(nodes.NodeVisitor):
|
||||
raise nodes.SkipNode
|
||||
elif self.this_is_the_title:
|
||||
if len(node.children) != 1 and not isinstance(node.children[0], Text):
|
||||
raise RuntimeError("title is not a Text node")
|
||||
self.options['title'] = node.children[0].astext()
|
||||
print >>self.builder.warning_stream, 'WARNING: document title ' \
|
||||
'is not a single Text node'
|
||||
self.options['title'] = node.astext()
|
||||
self.this_is_the_title = 0
|
||||
raise nodes.SkipNode
|
||||
elif isinstance(node.parent, nodes.section):
|
||||
@ -209,22 +212,20 @@ class LaTeXTranslator(nodes.NodeVisitor):
|
||||
self.body.append(r'\textbf{')
|
||||
self.context.append('}\n\n\medskip\n\n')
|
||||
else:
|
||||
raise RuntimeError("XXX title without section")
|
||||
print >>self.builder.warning_stream, 'WARNING: encountered title node ' \
|
||||
'not in section, topic or sidebar'
|
||||
self.body.append('\\textbf{')
|
||||
self.context.append('}')
|
||||
self.in_title = 1
|
||||
def depart_title(self, node):
|
||||
self.in_title = 0
|
||||
self.body.append(self.context.pop())
|
||||
|
||||
def visit_field_list(self, node):
|
||||
raise nodes.SkipNode # XXX
|
||||
|
||||
desc_map = {
|
||||
'function' : 'funcdesc',
|
||||
'class': 'classdesc',
|
||||
#'classdesc*': ('class', '0'), XXX
|
||||
'method': 'methoddesc',
|
||||
'exception': 'excdesc',
|
||||
#'excclassdesc': ('exception', '0(1)'), XXX
|
||||
'data': 'datadesc',
|
||||
'attribute': 'memberdesc',
|
||||
'opcode': 'opcodedesc',
|
||||
@ -236,7 +237,7 @@ class LaTeXTranslator(nodes.NodeVisitor):
|
||||
'cvar': 'cvardesc',
|
||||
|
||||
'describe': 'describe',
|
||||
'cmdoption': 'describe', # XXX?
|
||||
'cmdoption': 'describe',
|
||||
'envvar': 'describe',
|
||||
}
|
||||
|
||||
@ -322,7 +323,8 @@ class LaTeXTranslator(nodes.NodeVisitor):
|
||||
def visit_rubric(self, node):
|
||||
if len(node.children) == 1 and node.children[0].astext() == 'Footnotes':
|
||||
raise nodes.SkipNode
|
||||
raise RuntimeError("rubric not supported except for footnotes heading")
|
||||
print >>self.builder.warning_stream, 'WARNING: encountered rubric node' \
|
||||
'not used for footnotes, content will be lost'
|
||||
|
||||
def visit_footnote(self, node):
|
||||
# XXX not optimal, footnotes are at section end
|
||||
@ -356,7 +358,9 @@ class LaTeXTranslator(nodes.NodeVisitor):
|
||||
elif columnCount == 5:
|
||||
self.body.append('\\begin{tablev}{l|l|l|l|l}{textrm}')
|
||||
else:
|
||||
raise RuntimeError("XXX table with too many columns found")
|
||||
print >>self.builder.warning_stream, 'WARNING: table with too ' \
|
||||
'many columns, ignoring'
|
||||
raise nodes.SkipNode
|
||||
def depart_tgroup(self, node):
|
||||
if self.tableSpec.columnCount == 2:
|
||||
self.body.append('\n\\end{tableii}\n\n')
|
||||
@ -457,6 +461,22 @@ class LaTeXTranslator(nodes.NodeVisitor):
|
||||
def depart_definition(self, node):
|
||||
self.body.append('\n')
|
||||
|
||||
def visit_field_list(self, node):
|
||||
self.body.append('\\begin{quote}\\begin{description}\n')
|
||||
def depart_field_list(self, node):
|
||||
self.body.append('\\end{description}\\end{quote}\n')
|
||||
|
||||
def visit_field(self, node):
|
||||
pass
|
||||
def depart_field(self, node):
|
||||
pass
|
||||
|
||||
visit_field_name = visit_term
|
||||
depart_field_name = depart_term
|
||||
|
||||
visit_field_body = visit_definition
|
||||
depart_field_body = depart_definition
|
||||
|
||||
def visit_paragraph(self, node):
|
||||
self.body.append('\n')
|
||||
def depart_paragraph(self, node):
|
||||
@ -554,7 +574,8 @@ class LaTeXTranslator(nodes.NodeVisitor):
|
||||
self.body.append(r'\%s{%s}' % (self.indextype_map[type],
|
||||
self.encode(string)))
|
||||
else:
|
||||
raise RuntimeError('XXX unknown index entry type')
|
||||
print >>self.builder.warning_stream, 'WARNING: unknown index entry ' \
|
||||
'type %s found' % type
|
||||
raise nodes.SkipNode
|
||||
|
||||
def visit_reference(self, node):
|
||||
@ -574,7 +595,9 @@ class LaTeXTranslator(nodes.NodeVisitor):
|
||||
self.body.append('\\grammartoken{')
|
||||
self.context.append('}')
|
||||
else:
|
||||
raise RuntimeError('XXX malformed reference target %s' % uri)
|
||||
print self.builder.warning_stream, 'WARNING: malformed reference ' \
|
||||
'target found: %s' % uri
|
||||
self.context.append('')
|
||||
def depart_reference(self, node):
|
||||
self.body.append(self.context.pop())
|
||||
|
||||
@ -589,9 +612,9 @@ class LaTeXTranslator(nodes.NodeVisitor):
|
||||
self.body.append('}')
|
||||
|
||||
def visit_literal_emphasis(self, node):
|
||||
self.body.append(r'\emph{') # XXX
|
||||
self.body.append(r'\emph{\texttt{')
|
||||
def depart_literal_emphasis(self, node):
|
||||
self.body.append('}')
|
||||
self.body.append('}}')
|
||||
|
||||
def visit_strong(self, node):
|
||||
self.body.append(r'\textbf{')
|
||||
|
Loading…
Reference in New Issue
Block a user