Merge branch 'master' of ssh://git.kitenet.net/srv/git/ikiwiki.info
[ikiwiki] / IkiWiki / Plugin / smiley.pm
1 #!/usr/bin/perl
2 package IkiWiki::Plugin::smiley;
3
4 use warnings;
5 use strict;
6 use IkiWiki 2.00;
7
8 my %smileys;
9 my $smiley_regexp;
10
11 sub import { #{{{
12         add_underlay("smiley");
13         hook(type => "filter", id => "smiley", call => \&filter);
14 } # }}}
15
16 sub build_regexp () { #{{{
17         my $list=readfile(srcfile("smileys.mdwn"));
18         while ($list =~ m/^\s*\*\s+\\([^\s]+)\s+\[\[([^]]+)\]\]/mg) {
19                 $smileys{$1}=$2;
20         }
21         
22         if (! %smileys) {
23                 debug(gettext("failed to parse any smileys"));
24                 $smiley_regexp='';
25                 return;
26         }
27         
28         # sort and reverse so that substrings come after longer strings
29         # that contain them, in most cases.
30         $smiley_regexp='('.join('|', map { quotemeta }
31                 reverse sort keys %smileys).')';
32         #debug($smiley_regexp);
33 } #}}}
34
35 sub filter (@) { #{{{
36         my %params=@_;
37         
38         build_regexp() unless defined $smiley_regexp;
39         $params{content} =~ s{(?:^|(?<=\s))(\\?)$smiley_regexp(?:(?=\s)|$)}{
40                 $1 ? $2 : htmllink($params{page}, $params{destpage}, $smileys{$2}, linktext => $2)
41         }egs if length $smiley_regexp;
42
43         return $params{content};
44 } # }}}
45
46 1