1
2
3
4
5
6
7
8
9
10
11
12
13
14 """ rest-to-html conversion taken from the Zope core
15 This implementation requires docutils 0.4.0+ from http://docutils.sf.net/
16 """
17
18 try:
19 import docutils
20 except ImportError:
21 raise ImportError, 'Please install docutils 0.4.0+ from http://docutils.sourceforge.net/#download.'
22
23 version = docutils.__version__.split('.')
24 if not (version >= ['0', '4', '0'] or version >= ['0', '4']):
25 raise ImportError, """Old version of docutils found:
26 Got: %(version)s, required: 0.4.0+
27 Please remove docutils from %(path)s and replace it with a new version. You
28 can download docutils at http://docutils.sourceforge.net/#download.
29 """ % {'version' : docutils.__version__, 'path' : docutils.__path__[0] }
30
31
32
33
34 import docutils.parsers.rst
35 for title, options, conf in docutils.parsers.rst.Parser.settings_spec[2]:
36 if options == ['--file-insertion-enabled']:
37 conf['default'] = 0
38 break
39
40 import sys, os, locale
41 from docutils.core import publish_parts
42
43
44 default_enc = sys.getdefaultencoding()
45 default_output_encoding = 'unicode'
46 default_input_encoding = 'unicode'
47
48
49 default_level = 3
50 initial_header_level = default_level
51
52
53
54 default_language_code = 'en'
55
56
58
61
62 - def write(self, message):
64
74 """get the rendered parts of the document the and warning object
75 """
76
77 settings = settings.copy()
78 settings['input_encoding'] = input_encoding
79 settings['output_encoding'] = output_encoding
80 settings['stylesheet'] = stylesheet
81 settings['stylesheet_path'] = None
82 settings['file_insertion_enabled'] = 0
83 settings['raw_enabled'] = 0
84 if language_code:
85 settings['language_code'] = language_code
86 settings['language_code'] = language_code
87
88 settings['initial_header_level'] = initial_header_level + 1
89
90 settings['report_level'] = report_level
91
92 settings['halt_level'] = 6
93
94 settings['warning_stream'] = warning_stream = Warnings()
95
96 parts = publish_parts(source=src, writer_name=writer,
97 settings_overrides=settings,
98 config_section='zope application')
99
100 return parts, warning_stream
101
112 """ render HTML from a reStructuredText string
113
114 - 'src' -- string containing a valid reST document
115
116 - 'writer' -- docutils writer
117
118 - 'report_level' - verbosity of reST parser
119
120 - 'stylesheet' - Stylesheet to be used
121
122 - 'input_encoding' - encoding of the reST input string
123
124 - 'output_encoding' - encoding of the rendered HTML output
125
126 - 'report_level' - verbosity of reST parser
127
128 - 'language_code' - docutils language
129
130 - 'initial_header_level' - level of the first header tag
131
132 - 'warnings' - will be overwritten with a string containing the warnings
133
134 - 'settings' - dict of settings to pass in to Docutils, with priority
135
136 """
137 parts, warning_stream = render(src,
138 writer = writer,
139 report_level = report_level,
140 stylesheet = stylesheet,
141 input_encoding = input_encoding,
142 output_encoding = output_encoding,
143 language_code=language_code,
144 initial_header_level = initial_header_level,
145 settings = settings)
146
147 header = '<h%(level)s class="title">%(title)s</h%(level)s>\n' % {
148 'level': initial_header_level,
149 'title': parts['title'],
150 }
151
152 subheader = '<h%(level)s class="subtitle">%(subtitle)s</h%(level)s>\n' % {
153 'level': initial_header_level+1,
154 'subtitle': parts['subtitle'],
155 }
156
157 body = '%(docinfo)s%(body)s' % {
158 'docinfo': parts['docinfo'],
159 'body': parts['body'],
160 }
161
162
163 output = ''
164 if parts['title']:
165 output = output + header
166 if parts['subtitle']:
167 output = output + subheader
168 output = output + body
169
170
171 warnings = ''.join(warning_stream.messages)
172
173 if output_encoding != 'unicode':
174 return output.encode(output_encoding)
175 else:
176 return output
177
178 __all__ = ("HTML", 'render')
179
180 if __name__ == '__main__':
181 import sys
182 print HTML(open(sys.argv[1]).read())
183