Docutils status messages are output as Texinfo comments,
[rst2info.git] / texinfo / info_translator.py
blob0377b0b52efc23580feafea018f0143b3dc3c025
1 from docutils import nodes
2 import exceptions
4 class InfoTranslator(nodes.NodeVisitor):
6 document_start = """\\input texinfo @c -*-texinfo-*-
7 """
9 def __init__(self, document):
10 nodes.NodeVisitor.__init__(self, document)
11 self.settings = document.settings
12 self.header = []
13 self.body = []
14 self.section_level = 0
15 self.system_message_level = 0
16 self.docinfo = {}
18 def astext(self):
19 return '\n'.join(self.header + self.body + [''])
21 def visit_document(self, node):
22 self.header.append(self.document_start)
24 def depart_document(self, node):
25 pass
27 def visit_comment(self, node):
28 self.body.append('@c %s' % node.astext())
29 raise nodes.SkipNode
31 def visit_section(self, node):
32 self.section_level += 1
33 #self.body.append('@c +s %d' % self.section_level)
35 def depart_section(self, node):
36 self.section_level -= 1
37 #self.body.append('@c -s %d' % self.section_level)
39 def emit_title(self, text):
40 self.body.append('@node Top')
41 self.body.append('@top %s' % text)
43 def emit_chapter(self, text):
44 self.body.append('@chapter %s' % text)
46 def emit_section(self, text):
47 self.body.append('@section %s' % text)
49 def emit_subsection(self, text):
50 self.body.append('@subsection %s' % text)
52 def visit_title(self, node):
53 title_functions = [self.emit_title, self.emit_chapter, self.emit_section, self.emit_subsection]
54 try:
55 f = title_functions[self.section_level]
56 except exceptions.IndexError:
57 f = self.emit_subsection
58 #self.body.append('@c section_level %d' % self.section_level)
59 f(node.astext())
60 raise nodes.SkipNode
62 def visit_subtitle(self, node):
63 self.body.append('@majorheading %s' % node.astext())
64 raise nodes.SkipNode
66 def visit_paragraph(self, node):
67 if self.system_message_level > 0:
68 self.body.append('@c %s' % node.astext())
69 else:
70 self.body.append(node.astext())
71 self.body.append('')
72 raise nodes.SkipNode
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')
80 def visit_enumerated_list(self, node):
81 self.body.append('@enumerate')
83 def depart_enumerated_list(self, node):
84 self.body.append('@end enumerate')
86 def visit_list_item(self, node):
87 self.body.append('@item')
89 def depart_list_item(self, node):
90 pass
92 def visit_literal(self, node):
93 raise nodes.SkipNode
95 def visit_literal_block(self, node):
96 self.body.append(node.astext())
97 raise nodes.SkipNode
99 def visit_block_quote(self, node):
100 self.body.append('@quotation')
102 def depart_block_quote(self, node):
103 self.body.append('@end quotation')
105 def visit_system_message(self, node):
106 # from rst2man
107 print "node['level']=%s, self.settings.report_level=%s" % (node['level'], self.settings.report_level)
108 if node['level'] < self.settings.report_level: #self.document.reporter['writer'].report_level:
109 # Level is too low to display:
110 raise nodes.SkipNode
111 attr = {}
112 backref_text = ''
113 if node.hasattr('id'):
114 attr['name'] = node['id']
115 if node.hasattr('line'):
116 line = ', line %s' % node['line']
117 else:
118 line = ''
119 self.body.append('@c System Message: %s/%s (%s:%s)'
120 % (node['type'], node['level'], node['source'], line))
121 self.system_message_level += 1
123 def depart_system_message(self, node):
124 self.system_message_level -= 1
125 self.body.append('@c --end system message--')