toc.py: now we can generate a table-of-contents
[webber:webber.git] / plugins / link.py
1 # -*- coding: iso-8859-1 -*-
2 from webber import *
3 import os, re
4
5 # To understand this beast, read /usr/share/doc/python2.5-doc/html/lib/module-re.html :-)
6
7 reLink = re.compile(r'''
8         \[\[                # Begin of link
9         (?=[^!])            # Don't fire for macros
10         (?:
11                 ([^\]\|]+)      # 1: link text
12                 \|              # followed by '|'
13         )?                  # optional
14         ([^\n\r\]#]+)       # 2: page to link to
15         (
16                 \#              # '#', beginning of anchor
17                 [^\s\]]+        # 3: anchor text, doesn't contain spaces or ']'
18         )?                  # optional
19         \]\]                # end of link
20         ''', re.VERBOSE)
21
22 def do_link(m):
23         """Used in re.sub() to substitute link with HTML"""
24         text = m.group(1) or ""
25         text = text.replace("\n", " ")
26         link = m.group(2).replace("\n", " ")
27         anchor = m.group(3) or ""
28         if link.find(".") == -1:
29                 for f in files:
30                         file = files[f]
31                         if not file.has_key("linktitle"):
32                                 continue
33                         if file.title == link or \
34                            file.linktitle == link or \
35                            os.path.splitext(os.path.basename(file.path))[0] == link:
36                                 #print "LINK: '%s' '%s' -> '%s'" % (text, link, file.linktitle)
37                                 if not text:
38                                         text = file.title
39                                 link = get_link_from(get_current_file().linktitle, file.linktitle)
40                                 #print "LINK: '%s' '%s'" % (text, link)
41                                 break
42         if not text:
43                 text = link
44         # TODO: validate link
45         return '<a href="%s%s">%s</a>' % (link, anchor, text)
46
47
48 def test_link():
49         for s in (
50                         'Before [[!macro]] after',
51                         'Before [[link]] after',
52                         'Before [[Text|link]] after',
53                         'Before [[Text|link#anchor]] after'
54                 ):
55                 m = reLink.search(s)
56                 if m:
57                         print "link:", s
58                         print "  name:", m.group(1)
59                         print "  link:", m.group(2)
60                         print "  anchor:", m.group(3)
61                 else:
62                         print "No link:", s
63
64 def test_sub():
65         for s in (
66                         'Before [[!macro]] after',
67                         'Before [[link]] after',
68                         'Before [[Text|link]] after',
69                         'Before [[Text|link#anchor]] after'
70                 ):
71                 print s
72                 res = reLink.sub(do_link, s)
73                 print "", res
74
75
76 @set_hook("linkify")
77 def linkify(params):
78         params.file.contents = reLink.sub(do_link, params.file.contents)