]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blob - IkiWiki/Plugin/shortcut.pm
0e7769c67c7f22f36b9b1e857660cc9b8ba0ad9c
[git.ikiwiki.info.git] / IkiWiki / Plugin / shortcut.pm
1 #!/usr/bin/perl
2 package IkiWiki::Plugin::shortcut;
4 use warnings;
5 use strict;
6 use IkiWiki 2.00;
8 sub import { #{{{
9         hook(type => "checkconfig", id => "shortcut", call => \&checkconfig);
10         hook(type => "preprocess", id => "shortcut", call => \&preprocess_shortcut);
11 } #}}}
13 sub checkconfig () { #{{{
14         # Preprocess the shortcuts page to get all the available shortcuts
15         # defined before other pages are rendered.
16         IkiWiki::preprocess("shortcuts", "shortcuts",
17                 readfile(srcfile("shortcuts.mdwn")));
18 } # }}}
20 sub preprocess_shortcut (@) { #{{{
21         my %params=@_;
23         if (! defined $params{name} || ! defined $params{url}) {
24                 return "[[shortcut ".gettext("missing name or url parameter")."]]";
25         }
27         hook(type => "preprocess", no_override => 1, id => $params{name},
28                 call => sub { shortcut_expand($params{url}, $params{desc}, @_) });
30         #translators: This is used to display what shortcuts are defined.
31         #translators: First parameter is the name of the shortcut, the second
32         #translators: is an URL.
33         return sprintf(gettext("shortcut %s points to <i>%s</i>"), $params{name}, $params{url});
34 } # }}}
36 sub shortcut_expand ($$@) { #{{{
37         my $url=shift;
38         my $desc=shift;
39         my %params=@_;
41         # Get params in original order.
42         my @params;
43         while (@_) {
44                 my $key=shift;
45                 my $value=shift;
46                 push @params, $key if ! length $value;
47         }
49         # If the shortcuts page changes, all pages that use shortcuts will
50         # need to be updated.
51         add_depends($params{destpage}, "shortcuts");
53         my $text=join(" ", @params);
54         my $encoded_text=$text;
55         $encoded_text=~s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg;
56         
57         $url=~s{\%([sS])}{
58                 $1 eq 's' ? $encoded_text : $text
59         }eg;
61         $text=~s/_/ /g;
62         if (defined $desc) {
63                 $desc=~s/\%s/$text/g;
64         }
65         else {
66                 $desc=$text;
67         }
69         return "<a href=\"$url\">$desc</a>";
70 } #}}}
72 1