Enumerated lists can use letters (upper or lower case),
[rst2info.git] / texinfo / info_translator.py
blob925a2f67b4618e865409297582122b3125b7bfaf
1 from docutils import nodes
2 import exceptions
3 import string
5 class InfoTranslator(nodes.NodeVisitor):
7 document_start = """\\input texinfo @c -*-texinfo-*-
8 """
10 def __init__(self, document):
11 nodes.NodeVisitor.__init__(self, document)
12 self.settings = document.settings
13 self.header = []
14 self.body = []
15 self.section_level = 0
16 self.system_message_level = 0
17 self.docinfo = {}
19 def astext(self):
20 return '\n'.join(self.header + self.body + [''])
22 def visit_document(self, node):
23 self.header.append(self.document_start)
25 def depart_document(self, node):
26 pass
28 def visit_comment(self, node):
29 self.body.append('@c %s' % node.astext())
30 raise nodes.SkipNode
32 def visit_section(self, node):
33 self.section_level += 1
34 #self.body.append('@c +s %d' % self.section_level)
36 def depart_section(self, node):
37 self.section_level -= 1
38 #self.body.append('@c -s %d' % self.section_level)
40 def emit_title(self, text):
41 self.body.append('@node Top')
42 self.body.append('@top %s' % text)
44 def emit_chapter(self, text):
45 self.body.append('@chapter %s' % text)
47 def emit_section(self, text):
48 self.body.append('@section %s' % text)
50 def emit_subsection(self, text):
51 self.body.append('@subsection %s' % text)
53 def visit_title(self, node):
54 title_functions = [self.emit_title, self.emit_chapter, self.emit_section, self.emit_subsection]
55 try:
56 f = title_functions[self.section_level]
57 except exceptions.IndexError:
58 f = self.emit_subsection
59 #self.body.append('@c section_level %d' % self.section_level)
60 f(node.astext())
61 raise nodes.SkipNode
63 def visit_subtitle(self, node):
64 self.body.append('@majorheading %s' % node.astext())
65 raise nodes.SkipNode
67 def visit_paragraph(self, node):
68 if self.system_message_level > 0:
69 self.body.append('@c %s' % node.astext())
70 else:
71 self.body.append(node.astext())
72 self.body.append('')
73 raise nodes.SkipNode
75 def visit_bullet_list(self, node):
76 self.body.append('@itemize @bullet')
78 def depart_bullet_list(self, node):
79 self.body.append('@end @itemize')
81 def visit_enumerated_list(self, node):
82 start = 1
83 if node.has_key('start'):
84 start = node['start']
85 if node.has_key('enumtype'):
86 if node['enumtype'] == 'upperalpha':
87 start =string.ascii_uppercase[start-1]
88 if node['enumtype'] == 'loweralpha':
89 start =string.ascii_lowercase[start-1]
90 self.body.append('@enumerate %s' % start)
92 def depart_enumerated_list(self, node):
93 self.body.append('@end enumerate')
95 def visit_list_item(self, node):
96 self.body.append('@item')
98 def depart_list_item(self, node):
99 pass
101 def visit_literal(self, node):
102 raise nodes.SkipNode
104 def visit_literal_block(self, node):
105 self.body.append(node.astext())
106 raise nodes.SkipNode
108 def visit_block_quote(self, node):
109 self.body.append('@quotation')
111 def depart_block_quote(self, node):
112 self.body.append('@end quotation')
114 def visit_system_message(self, node):
115 # from rst2man
116 if node['level'] < self.settings.report_level:
117 raise nodes.SkipNode
118 attr = {}
119 backref_text = ''
120 if node.hasattr('id'):
121 attr['name'] = node['id']
122 if node.hasattr('line'):
123 line = ', line %s' % node['line']
124 else:
125 line = ''
126 self.body.append('@c System Message: %s/%s (%s:%s)'
127 % (node['type'], node['level'], node['source'], line))
128 self.system_message_level += 1
130 def depart_system_message(self, node):
131 self.system_message_level -= 1
132 self.body.append('@c --end system message--')