Merged in jonwaltman/sphinx-info (pull request #5)

This commit is contained in:
Georg Brandl 2011-07-07 19:50:11 +02:00
commit 96749c5749
2 changed files with 61 additions and 42 deletions

View File

@ -308,7 +308,8 @@ def render_dot_texinfo(self, node, code, options, prefix='graphviz'):
raise nodes.SkipNode
if fname is not None:
self.body.append('\n\n@float\n')
if node.get('caption'):
caption = node.get('caption')
if caption:
self.body.append('@caption{%s}\n' % self.escape_arg(caption))
self.body.append('@image{%s,,,[graphviz],png}\n'
'@end float\n\n' % fname[:-4])

View File

@ -10,8 +10,9 @@
"""
import re
from os import path
import string
import textwrap
from os import path
from docutils import nodes, writers
@ -319,6 +320,9 @@ class TexinfoTranslator(nodes.NodeVisitor):
s = s.replace('@', '@@')
s = s.replace('{', '@{')
s = s.replace('}', '@}')
# prevent `` and '' quote conversion
s = s.replace('``', "`@w{`}")
s = s.replace("''", "'@w{'}")
# prevent "--" from being converted to an "em dash"
# s = s.replace('-', '@w{-}')
return s
@ -348,6 +352,11 @@ class TexinfoTranslator(nodes.NodeVisitor):
s = ' '.join(s.split()).strip()
return s
def ensure_eol(self):
"""Ensure the last line in body is terminated by new line."""
if self.body and self.body[-1][-1:] != '\n':
self.body.append('\n')
def format_menu_entry(self, name, node_name, desc):
if name == node_name:
s = '* %s:: ' % (name,)
@ -703,7 +712,8 @@ class TexinfoTranslator(nodes.NodeVisitor):
def visit_block_quote(self, node):
self.body.append('\n@quotation\n')
def depart_block_quote(self, node):
self.body.append('\n@end quotation\n\n')
self.ensure_eol()
self.body.append('@end quotation\n')
def visit_literal_block(self, node):
self.body.append('\n@example\n')
@ -795,7 +805,8 @@ class TexinfoTranslator(nodes.NodeVisitor):
bullet = node.get('bullet', '*')
self.body.append('\n\n@itemize %s\n' % bullet)
def depart_bullet_list(self, node):
self.body.append('\n@end itemize\n\n')
self.ensure_eol()
self.body.append('@end itemize\n')
def visit_enumerated_list(self, node):
# doesn't support Roman numerals
@ -806,10 +817,11 @@ class TexinfoTranslator(nodes.NodeVisitor):
start = node.get('start', starters.get(enum, ''))
self.body.append('\n\n@enumerate %s\n' % start)
def depart_enumerated_list(self, node):
self.body.append('\n@end enumerate\n\n')
self.ensure_eol()
self.body.append('@end enumerate\n')
def visit_list_item(self, node):
self.body.append('\n@item\n')
self.body.append('\n@item ')
def depart_list_item(self, node):
pass
@ -818,7 +830,8 @@ class TexinfoTranslator(nodes.NodeVisitor):
def visit_option_list(self, node):
self.body.append('\n\n@table @option\n')
def depart_option_list(self, node):
self.body.append('\n@end table\n\n')
self.ensure_eol()
self.body.append('@end table\n')
def visit_option_list_item(self, node):
pass
@ -856,7 +869,8 @@ class TexinfoTranslator(nodes.NodeVisitor):
def visit_definition_list(self, node):
self.body.append('\n\n@table @asis\n')
def depart_definition_list(self, node):
self.body.append('\n@end table\n\n')
self.ensure_eol()
self.body.append('@end table\n')
def visit_definition_list_item(self, node):
self.at_item_x = '@item'
@ -946,7 +960,8 @@ class TexinfoTranslator(nodes.NodeVisitor):
def visit_field_list(self, node):
self.body.append('\n\n@itemize @w\n')
def depart_field_list(self, node):
self.body.append('\n@end itemize\n\n')
self.ensure_eol()
self.body.append('@end itemize\n')
def visit_field(self, node):
if not isinstance(node.parent, nodes.field_list):
@ -971,15 +986,15 @@ class TexinfoTranslator(nodes.NodeVisitor):
if not name:
name = self.escape(node[0].astext())
self.body.append('\n@cartouche\n'
'@quotation %s\n' % name)
'@quotation %s ' % name)
def depart_admonition(self, node):
self.body.append('\n@end quotation\n'
'@end cartouche\n\n')
self.ensure_eol()
self.body.append('@end quotation\n'
'@end cartouche\n')
def _make_visit_admonition(typ):
def visit(self, node):
self.body.append('\n@cartouche\n'
'@quotation %s\n' % self.escape(_(typ)))
self.visit_admonition(node, self.escape(_(typ)))
return visit
visit_attention = _make_visit_admonition('Attention')
@ -1083,7 +1098,7 @@ class TexinfoTranslator(nodes.NodeVisitor):
width = self.tex_image_length(attrs.get('width', ''))
height = self.tex_image_length(attrs.get('height', ''))
alt = self.escape_arg(attrs.get('alt', ''))
self.body.append('\n\n@image{%s,%s,%s,%s,%s}\n\n' %
self.body.append('\n@image{%s,%s,%s,%s,%s}\n' %
(name, width, height, alt, ext[1:]))
def depart_image(self, node):
pass
@ -1127,8 +1142,9 @@ class TexinfoTranslator(nodes.NodeVisitor):
pass
def visit_comment(self, node):
self.body.append('\n')
for line in node.astext().splitlines():
self.body.append('\n@c %s\n' % line)
self.body.append('@c %s\n' % line)
raise nodes.SkipNode
def visit_problematic(self, node):
@ -1178,6 +1194,11 @@ class TexinfoTranslator(nodes.NodeVisitor):
self.body.append('}')
def visit_index(self, node):
# terminate the line but don't prevent paragraph breaks
if isinstance(node.parent, nodes.paragraph):
self.ensure_eol()
else:
self.body.append('\n')
for entry in node['entries']:
typ, text, tid, text2 = entry
text = self.escape_menu(text)
@ -1186,7 +1207,7 @@ class TexinfoTranslator(nodes.NodeVisitor):
def visit_refcount(self, node):
self.body.append('\n')
def depart_refcount(self, node):
self.body.append('\n\n')
self.body.append('\n')
def visit_versionmodified(self, node):
intro = versionlabels[node['type']] % node['version']
@ -1194,9 +1215,9 @@ class TexinfoTranslator(nodes.NodeVisitor):
intro += ': '
else:
intro += '.'
self.body.append('\n\n%s' % self.escape(intro))
self.body.append('\n%s' % self.escape(intro))
def depart_versionmodified(self, node):
self.body.append('\n\n')
self.body.append('\n')
def visit_start_of_file(self, node):
# add a document target
@ -1239,33 +1260,27 @@ class TexinfoTranslator(nodes.NodeVisitor):
## Desc
desc_map = {
'cfunction': 'C Function',
'classmethod': 'Class Method',
'cmacro': 'C Macro',
'cmdoption': 'Command Option',
'cmember': 'C Member',
'confval': 'Configuration Value',
'ctype': 'C Type',
'cvar': 'C Variable',
'describe': 'Description',
'envvar': 'Environment Variable',
'staticmethod': 'Static Method',
'var': 'Variable',
}
def visit_desc(self, node):
self.at_deffnx = '@deffn'
def depart_desc(self, node):
self.body.append('\n@end deffn\n\n')
self.ensure_eol()
self.body.append('@end deffn\n')
def visit_desc_signature(self, node):
self.desctype = node.parent['desctype'].strip()
if self.desctype != 'describe':
objtype = node.parent['objtype']
if objtype != 'describe':
for id in node.get('ids'):
self.add_anchor(id, node)
typ = _(self.desc_map.get(self.desctype,
self.desctype.capitalize()))
self.body.append('\n%s {%s} ' % (self.at_deffnx, self.escape_arg(typ)))
# use the full name of the objtype for the category
try:
domain = self.builder.env.domains[node.parent['domain']]
primary = self.builder.config.primary_domain
name = domain.get_type_name(domain.object_types[objtype],
primary == domain.name)
except KeyError:
name = objtype
category = self.escape_arg(string.capwords(name))
self.body.append('\n%s {%s} ' % (self.at_deffnx, category))
self.at_deffnx = '@deffnx'
def depart_desc_signature(self, node):
self.body.append("\n")
@ -1301,7 +1316,10 @@ class TexinfoTranslator(nodes.NodeVisitor):
self.body.append(', ')
else:
self.first_param = 0
self.body.append(self.escape(node.astext()))
text = self.escape(node.astext())
# replace no-break spaces with normal ones
text = text.replace(u' ', '@w{ }')
self.body.append(text)
raise nodes.SkipNode
def visit_desc_optional(self, node):
@ -1313,7 +1331,7 @@ class TexinfoTranslator(nodes.NodeVisitor):
raise nodes.SkipNode
def visit_desc_content(self, node):
self.body.append("\n")
pass
def depart_desc_content(self, node):
pass