Implement field lists, print warnings instead of raising RuntimeErrors.

This commit is contained in:
Georg Brandl 2007-12-16 22:10:43 +00:00
parent e4e6d92f0f
commit fe94305a20
3 changed files with 57 additions and 34 deletions

View File

@ -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

View File

@ -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

View File

@ -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{')