26
26
from MoinMoin import config, wikiutil
27
27
from MoinMoin.macro import Macro
28
from MoinMoin import config
28
from MoinMoin.support.python_compatibility import rsplit # Needed for python 2.3
29
29
from _creole import Parser as CreoleParser
30
from _creole import Rules as CreoleRules
38
35
Glue the DocParser and DocEmitter with the
39
36
MoinMoin current API.
42
extensions = ['.creole']
45
41
Dependencies = Dependencies
47
Emphasis:: <<Verbatim(//)>>''italics''<<Verbatim(//)>>; <<Verbatim(**)>>'''bold'''<<Verbatim(**)>>; <<Verbatim(**//)>>'''''bold italics'''''<<Verbatim(//**)>>; <<Verbatim(//)>>''mixed ''<<Verbatim(**)>>'''''bold'''<<Verbatim(**)>> and italics''<<Verbatim(//)>>;
48
Horizontal Rule:: <<Verbatim(----)>>
49
Force Linebreak:: <<Verbatim(\\\\)>>
50
Headings:: = Title 1 =; == Title 2 ==; === Title 3 ===; ==== Title 4 ====; ===== Title 5 =====.
51
Lists:: * bullets; ** sub-bullets; # numbered items; ## numbered sub items.
52
Links:: <<Verbatim([[target]])>>; <<Verbatim([[target|linktext]])>>.
53
Tables:: |= header text | cell text | more cell text |;
55
(!) For more help, see HelpOnEditing or HelpOnCreoleSyntax.
58
43
def __init__(self, raw, request, **kw):
59
44
"""Create a minimal Parser object with required attributes."""
61
46
self.request = request
62
47
self.form = request.form
64
self.rules = MoinRules(wiki_words=True,
65
url_protocols=config.url_schemas)
67
50
def format(self, formatter):
68
51
"""Create and call the true parser and emitter."""
70
document = CreoleParser(self.raw, self.rules).parse()
71
result = Emitter(document, formatter, self.request, Macro(self),
53
document = CreoleParser(self.raw).parse()
54
result = Emitter(document, formatter, self.request, Macro(self)).emit()
73
55
self.request.write(result)
75
class MoinRules(CreoleRules):
76
58
# For the link targets:
77
59
proto = r'http|https|ftp|nntp|news|mailto|telnet|file|irc'
78
60
extern = r'(?P<extern_addr>(?P<extern_proto>%s):.*)' % proto
87
69
page = r'(?P<page_name> .* )'
89
def __init__(self, *args, **kwargs):
90
CreoleRules.__init__(self, *args, **kwargs)
92
self.addr_re = re.compile('|'.join([self.extern, self.attach,
93
self.interwiki, self.page]),
99
75
tree consisting of DocNodes.
102
def __init__(self, root, formatter, request, macro, rules):
78
addr_re = re.compile('|'.join([
83
]), re.X | re.U) # for addresses
85
def __init__(self, root, formatter, request, macro):
104
87
self.formatter = formatter
105
88
self.request = request
106
89
self.form = request.form
107
90
self.macro = macro
110
92
def get_text(self, node):
111
93
"""Try to emit whatever text is in the node."""
233
215
# return self.formatter.smiley(node.content)
235
217
def header_emit(self, node):
236
text = self.get_text(node)
219
pntt = '%s%s%d' % (self.formatter.page.page_name,
220
self.get_text(node), node.level)
221
ident = "head-%s" % sha.new(pntt.encode(config.charset)).hexdigest()
238
self.formatter.heading(1, node.level, id=text),
239
self.formatter.text(text),
223
self.formatter.heading(1, node.level, id=ident),
224
self.formatter.text(node.content or ''),
240
225
self.formatter.heading(0, node.level),
274
259
elif word.startswith(wikiutil.CHILD_PREFIX):
275
260
word = "%s/%s" % (self.formatter.page.page_name,
276
261
word[wikiutil.CHILD_PREFIX_LEN:])
277
word, anchor = wikiutil.split_anchor(word)
263
parts = rsplit(word, "#", 1)
279
268
self.formatter.pagelink(1, word, anchor=anchor),
280
269
self.emit_children(node) or self.formatter.text(target),
294
283
wiki = m.group('inter_wiki')
295
284
page = m.group('inter_page')
296
page, anchor = wikiutil.split_anchor(page)
298
self.formatter.interwikilink(1, wiki, page, anchor=anchor),
286
self.formatter.interwikilink(1, wiki, page),
299
287
self.emit_children(node) or self.formatter.text(page),
300
288
self.formatter.interwikilink(0),
303
291
# link to an attachment
304
292
scheme = m.group('attach_scheme')
305
293
attachment = m.group('attach_addr')
306
url = wikiutil.url_unquote(attachment)
294
url = wikiutil.url_unquote(attachment, want_unicode=True)
307
295
text = self.get_text(node)
309
297
self.formatter.attachment_link(1, url),
323
311
def image_emit(self, node):
324
312
target = node.content
325
313
text = self.get_text(node)
326
m = self.rules.addr_re.match(target)
314
m = self.addr_re.match(target)
328
316
if m.group('page_name'):
329
317
# inserted anchors
330
url = wikiutil.url_unquote(target)
318
url = wikiutil.url_unquote(target, want_unicode=True)
331
319
if target.startswith('#'):
332
return self.formatter.anchordef(url[1:])
320
return self.formatter.rawHTML(u'<a name="%s"></a>' % url[1:])
333
321
# default to images
334
322
return self.formatter.attachment_image(
335
323
url, alt=text, html_class='image')
338
326
address = m.group('extern_addr')
339
327
proto = m.group('extern_proto')
340
url = wikiutil.url_unquote(address)
328
url = wikiutil.url_unquote(address, want_unicode=True)
341
329
return self.formatter.image(
342
330
src=url, alt=text, html_class='external_image')
343
331
elif m.group('attach_scheme'):
344
332
# link to an attachment
345
333
scheme = m.group('attach_scheme')
346
334
attachment = m.group('attach_addr')
347
url = wikiutil.url_unquote(attachment)
335
url = wikiutil.url_unquote(attachment, want_unicode=True)
348
336
if scheme == 'image':
349
337
return self.formatter.attachment_image(
350
338
url, alt=text, html_class='image')
351
339
elif scheme == 'drawing':
352
url = wikiutil.drawing2fname(url)
353
return self.formatter.attachment_drawing(url, text, alt=text)
340
return self.formatter.attachment_drawing(url, text)
356
343
elif m.group('inter_wiki'):
359
346
# return "".join(["{{", self.formatter.text(target), "}}"])
360
url = wikiutil.url_unquote(node.content)
347
url = wikiutil.url_unquote(node.content, want_unicode=True)
361
348
return self.formatter.attachment_inlined(url, text)
364
351
# def drawing_emit(self, node):
365
# url = wikiutil.url_unquote(node.content)
352
# url = wikiutil.url_unquote(node.content, want_unicode=True)
366
353
# text = self.get_text(node)
367
354
# return self.formatter.attachment_drawing(url, text)
370
357
# def figure_emit(self, node):
371
358
# text = self.get_text(node)
372
# url = wikiutil.url_unquote(node.content)
359
# url = wikiutil.url_unquote(node.content, want_unicode=True)
373
360
# return ''.join([
374
361
# self.formatter.rawHTML('<div class="figure">'),
375
362
# self.get_image(url, text), self.emit_children(node),