1 # Author: Guenter Milde
2 # Contact: milde@users.berlios.de
4 # Date: $Date: 2005-06-28$
5 # Copyright: Licensed under the Academic Free License version 1.2
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
21 __docformat__
= 'reStructuredText'
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'
39 writers
.Writer
.__init
__(self
)
40 self
.translator_class
= HTMLTranslator
43 class HTMLTranslator(html4css1
.HTMLTranslator
):
46 This HTML writer has been customized to produce HTML with direct
47 formatting of objects to be usable without CSS stylesheet
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
60 node
.insert(0, nodes
.title(name
, self
.language
.labels
[name
]))
61 # self.set_first_last(node)
63 def depart_admonition(self
, node
=None):
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',
98 def visit_field_name(self
, node
):
99 """left align field name"""
102 atts
['class'] = 'docinfo-name'
104 atts
['class'] = 'field-name'
105 if ( self
.settings
.field_name_limit
106 and len(node
.astext()) > self
.settings
.field_name_limit
):
108 self
.context
.append('</tr>\n<tr><td> </td>')
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'
119 self
.footnote_backrefs(node
)
121 def visit_line_block(self
, node
):
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
):
143 self
.body
.append(self
.starttag(node
, 'font', '', CLASS
='problematic',
145 if node
.hasattr('refid'):
146 self
.body
.append('<a href="#%s">' % node
['refid'])
147 self
.context
.append('</a>')
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',
160 self
.context
.append('</h2>\n')
161 self
.in_document_title
= len(self
.body
)
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">')
170 if len(node
['backrefs']):
171 backrefs
= node
['backrefs']
172 if len(backrefs
) == 1:
173 backref_text
= ('; <em><a href="#%s">backlink</a></em>'
178 for backref
in backrefs
:
179 backlinks
.append('<a href="#%s">%s</a>' % (backref
, i
))
181 backref_text
= ('; <em>backlinks: %s</em>'
182 % ', '.join(backlinks
))
183 if node
.hasattr('line'):
184 line
= ', line %s' % node
['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"""
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',
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',
221 self
.body
.append('<font color="red">')
222 self
.context
.append('</font></h1>\n')
224 html4css1
.HTMLTranslator
.visit_title(self
, node
)
226 def visit_warning(self
, node
):
227 self
.visit_admonition(node
, 'warning', 'red')
234 if __name__
== '__main__':
236 import test_html4trans