Mercurial > libervia-backend
annotate src/plugins/plugin_syntax_wiki_dotclear.py @ 2403:dec31114c402
template: improved date formatter:
the date filter is now named "date_fmt" and can be use to specify several useful formats (see docstring), using the current locale.
The "relative" format return the whole human readable relative date.
The new in_the_past test allow to check if a date is passed.
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 27 Oct 2017 18:20:10 +0200 |
parents | 33c8c4973743 |
children | 8b37a62336c3 |
rev | line source |
---|---|
1934
2daf7b4c6756
use of /usr/bin/env instead of /usr/bin/python in shebang
Goffi <goffi@goffi.org>
parents:
1808
diff
changeset
|
1 #!/usr/bin/env python2 |
1806 | 2 # -*- coding: utf-8 -*- |
3 | |
4 # SàT plugin for Dotclear Wiki Syntax | |
5 # Copyright (C) 2009-2016 Jérôme Poisson (goffi@goffi.org) | |
6 | |
7 # This program is free software: you can redistribute it and/or modify | |
8 # it under the terms of the GNU Affero General Public License as published by | |
9 # the Free Software Foundation, either version 3 of the License, or | |
10 # (at your option) any later version. | |
11 | |
12 # This program is distributed in the hope that it will be useful, | |
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 # GNU Affero General Public License for more details. | |
16 | |
17 # You should have received a copy of the GNU Affero General Public License | |
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 | |
20 # XXX: ref used: http://dotclear.org/documentation/2.0/usage/syntaxes#wiki-syntax-and-xhtml-equivalent | |
21 | |
22 from sat.core.i18n import _ | |
23 from sat.core.log import getLogger | |
24 log = getLogger(__name__) | |
25 from sat.core.constants import Const as C | |
1807
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
26 from sat.core import exceptions |
1806 | 27 from twisted.words.xish import domish |
28 from sat.tools import xml_tools | |
1807
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
29 import copy |
1806 | 30 import re |
31 | |
32 PLUGIN_INFO = { | |
2145
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
33 C.PI_NAME: "Dotclear Wiki Syntax Plugin", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
34 C.PI_IMPORT_NAME: "SYNT_DC_WIKI", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
35 C.PI_TYPE: C.PLUG_TYPE_SYNTAXE, |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
36 C.PI_DEPENDENCIES: ["TEXT-SYNTAXES"], |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
37 C.PI_MAIN: "DCWikiSyntax", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
38 C.PI_HANDLER: "", |
33c8c4973743
core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents:
1934
diff
changeset
|
39 C.PI_DESCRIPTION: _("""Implementation of Dotclear wiki syntax""") |
1806 | 40 } |
41 | |
42 NOTE_TPL = u'[{}]' # Note template | |
43 NOTE_A_REV_TPL = u'rev_note_{}' | |
44 NOTE_A_TPL = u'note_{}' | |
1807
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
45 ESCAPE_CHARS_BASE = r"(?P<escape_char>[][{}%|\\/*#@{{}}~$-])" |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
46 ESCAPE_CHARS_EXTRA = r"!?_+'()" # These chars are not escaped in XHTML => dc_wiki conversion, |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
47 # but are used in the other direction |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
48 ESCAPE_CHARS = ESCAPE_CHARS_BASE.format('') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
49 FLAG_UL = 'ul' # must be the name of the element |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
50 FLAG_OL = 'ol' |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
51 ELT_WITH_STYLE = ('img', 'div') # elements where a style attribute is expected |
1806 | 52 |
1807
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
53 wiki = [r'\\' + ESCAPE_CHARS_BASE.format(ESCAPE_CHARS_EXTRA), |
1806 | 54 r"^!!!!!(?P<h1_title>.+?)$", |
55 r"^!!!!(?P<h2_title>.+?)$", | |
56 r"^!!!(?P<h3_title>.+?)$", | |
57 r"^!!(?P<h4_title>.+?)$", | |
58 r"^!(?P<h5_title>.+?)$", | |
59 r"^----$(?P<horizontal_rule>)", | |
60 r"^\*(?P<list_bullet>.*?)$", | |
61 r"^#(?P<list_ordered>.*?)$", | |
62 r"^ (?P<preformated>.*?)$", | |
63 r"^> +?(?P<quote>.*?)$", | |
64 r"''(?P<emphasis>.+?)''", | |
65 r"__(?P<strong_emphasis>.+?)__", | |
66 r"%%%(?P<line_break>)", | |
67 r"\+\+(?P<insertion>.+?)\+\+", | |
68 r"--(?P<deletion>.+?)--", | |
69 r"\[(?P<link>.+?)\]", | |
70 r"\(\((?P<image>.+?)\)\)", | |
71 r"~(?P<anchor>.+?)~", | |
72 r"\?\?(?P<acronym>.+?\|.+?)\?\?", | |
73 r"{{(?P<inline_quote>.+?)}}", | |
74 r"@@(?P<code>.+?)@@", | |
75 r"\$\$(?P<footnote>.+?)\$\$", | |
76 r"(?P<text>.+?)", | |
77 ] | |
78 | |
79 wiki_re = re.compile('|'.join(wiki), re.MULTILINE | re.DOTALL) | |
80 wiki_block_level_re = re.compile(r"^///html(?P<html>.+?)///\n\n|(?P<paragraph>.+?)(?:\n{2,}|\Z)", re.MULTILINE | re.DOTALL) | |
81 | |
82 | |
83 class DCWikiParser(object): | |
84 | |
85 def __init__(self): | |
86 self._footnotes = None | |
87 for i in xrange(5): | |
88 setattr(self, | |
89 'parser_h{}_title'.format(i), | |
90 lambda string, parent, i=i: self._parser_title(string, parent, 'h{}'.format(i))) | |
91 | |
92 def parser_paragraph(self, string, parent): | |
93 p_elt = parent.addElement('p') | |
94 self._parse(string, p_elt) | |
95 | |
96 def parser_html(self, string, parent): | |
97 wrapped_html = "<div>{}</div>".format(string) | |
98 try: | |
99 div_elt = xml_tools.ElementParser()(wrapped_html) | |
100 except domish.ParserError as e: | |
101 log.warning(u"Error while parsing HTML content, ignoring it: {}".format(e)) | |
102 return | |
103 children = list(div_elt.elements()) | |
104 if len(children) == 1 and children[0].name == 'div': | |
105 div_elt = children[0] | |
106 parent.addChild(div_elt) | |
107 | |
108 def parser_escape_char(self, string, parent): | |
109 parent.addContent(string) | |
110 | |
111 def _parser_title(self, string, parent, name): | |
112 elt = parent.addElement(name) | |
113 elt.addContent(string) | |
114 | |
115 def parser_horizontal_rule(self, string, parent): | |
116 parent.addElement('hr') | |
117 | |
118 def _parser_list(self, string, parent, list_type): | |
119 depth = 0 | |
120 while string[depth:depth+1] == '*': | |
121 depth +=1 | |
122 | |
123 string = string[depth:].lstrip() | |
124 | |
125 for i in xrange(depth+1): | |
126 list_elt = getattr(parent, list_type) | |
127 if not list_elt: | |
128 parent = parent.addElement(list_type) | |
129 else: | |
130 parent = list_elt | |
131 | |
132 li_elt = parent.addElement('li') | |
133 self._parse(string, li_elt) | |
134 | |
135 def parser_list_bullet(self, string, parent): | |
136 self._parser_list(string, parent, 'ul') | |
137 | |
138 def parser_list_ordered(self, string, parent): | |
139 self._parser_list(string, parent, 'ol') | |
140 | |
141 def parser_preformated(self, string, parent): | |
142 pre_elt = parent.pre | |
143 if pre_elt is None: | |
144 pre_elt = parent.addElement('pre') | |
145 else: | |
146 # we are on a new line, and this is important for <pre/> | |
147 pre_elt.addContent('\n') | |
148 pre_elt.addContent(string) | |
149 | |
150 def parser_quote(self, string, parent): | |
151 blockquote_elt = parent.blockquote | |
152 if blockquote_elt is None: | |
153 blockquote_elt = parent.addElement('blockquote') | |
154 p_elt = blockquote_elt.p | |
155 if p_elt is None: | |
156 p_elt = blockquote_elt.addElement('p') | |
157 else: | |
158 string = u'\n' + string | |
159 | |
160 self._parse(string, p_elt) | |
161 | |
162 def parser_emphasis(self, string, parent): | |
163 em_elt = parent.addElement('em') | |
164 self._parse(string, em_elt) | |
165 | |
166 def parser_strong_emphasis(self, string, parent): | |
167 strong_elt = parent.addElement('strong') | |
168 self._parse(string, strong_elt) | |
169 | |
170 def parser_line_break(self, string, parent): | |
171 parent.addElement('br') | |
172 | |
173 def parser_insertion(self, string, parent): | |
174 ins_elt = parent.addElement('ins') | |
175 self._parse(string, ins_elt) | |
176 | |
177 def parser_deletion(self, string, parent): | |
178 del_elt = parent.addElement('del') | |
179 self._parse(string, del_elt) | |
180 | |
181 def parser_link(self, string, parent): | |
182 url_data = string.split(u'|') | |
183 a_elt = parent.addElement('a') | |
184 length = len(url_data) | |
1807
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
185 if length == 1: |
1806 | 186 url = url_data[0] |
187 a_elt['href'] = url | |
188 a_elt.addContent(url) | |
189 else: | |
190 name = url_data[0] | |
191 url = url_data[1] | |
192 a_elt['href'] = url | |
193 a_elt.addContent(name) | |
194 if length >= 3: | |
195 a_elt['lang'] = url_data[2] | |
196 if length >= 4: | |
197 a_elt['title'] = url_data[3] | |
198 if length > 4: | |
199 log.warning(u"too much data for url, ignoring extra data") | |
200 | |
201 def parser_image(self, string, parent): | |
202 image_data = string.split(u'|') | |
203 img_elt = parent.addElement('img') | |
204 | |
205 for idx, attribute in enumerate(('src', 'alt', 'position', 'longdesc')): | |
206 try: | |
207 data = image_data[idx] | |
208 except IndexError: | |
209 break | |
210 | |
211 if attribute != 'position': | |
212 img_elt[attribute] = data | |
213 else: | |
214 data = data.lower() | |
215 if data in ('l', 'g'): | |
216 img_elt['style'] = "display:block; float:left; margin:0 1em 1em 0" | |
217 elif data in ('r', 'd'): | |
218 img_elt['style'] = "display:block; float:right; margin:0 0 1em 1em" | |
219 elif data == 'c': | |
220 img_elt['style'] = "display:block; margin-left:auto; margin-right:auto" | |
221 else: | |
222 log.warning(u"bad position argument for image, ignoring it") | |
223 | |
224 def parser_anchor(self, string, parent): | |
225 a_elt = parent.addElement('a') | |
226 a_elt['id'] = string | |
227 | |
228 def parser_acronym(self, string, parent): | |
229 acronym, title = string.split(u'|',1) | |
230 acronym_elt = parent.addElement('acronym', content=acronym) | |
231 acronym_elt['title'] = title | |
232 | |
233 def parser_inline_quote(self, string, parent): | |
234 quote_data = string.split(u'|') | |
235 quote = quote_data[0] | |
236 q_elt = parent.addElement('q', content=quote) | |
237 for idx, attribute in enumerate(('lang', 'cite'), 1): | |
238 try: | |
239 data = quote_data[idx] | |
240 except IndexError: | |
241 break | |
242 q_elt[attribute] = data | |
243 | |
244 def parser_code(self, string, parent): | |
245 parent.addElement('code', content=string) | |
246 | |
247 def parser_footnote(self, string, parent): | |
248 idx = len(self._footnotes) + 1 | |
249 note_txt = NOTE_TPL.format(idx) | |
250 sup_elt = parent.addElement('sup') | |
251 sup_elt['class'] = 'note' | |
252 a_elt = sup_elt.addElement('a', content=note_txt) | |
253 a_elt['id'] = NOTE_A_REV_TPL.format(idx) | |
254 a_elt['href'] = u'#{}'.format(NOTE_A_TPL.format(idx)) | |
255 | |
256 p_elt = domish.Element((None, 'p')) | |
257 a_elt = p_elt.addElement('a', content=note_txt) | |
258 a_elt['id'] = NOTE_A_TPL.format(idx) | |
259 a_elt['href'] = u'#{}'.format(NOTE_A_REV_TPL.format(idx)) | |
260 self._parse(string, p_elt) | |
261 # footnotes are actually added at the end of the parsing | |
262 self._footnotes.append(p_elt) | |
263 | |
264 def parser_text(self, string, parent): | |
265 parent.addContent(string) | |
266 | |
267 def _parse(self, string, parent, block_level=False): | |
268 regex = wiki_block_level_re if block_level else wiki_re | |
269 | |
270 for match in regex.finditer(string): | |
271 if match.lastgroup is None: | |
272 parent.addContent(string) | |
273 return | |
274 matched = match.group(match.lastgroup) | |
275 try: | |
276 parser = getattr(self, 'parser_{}'.format(match.lastgroup)) | |
277 except AttributeError: | |
278 log.warning(u"No parser found for {}".format(match.lastgroup)) | |
279 # parent.addContent(string) | |
280 continue | |
281 parser(matched, parent) | |
282 | |
283 def parse(self, string): | |
284 self._footnotes = [] | |
285 div_elt = domish.Element((None, 'div')) | |
286 self._parse(string, parent=div_elt, block_level=True) | |
287 if self._footnotes: | |
288 foot_div_elt = div_elt.addElement('div') | |
289 foot_div_elt['class'] = 'footnotes' | |
290 # we add a simple horizontal rule which can be customized | |
291 # with footnotes class, instead of a text which would need | |
292 # to be translated | |
293 foot_div_elt.addElement('hr') | |
294 for elt in self._footnotes: | |
295 foot_div_elt.addChild(elt) | |
296 return div_elt | |
297 | |
298 | |
1807
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
299 class XHTMLParser(object): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
300 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
301 def __init__(self): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
302 self.flags = None |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
303 self.toto = 0 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
304 self.footnotes = None # will hold a map from url to buffer id |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
305 for i in xrange(1,6): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
306 setattr(self, |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
307 'parser_h{}'.format(i), |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
308 lambda elt, buf, level=i: self.parserHeading(elt, buf, level) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
309 ) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
310 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
311 def parser_a(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
312 try: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
313 url = elt['href'] |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
314 except KeyError: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
315 # probably an anchor |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
316 try: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
317 id_ = elt['id'] |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
318 if not id_: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
319 # we don't want empty values |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
320 raise KeyError |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
321 except KeyError: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
322 self.parserGeneric(elt, buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
323 else: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
324 buf.append(u'~~{}~~'.format(id_)) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
325 return |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
326 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
327 link_data = [url] |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
328 name = unicode(elt) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
329 if name != url: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
330 link_data.insert(0, name) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
331 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
332 lang = elt.getAttribute('lang') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
333 title = elt.getAttribute('title') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
334 if lang is not None: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
335 link_data.append(lang) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
336 elif title is not None: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
337 link_data.appand(u'') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
338 if title is not None: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
339 link_data.append(title) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
340 buf.append(u'[') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
341 buf.append(u'|'.join(link_data)) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
342 buf.append(u']') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
343 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
344 def parser_acronym(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
345 try: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
346 title = elt['title'] |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
347 except KeyError: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
348 log.debug(u"Acronyme without title, using generic parser") |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
349 self.parserGeneric(elt, buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
350 return |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
351 buf.append(u'??{}|{}??'.format(unicode(elt), title)) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
352 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
353 def parser_blockquote(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
354 # we remove wrapping <p> to avoid empty line with "> " |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
355 children = list([child for child in elt.children if unicode(child).strip() not in ('', '\n')]) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
356 if len(children) == 1 and children[0].name == 'p': |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
357 elt = children[0] |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
358 tmp_buf = [] |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
359 self.parseChildren(elt, tmp_buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
360 blockquote = u'> ' + u'\n> '.join(u''.join(tmp_buf).split('\n')) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
361 buf.append(blockquote) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
362 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
363 def parser_br(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
364 buf.append(u'%%%') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
365 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
366 def parser_code(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
367 buf.append(u'@@') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
368 self.parseChildren(elt, buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
369 buf.append(u'@@') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
370 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
371 def parser_del(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
372 buf.append(u'--') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
373 self.parseChildren(elt, buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
374 buf.append(u'--') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
375 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
376 def parser_div(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
377 if elt.getAttribute('class') == 'footnotes': |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
378 self.parserFootnote(elt, buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
379 else: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
380 self.parseChildren(elt, buf, block=True) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
381 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
382 def parser_em(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
383 buf.append(u"''") |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
384 self.parseChildren(elt, buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
385 buf.append(u"''") |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
386 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
387 def parser_h6(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
388 # XXX: <h6/> heading is not managed by wiki syntax |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
389 # so we handle it with a <h5/> |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
390 elt = copy.copy(elt) # we don't want to change to original element |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
391 elt.name = 'h5' |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
392 self._parse(elt, buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
393 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
394 def parser_hr(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
395 buf.append(u'\n----\n') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
396 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
397 def parser_img(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
398 try: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
399 url = elt['src'] |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
400 except KeyError: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
401 log.warning(u"Ignoring <img/> without src") |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
402 return |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
403 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
404 image_data=[url] |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
405 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
406 alt = elt.getAttribute('alt') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
407 style = elt.getAttribute('style', '') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
408 desc = elt.getAttribute('longdesc') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
409 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
410 if '0 1em 1em 0' in style: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
411 position = 'L' |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
412 elif '0 0 1em 1em' in style: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
413 position = 'R' |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
414 elif 'auto' in style: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
415 position = 'C' |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
416 else: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
417 position = None |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
418 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
419 if alt: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
420 image_data.append(alt) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
421 elif position or desc: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
422 image_data.append(u'') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
423 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
424 if position: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
425 image_data.append(position) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
426 elif desc: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
427 image_data.append(u'') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
428 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
429 if desc: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
430 image_data.append(desc) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
431 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
432 buf.append(u'((') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
433 buf.append(u'|'.join(image_data)) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
434 buf.append(u'))') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
435 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
436 def parser_ins(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
437 buf.append(u'++') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
438 self.parseChildren(elt, buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
439 buf.append(u'++') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
440 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
441 def parser_li(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
442 flag = None |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
443 current_flag = None |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
444 bullets = [] |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
445 for flag in reversed(self.flags): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
446 if flag in (FLAG_UL, FLAG_OL): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
447 if current_flag is None: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
448 current_flag = flag |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
449 if flag == current_flag: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
450 bullets.append(u'*' if flag == FLAG_UL else u'#') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
451 else: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
452 break |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
453 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
454 if flag != current_flag and buf[-1] == u' ': |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
455 # this trick is to avoid a space when we switch |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
456 # from (un)ordered to the other type on the same row |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
457 # e.g. *# unorder + ordered item |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
458 del buf[-1] |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
459 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
460 buf.extend(bullets) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
461 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
462 buf.append(u' ') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
463 self.parseChildren(elt, buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
464 buf.append(u'\n') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
465 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
466 def parser_ol(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
467 self.parserList(elt, buf, FLAG_OL) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
468 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
469 def parser_p(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
470 self.parseChildren(elt, buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
471 buf.append(u'\n\n') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
472 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
473 def parser_pre(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
474 pre = u''.join([child.toXml() if domish.IElement.providedBy(child) else unicode(child) for child in elt.children]) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
475 pre = u' ' + u'\n '.join(pre.split('\n')) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
476 buf.append(pre) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
477 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
478 def parser_q(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
479 quote_data=[unicode(elt)] |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
480 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
481 lang = elt.getAttribute('lang') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
482 cite = elt.getAttribute('url') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
483 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
484 if lang: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
485 quote_data.append(lang) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
486 elif cite: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
487 quote_data.append(u'') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
488 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
489 if cite: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
490 quote_data.append(cite) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
491 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
492 buf.append(u'{{') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
493 buf.append(u'|'.join(quote_data)) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
494 buf.append(u'}}') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
495 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
496 def parser_span(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
497 self.parseChildren(elt, buf, block=True) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
498 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
499 def parser_strong(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
500 buf.append(u'__') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
501 self.parseChildren(elt, buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
502 buf.append(u'__') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
503 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
504 def parser_sup(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
505 # sup is mainly used for footnotes, so we check if we have an anchor inside |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
506 children = list([child for child in elt.children if unicode(child).strip() not in ('', '\n')]) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
507 if (len(children) == 1 and domish.IElement.providedBy(children[0]) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
508 and children[0].name == 'a' and '#' in children[0].getAttribute('href', '')): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
509 url = children[0]['href'] |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
510 note_id = url[url.find('#')+1:] |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
511 if not note_id: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
512 log.warning("bad link found in footnote") |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
513 self.parserGeneric(elt, buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
514 return |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
515 # this looks like a footnote |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
516 buf.append(u'$$') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
517 buf.append(u' ') # placeholder |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
518 self.footnotes[note_id] = len(buf) - 1 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
519 buf.append(u'$$') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
520 else: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
521 self.parserGeneric(elt, buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
522 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
523 def parser_ul(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
524 self.parserList(elt, buf, FLAG_UL) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
525 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
526 def parserList(self, elt, buf, type_): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
527 self.flags.append(type_) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
528 self.parseChildren(elt, buf, block=True) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
529 idx = 0 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
530 for flag in reversed(self.flags): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
531 idx -= 1 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
532 if flag == type_: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
533 del self.flags[idx] |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
534 break |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
535 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
536 if idx == 0: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
537 raise exceptions.InternalError(u"flag has been removed by an other parser") |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
538 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
539 def parserHeading(self, elt, buf, level): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
540 buf.append((6-level) * u'!') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
541 for child in elt.children: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
542 # we ignore other elements for a Hx title |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
543 self.parserText(child, buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
544 buf.append(u'\n') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
545 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
546 def parserFootnote(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
547 for elt in elt.elements(): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
548 # all children other than <p/> are ignored |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
549 if elt.name == 'p': |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
550 a_elt = elt.a |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
551 if a_elt is None: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
552 log.warning(u"<p/> element doesn't contain <a/> in footnote, ignoring it") |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
553 continue |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
554 try: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
555 note_idx = self.footnotes[a_elt['id']] |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
556 except KeyError: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
557 log.warning(u"Note id doesn't match any known note, ignoring it") |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
558 # we create a dummy element to parse all children after the <a/> |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
559 dummy_elt = domish.Element((None, 'note')) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
560 a_idx = elt.children.index(a_elt) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
561 dummy_elt.children = elt.children[a_idx+1:] |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
562 note_buf = [] |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
563 self.parseChildren(dummy_elt, note_buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
564 # now we can replace the placeholder |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
565 buf[note_idx] = u''.join(note_buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
566 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
567 def parserText(self, txt, buf, keep_whitespaces=False): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
568 txt = unicode(txt) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
569 if not keep_whitespaces: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
570 # we get text and only let one inter word space |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
571 txt = u' '.join(txt.split()) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
572 txt = re.sub(ESCAPE_CHARS, r'\\\1', txt) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
573 if txt: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
574 buf.append(txt) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
575 return txt |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
576 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
577 def parserGeneric(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
578 # as dotclear wiki syntax handle arbitrary XHTML code |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
579 # we use this feature to add elements that we don't know |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
580 buf.append(u"\n\n///html\n{}\n///\n\n".format(elt.toXml())) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
581 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
582 def parseChildren(self, elt, buf, block=False): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
583 first_visible = True |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
584 for child in elt.children: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
585 if not block and not first_visible and buf and buf[-1][-1] not in (' ','\n'): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
586 # we add separation if it isn't already there |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
587 buf.append(u' ') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
588 if domish.IElement.providedBy(child): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
589 self._parse(child, buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
590 first_visible = False |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
591 else: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
592 appended = self.parserText(child, buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
593 if appended: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
594 first_visible = False |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
595 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
596 def _parse(self, elt, buf): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
597 elt_name = elt.name.lower() |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
598 style = elt.getAttribute('style') |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
599 if style and elt_name not in ELT_WITH_STYLE: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
600 # if we have style we use generic parser to put raw HTML |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
601 # to avoid losing it |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
602 parser = self.parserGeneric |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
603 else: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
604 try: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
605 parser = getattr(self, "parser_{}".format(elt_name)) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
606 except AttributeError: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
607 log.debug("Can't find parser for {} element, using generic one".format(elt.name)) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
608 parser = self.parserGeneric |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
609 parser(elt, buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
610 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
611 def parse(self, elt): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
612 self.flags = [] |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
613 self.footnotes = {} |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
614 buf = [] |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
615 self._parse(elt, buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
616 return u''.join(buf) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
617 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
618 def parseString(self, string): |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
619 wrapped_html = u"<div>{}</div>".format(string) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
620 try: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
621 div_elt = xml_tools.ElementParser()(wrapped_html) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
622 except domish.ParserError as e: |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
623 log.warning(u"Error while parsing HTML content: {}".format(e)) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
624 return |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
625 children = list(div_elt.elements()) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
626 if len(children) == 1 and children[0].name == 'div': |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
627 div_elt = children[0] |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
628 return self.parse(div_elt) |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
629 |
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
630 |
1806 | 631 class DCWikiSyntax(object): |
1808
18561326a561
plugin syntax dotclear: renamed syntax to wiki_dotclear, and renamed plugin file to plugin_syntax_wiki_dotclear.py
Goffi <goffi@goffi.org>
parents:
1807
diff
changeset
|
632 SYNTAX_NAME = "wiki_dotclear" |
1806 | 633 |
634 def __init__(self, host): | |
635 log.info(_(u"Dotclear wiki syntax plugin initialization")) | |
636 self.host = host | |
637 self._dc_parser = DCWikiParser() | |
1807
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
638 self._xhtml_parser = XHTMLParser() |
1806 | 639 self._stx = self.host.plugins["TEXT-SYNTAXES"] |
1808
18561326a561
plugin syntax dotclear: renamed syntax to wiki_dotclear, and renamed plugin file to plugin_syntax_wiki_dotclear.py
Goffi <goffi@goffi.org>
parents:
1807
diff
changeset
|
640 self._stx.addSyntax(self.SYNTAX_NAME, self.parseWiki, self.parseXHTML, [self._stx.OPT_NO_THREAD]) |
1806 | 641 |
642 def parseWiki(self, wiki_stx): | |
643 div_elt = self._dc_parser.parse(wiki_stx) | |
644 return div_elt.toXml() | |
645 | |
646 def parseXHTML(self, xhtml): | |
1807
0d3110341947
plugin syntax dc_wiki: added XHTML => dc_wiki converter, plus some bug fixes:
Goffi <goffi@goffi.org>
parents:
1806
diff
changeset
|
647 return self._xhtml_parser.parseString(xhtml) |