Merge branch 'master' into def-lists
[rst2info.git] / texinfo / info_translator.py
blob31c176129a6849fe05562315648cecbacb6cecf0
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 pass
70 def depart_paragraph(self, node):
71 if self.system_message_level == 0:
72 self.body.append('')
74 def visit_bullet_list(self, node):
75 self.body.append('@itemize @bullet')
77 def depart_bullet_list(self, node):
78 self.body.append('@end @itemize')
79 self.body.append('')
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')
94 self.body.append('')
96 def visit_list_item(self, node):
97 self.body.append('@item')
99 def depart_list_item(self, node):
100 pass
102 def visit_literal(self, node):
103 raise nodes.SkipNode
105 def visit_literal_block(self, node):
106 self.body.append(node.astext())
107 raise nodes.SkipNode
109 def visit_block_quote(self, node):
110 self.body.append('@quotation')
112 def depart_block_quote(self, node):
113 self.body.append('@end quotation')
114 self.body.append('')
116 def visit_system_message(self, node):
117 # from rst2man
118 if node['level'] < self.settings.report_level:
119 raise nodes.SkipNode
120 attr = {}
121 backref_text = ''
122 if node.hasattr('id'):
123 attr['name'] = node['id']
124 if node.hasattr('line'):
125 line = ', line %s' % node['line']
126 else:
127 line = ''
128 self.body.append('@c System Message: %s/%s (%s:%s)'
129 % (node['type'], node['level'], node['source'], line))
130 self.system_message_level += 1
132 def depart_system_message(self, node):
133 self.system_message_level -= 1
134 self.body.append('@c --end system message--')
136 def visit_definition_list(self, node):
137 pass
139 def depart_definition_list(self, node):
140 pass
142 def visit_definition_list_item(self, node):
143 pass
145 def depart_definition_list_item(self, node):
146 pass
148 def visit_term(self, node):
149 pass
151 def depart_term(self, node):
152 pass
154 def visit_definition(self, node):
155 self.body.append('@quotation')
157 def depart_definition(self, node):
158 self.body.append('@end quotation')
159 self.body.append('')
161 def visit_Text(self, node):
162 if self.system_message_level > 0:
163 self.body.append('@c %s' % node.astext())
164 else:
165 self.body.append(node.astext())
167 def depart_Text(self, node):
168 pass