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, doc,
source_class=DocTreeInput, source_class=DocTreeInput,
reader=doctree.Reader(), reader=doctree.Reader(),
writer=HTMLWriter(self.config, self.name), writer=HTMLWriter(self),
settings_overrides={'output_encoding': 'unicode'} settings_overrides={'output_encoding': 'unicode'}
) )
@ -307,7 +307,7 @@ class StandaloneHTMLBuilder(Builder):
from .search import IndexBuilder from .search import IndexBuilder
self.indexer = IndexBuilder() self.indexer = IndexBuilder()
self.load_indexer(filenames) self.load_indexer(filenames)
self.docwriter = HTMLWriter(self.config, self.name) self.docwriter = HTMLWriter(self)
self.docsettings = OptionParser( self.docsettings = OptionParser(
defaults=self.env.settings, defaults=self.env.settings,
components=(self.docwriter,)).get_default_values() components=(self.docwriter,)).get_default_values()
@ -684,7 +684,7 @@ class LaTeXBuilder(Builder):
for fname in ["glossary", "about", "license", "copyright"]: for fname in ["glossary", "about", "license", "copyright"]:
specials.append(self.env.get_doctree(fname+".rst")) specials.append(self.env.get_doctree(fname+".rst"))
docwriter = LaTeXWriter(self.config, self.name) docwriter = LaTeXWriter(self)
docsettings = OptionParser( docsettings = OptionParser(
defaults=self.env.settings, defaults=self.env.settings,
components=(docwriter,)).get_default_values() components=(docwriter,)).get_default_values()
@ -728,7 +728,7 @@ class LaTeXBuilder(Builder):
largetree.extend(specials) largetree.extend(specials)
print print
print "resolving references..." 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) self.env.resolve_references(largetree, indexfile, self)
return largetree return largetree

View File

@ -16,9 +16,9 @@ from .util.smartypants import sphinx_smarty_pants
class HTMLWriter(Writer): class HTMLWriter(Writer):
def __init__(self, config, buildername): def __init__(self, builder):
Writer.__init__(self) Writer.__init__(self)
self.translator_class = translator_class(config, buildername) self.translator_class = translator_class(builder)
version_text = { version_text = {
@ -27,7 +27,7 @@ version_text = {
'versionadded': 'New in version %s', 'versionadded': 'New in version %s',
} }
def translator_class(config, buildername): def translator_class(builder):
class HTMLTranslator(BaseTranslator): class HTMLTranslator(BaseTranslator):
""" """
Our custom HTML translator. Our custom HTML translator.
@ -53,7 +53,7 @@ def translator_class(config, buildername):
if node.parent['desctype'] in ('class', 'exception'): if node.parent['desctype'] in ('class', 'exception'):
self.body.append('%s ' % node.parent['desctype']) self.body.append('%s ' % node.parent['desctype'])
def depart_desc_signature(self, node): 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] + self.body.append(u'<a class="headerlink" href="#%s" ' % node['ids'][0] +
u'title="Permalink to this definition">\u00B6</a>') u'title="Permalink to this definition">\u00B6</a>')
self.body.append('</dt>\n') self.body.append('</dt>\n')
@ -245,7 +245,7 @@ def translator_class(config, buildername):
def depart_title(self, node): def depart_title(self, node):
close_tag = self.context[-1] close_tag = self.context[-1]
if buildername != 'htmlhelp' and \ if builder.name != 'htmlhelp' and \
close_tag.startswith(('</h', '</a></h')) and \ close_tag.startswith(('</h', '</a></h')) and \
node.parent.hasattr('ids') and node.parent['ids']: node.parent.hasattr('ids') and node.parent['ids']:
aname = node.parent['ids'][0] aname = node.parent['ids'][0]
@ -302,7 +302,7 @@ def translator_class(config, buildername):
text = sphinx_smarty_pants(text) text = sphinx_smarty_pants(text)
return text return text
if config.get('html_use_smartypants', False): if builder.config.get('html_use_smartypants', False):
return SmartyPantsHTMLTranslator return SmartyPantsHTMLTranslator
else: else:
return HTMLTranslator return HTMLTranslator

