Add <target> to one more testcase (see r8206).
[docutils.git] / sandbox / html4trans / html4trans.py
blob2061b603d9f2fb1b1f445d567edaaaa7149f3a4a
1 # Author: Guenter Milde
2 # Contact: milde@users.berlios.de
3 # Revision: $Revision$
4 # Date: $Date: 2005-06-28$
5 # Copyright: Licensed under the Academic Free License version 1.2
7 """
8 Simple HyperText Markup Language document tree Writer.
10 Work in progress. The goal is:
12 The output conforms to the XHTML version 1.0 Transitional DTD and contains
13 enough formatting information to be viewed without a cascading style sheet by
14 a lightweight html browser (e.g. Dillo__ or the console browser elinks__).
16 __ http://www.dillo.org
17 __ http://elinks.cz
19 """
21 __docformat__ = 'reStructuredText'
24 import docutils
25 from docutils import frontend, nodes, utils, writers, languages
27 from docutils.writers import html4css1
28 # from html4css1 import SimpleListChecker
30 class Writer(html4css1.Writer):
32 supported = ('html', 'xhtml', 'html4', 'xhtml4',
33 'html4trans', 'xhtml1trans')
34 """Formats this writer supports."""
36 config_section = 'html4trans writer'
38 def __init__(self):
39 writers.Writer.__init__(self)
40 self.translator_class = HTMLTranslator
43 class HTMLTranslator(html4css1.HTMLTranslator):
45 """
46 This HTML writer has been customized to produce HTML with direct
47 formatting of objects to be usable without CSS stylesheet
48 """
50 _title_color = '' # ('red' in Warnings, etc)
52 def visit_admonition(self, node, name='', title_color=''):
53 self.body.append(self.starttag(node, 'blockquote', '',
54 CLASS=(name or 'admonition')))
55 self.body.append(self.starttag(node, 'table', '',
56 border=1, width='100%'))
57 self.body.append('<tr><td>\n')
58 self._title_color = title_color
59 if name:
60 node.insert(0, nodes.title(name, self.language.labels[name]))
61 # self.set_first_last(node)
63 def depart_admonition(self, node=None):
64 self._title_color=''
65 self.body.append('</td></tr>\n'
66 '</table></blockquote>\n')
68 def visit_attention(self, node):
69 self.visit_admonition(node, 'attention', 'red')
71 def visit_caution(self, node):
72 self.visit_admonition(node, 'caution', 'red')
74 def visit_citation(self, node):
75 self.visit_footnote(node, CLASS='docutils citation'),
77 def visit_danger(self, node):
78 self.visit_admonition(node, 'danger', 'red')
80 def visit_doctest_block(self, node):
81 self.visit_literal_block(node, CLASS='doctest-block')
83 def depart_doctest_block(self, node):
84 self.depart_literal_block(node)
86 # def visit_enumerated_list(self, node):
87 # """TODO: look in the sandbox/bbum/DocArticle/DocArticle/ for emulation
88 # of arabic, roman and alpha list markers """
90 def visit_error(self, node):
91 self.visit_admonition(node, 'error', 'red')
93 def visit_field(self, node):
94 """top-align field list elements"""
95 self.body.append(self.starttag(node, 'tr', '', CLASS='field',
96 valign='top'))
98 def visit_field_name(self, node):
99 """left align field name"""
100 atts = {}
101 if self.in_docinfo:
102 atts['class'] = 'docinfo-name'
103 else:
104 atts['class'] = 'field-name'
105 if ( self.settings.field_name_limit
106 and len(node.astext()) > self.settings.field_name_limit):
107 atts['colspan'] = 2
108 self.context.append('</tr>\n<tr><td>&nbsp;</td>')
109 else:
110 self.context.append('')
111 self.body.append(self.starttag(node, 'th', '', align='left', **atts))
113 def visit_footnote(self, node, CLASS='docutils footnote'):
114 self.body.append(self.starttag(node, 'table', CLASS=CLASS,
115 frame="void", rules="none"))
116 self.body.append('<colgroup><col class="label" /><col /></colgroup>\n'
117 '<tbody>\n'
118 '<tr valign="top">')
119 self.footnote_backrefs(node)
121 def visit_line_block(self, node):
123 TODO:
124 Einrueckungen selbst formatieren, entweder durch geschachtelte Tabellen
125 oder indem Sie Zeilenumbrueche durch <nobr> ... </nobr> ("No Break")
126 verhindern und die Einrueckungen durch Aneinandersetzen mehrerer
127 geschuetzter Leerzeichen ";nbsp" realisieren.
129 self.body.append(self.starttag(node, 'div', CLASS='line-block'))
131 # def depart_line_block(self, node):
132 # self.body.append('</div>\n')
134 def visit_literal_block(self, node, CLASS='literal-block'):
135 self.body.append(self.starttag(node, 'blockquote', ''))
136 self.body.append(self.starttag(node, 'pre', CLASS=CLASS))
138 def depart_literal_block(self, node):
139 self.body.append('\n</pre></blockquote>\n')
141 def visit_problematic(self, node):
142 """make text red"""
143 self.body.append(self.starttag(node, 'font', '', CLASS='problematic',
144 color='red'))
145 if node.hasattr('refid'):
146 self.body.append('<a href="#%s">' % node['refid'])
147 self.context.append('</a>')
148 else:
149 self.context.append('')
151 def depart_problematic(self, node):
152 self.body.append(self.context.pop())
153 self.body.append('</font>')
155 def visit_subtitle(self, node):
156 """Center sub title"""
157 if isinstance(node.parent, nodes.document):
158 self.body.append(self.starttag(node, 'h2', '', CLASS='subtitle',
159 align='center'))
160 self.context.append('</h2>\n')
161 self.in_document_title = len(self.body)
162 else:
163 html4css1.HTMLTranslator.visit_subtitle(self, node)
165 def visit_system_message(self, node):
166 self.visit_admonition(node, '', 'red')
168 self.body.append('<p class="system-message-title">')
169 backref_text = ''
170 if len(node['backrefs']):
171 backrefs = node['backrefs']
172 if len(backrefs) == 1:
173 backref_text = ('; <em><a href="#%s">backlink</a></em>'
174 % backrefs[0])
175 else:
176 i = 1
177 backlinks = []
178 for backref in backrefs:
179 backlinks.append('<a href="#%s">%s</a>' % (backref, i))
180 i += 1
181 backref_text = ('; <em>backlinks: %s</em>'
182 % ', '.join(backlinks))
183 if node.hasattr('line'):
184 line = ', line %s' % node['line']
185 else:
186 line = ''
187 self.body.append('<font color=red> System Message: %s/%s '
188 '(<tt class="docutils">%s</tt>%s)%s</font></p>\n'
189 % (node['type'], node['level'],
190 self.encode(node['source']), line, backref_text))
192 def depart_system_message(self, node):
193 self.depart_admonition(node)
195 def visit_title(self, node):
196 """Center title, Admonition title bold, evt. coloured"""
197 check_id = 0
199 if isinstance(node.parent, nodes.Admonition):
200 close_tag = '</b></p>\n'
201 self.body.append(self.starttag(node, 'p', '',
202 CLASS='admonition-title'))
203 self.body.append('<b>')
204 # if isinstance(node.parent, nodes.Note):
205 if self._title_color:
206 self.body.append('<font color="%s">'%self._title_color)
207 close_tag = '</font>' + close_tag
208 self.context.append(close_tag)
210 elif isinstance(node.parent, nodes.document):
211 self.body.append(self.starttag(node, 'h1', '', CLASS='title',
212 align='center'))
213 self.context.append('</h1>\n')
214 self.in_document_title = len(self.body)
215 elif (isinstance(node.parent, nodes.section)
216 and 'system-messages' in node.parent.attributes['classes']):
217 # print "System messages node", node.parent.attributes
218 self.body.append(self.starttag(node, 'h1', '',
219 CLASS='system-messages',
220 align='center'))
221 self.body.append('<font color="red">')
222 self.context.append('</font></h1>\n')
223 else:
224 html4css1.HTMLTranslator.visit_title(self, node)
226 def visit_warning(self, node):
227 self.visit_admonition(node, 'warning', 'red')
231 # Testing
232 # -------
234 if __name__ == '__main__':
235 try:
236 import test_html4trans
237 except ImportError:
238 pass