~ubuntu-branches/ubuntu/natty/moin/natty-updates

« back to all changes in this revision

Viewing changes to MoinMoin/parser/text_creole.py

  • Committer: Bazaar Package Importer
  • Author(s): Jonas Smedegaard
  • Date: 2008-06-22 21:17:13 UTC
  • mto: This revision was merged to the branch mainline in revision 18.
  • Revision ID: james.westby@ubuntu.com-20080622211713-inlv5k4eifxckelr
ImportĀ upstreamĀ versionĀ 1.7.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
import StringIO
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
31
30
 
32
31
Dependencies = []
33
32
 
34
 
_ = lambda x: x
35
 
 
36
33
class Parser:
37
34
    """
38
35
    Glue the DocParser and DocEmitter with the
39
36
    MoinMoin current API.
40
37
    """
41
38
 
42
 
    extensions = ['.creole']
43
39
    # Enable caching
44
40
    caching = 1
45
41
    Dependencies = Dependencies
46
 
    quickhelp = _(u"""\
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 |;
54
 
 
55
 
(!) For more help, see HelpOnEditing or HelpOnCreoleSyntax.
56
 
""")
57
42
 
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
63
48
        self.raw = raw
64
 
        self.rules = MoinRules(wiki_words=True,
65
 
                               url_protocols=config.url_schemas)
66
49
 
67
50
    def format(self, formatter):
68
51
        """Create and call the true parser and emitter."""
69
52
 
70
 
        document = CreoleParser(self.raw, self.rules).parse()
71
 
        result = Emitter(document, formatter, self.request, Macro(self),
72
 
                         self.rules).emit()
 
53
        document = CreoleParser(self.raw).parse()
 
54
        result = Emitter(document, formatter, self.request, Macro(self)).emit()
73
55
        self.request.write(result)
74
56
 
75
 
class MoinRules(CreoleRules):
 
57
class Rules:
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
86
68
        '''
87
69
    page = r'(?P<page_name> .* )'
88
70
 
89
 
    def __init__(self, *args, **kwargs):
90
 
        CreoleRules.__init__(self, *args, **kwargs)
91
 
        # for addresses
92
 
        self.addr_re = re.compile('|'.join([self.extern, self.attach,
93
 
                                            self.interwiki, self.page]),
94
 
                                  re.X | re.U)
95
71
 
96
72
class Emitter:
97
73
    """
99
75
    tree consisting of DocNodes.
100
76
    """
101
77
 
102
 
    def __init__(self, root, formatter, request, macro, rules):
 
78
    addr_re = re.compile('|'.join([
 
79
            Rules.extern,
 
80
            Rules.attach,
 
81
            Rules.interwiki,
 
82
            Rules.page
 
83
        ]), re.X | re.U) # for addresses
 
84
 
 
85
    def __init__(self, root, formatter, request, macro):
103
86
        self.root = root
104
87
        self.formatter = formatter
105
88
        self.request = request
106
89
        self.form = request.form
107
90
        self.macro = macro
108
 
        self.rules = rules
109
91
 
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)
234
216
 
235
217
    def header_emit(self, node):
236
 
        text = self.get_text(node)
 
218
        import sha
 
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()
237
222
        return ''.join([
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),
241
226
        ])
242
227
 
264
249
 
265
250
    def link_emit(self, node):
266
251
        target = node.content
267
 
        m = self.rules.addr_re.match(target)
 
252
        m = self.addr_re.match(target)
268
253
        if m:
269
254
            if m.group('page_name'):
270
255
                # link to a page
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)
 
262
                # handle anchors
 
263
                parts = rsplit(word, "#", 1)
 
264
                anchor = ""
 
265
                if len(parts) == 2:
 
266
                    word, anchor = parts
278
267
                return ''.join([
279
268
                    self.formatter.pagelink(1, word, anchor=anchor),
280
269
                    self.emit_children(node) or self.formatter.text(target),
293
282
                # interwiki link
294
283
                wiki = m.group('inter_wiki')
295
284
                page = m.group('inter_page')
296
 
                page, anchor = wikiutil.split_anchor(page)
297
285
                return ''.join([
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),
301
289
                ])
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)
308
296
                return ''.join([
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)
327
315
        if m:
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')
337
325
                # external link
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)
354
341
                else:
355
342
                    pass
356
343
            elif m.group('inter_wiki'):
357
344
                # interwiki link
358
345
                pass
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)
362
349
 
363
350
# Not used
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)
368
355
 
369
356
# Not used
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),
468
455
        # restore 'smart' formatting if it was set
469
456
        self.formatter.no_magic = magic_save
470
457
        return output
471
 
 
472
 
del _