View File

@ -30,7 +30,7 @@ HEADER = r'''%% Generated by Sphinx.
\date{%(date)s} \date{%(date)s}
\release{%(release)s} \release{%(release)s}
\author{Guido van Rossum\\ %% XXX \author{Guido van Rossum\\ %% XXX
Fred L. Drake, Jr., editor} %% XXX Fred L. Drake, Jr., editor}
\authoraddress{ \authoraddress{
\strong{Python Software Foundation}\\ \strong{Python Software Foundation}\\
Email: \email{docs@python.org} Email: \email{docs@python.org}
@ -55,13 +55,13 @@ class LaTeXWriter(writers.Writer):
output = None output = None
def __init__(self, config, buildername): def __init__(self, builder):
writers.Writer.__init__(self) writers.Writer.__init__(self)
self.config = config self.builder = builder
def translate(self): def translate(self):
try: try:
visitor = LaTeXTranslator(self.document, self.config) visitor = LaTeXTranslator(self.document, self.builder)
self.document.walkabout(visitor) self.document.walkabout(visitor)
self.output = visitor.astext() self.output = visitor.astext()
except: except:
@ -90,20 +90,22 @@ class LaTeXTranslator(nodes.NodeVisitor):
sectionnames = ["chapter", "chapter", "section", "subsection", sectionnames = ["chapter", "chapter", "section", "subsection",
"subsubsection", "paragraph", "subparagraph"] "subsubsection", "paragraph", "subparagraph"]
def __init__(self, document, config): def __init__(self, document, builder):
nodes.NodeVisitor.__init__(self, document) nodes.NodeVisitor.__init__(self, document)
self.builder = builder
self.body = [] self.body = []
docclass = document.settings.docclass 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=" if paper == 'paper': # e.g. command line "-D latex_paper_size="
paper = 'letterpaper' paper = 'letterpaper'
date = time.strftime(builder.config.get('today_fmt', '%B %d, %Y'))
self.options = {'docclass': docclass, self.options = {'docclass': docclass,
'papersize': paper, 'papersize': paper,
'pointsize': config.get('latex_font_size', '10pt'), 'pointsize': builder.config.get('latex_font_size', '10pt'),
'filename': document.settings.filename, 'filename': document.settings.filename,
'title': None, # is determined later 'title': None, # is determined later
'release': config['release'], 'release': builder.config['release'],
'date': time.strftime(config.get('today_fmt', '%B %d, %Y')), 'date': date,
} }
self.context = [] self.context = []
self.descstack = [] self.descstack = []
@ -198,8 +200,9 @@ class LaTeXTranslator(nodes.NodeVisitor):
raise nodes.SkipNode raise nodes.SkipNode
elif self.this_is_the_title: elif self.this_is_the_title:
if len(node.children) != 1 and not isinstance(node.children[0], Text): if len(node.children) != 1 and not isinstance(node.children[0], Text):
raise RuntimeError("title is not a Text node") print >>self.builder.warning_stream, 'WARNING: document title ' \
self.options['title'] = node.children[0].astext() 'is not a single Text node'
self.options['title'] = node.astext()
self.this_is_the_title = 0 self.this_is_the_title = 0
raise nodes.SkipNode raise nodes.SkipNode
elif isinstance(node.parent, nodes.section): elif isinstance(node.parent, nodes.section):
@ -209,22 +212,20 @@ class LaTeXTranslator(nodes.NodeVisitor):
self.body.append(r'\textbf{') self.body.append(r'\textbf{')
self.context.append('}\n\n\medskip\n\n') self.context.append('}\n\n\medskip\n\n')
else: 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 self.in_title = 1
def depart_title(self, node): def depart_title(self, node):
self.in_title = 0 self.in_title = 0
self.body.append(self.context.pop()) self.body.append(self.context.pop())
def visit_field_list(self, node):
raise nodes.SkipNode # XXX
desc_map = { desc_map = {
'function' : 'funcdesc', 'function' : 'funcdesc',
'class': 'classdesc', 'class': 'classdesc',
#'classdesc*': ('class', '0'), XXX
'method': 'methoddesc', 'method': 'methoddesc',
'exception': 'excdesc', 'exception': 'excdesc',
#'excclassdesc': ('exception', '0(1)'), XXX
'data': 'datadesc', 'data': 'datadesc',
'attribute': 'memberdesc', 'attribute': 'memberdesc',
'opcode': 'opcodedesc', 'opcode': 'opcodedesc',
@ -236,7 +237,7 @@ class LaTeXTranslator(nodes.NodeVisitor):
'cvar': 'cvardesc', 'cvar': 'cvardesc',
'describe': 'describe', 'describe': 'describe',
'cmdoption': 'describe', # XXX? 'cmdoption': 'describe',
'envvar': 'describe', 'envvar': 'describe',
} }
@ -322,7 +323,8 @@ class LaTeXTranslator(nodes.NodeVisitor):
def visit_rubric(self, node): def visit_rubric(self, node):
if len(node.children) == 1 and node.children[0].astext() == 'Footnotes': if len(node.children) == 1 and node.children[0].astext() == 'Footnotes':
raise nodes.SkipNode 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): def visit_footnote(self, node):
# XXX not optimal, footnotes are at section end # XXX not optimal, footnotes are at section end
@ -356,7 +358,9 @@ class LaTeXTranslator(nodes.NodeVisitor):
elif columnCount == 5: elif columnCount == 5:
self.body.append('\\begin{tablev}{l|l|l|l|l}{textrm}') self.body.append('\\begin{tablev}{l|l|l|l|l}{textrm}')
else: 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): def depart_tgroup(self, node):
if self.tableSpec.columnCount == 2: if self.tableSpec.columnCount == 2:
self.body.append('\n\\end{tableii}\n\n') self.body.append('\n\\end{tableii}\n\n')
@ -457,6 +461,22 @@ class LaTeXTranslator(nodes.NodeVisitor):
def depart_definition(self, node): def depart_definition(self, node):
self.body.append('\n') 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): def visit_paragraph(self, node):
self.body.append('\n') self.body.append('\n')
def depart_paragraph(self, node): def depart_paragraph(self, node):
@ -554,7 +574,8 @@ class LaTeXTranslator(nodes.NodeVisitor):
self.body.append(r'\%s{%s}' % (self.indextype_map[type], self.body.append(r'\%s{%s}' % (self.indextype_map[type],
self.encode(string))) self.encode(string)))
else: else:
raise RuntimeError('XXX unknown index entry type') print >>self.builder.warning_stream, 'WARNING: unknown index entry ' \
'type %s found' % type
raise nodes.SkipNode raise nodes.SkipNode
def visit_reference(self, node): def visit_reference(self, node):
@ -574,7 +595,9 @@ class LaTeXTranslator(nodes.NodeVisitor):
self.body.append('\\grammartoken{') self.body.append('\\grammartoken{')
self.context.append('}') self.context.append('}')
else: 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): def depart_reference(self, node):
self.body.append(self.context.pop()) self.body.append(self.context.pop())
@ -589,9 +612,9 @@ class LaTeXTranslator(nodes.NodeVisitor):
self.body.append('}') self.body.append('}')
def visit_literal_emphasis(self, node): def visit_literal_emphasis(self, node):
self.body.append(r'\emph{') # XXX self.body.append(r'\emph{\texttt{')
def depart_literal_emphasis(self, node): def depart_literal_emphasis(self, node):
self.body.append('}') self.body.append('}}')
def visit_strong(self, node): def visit_strong(self, node):
self.body.append(r'\textbf{') self.body.append(r'\textbf{')