I don't think this comment adds much
[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         hook(type => "filter", id => "smiley", call => \&filter);
13 } # }}}
14
15 sub build_regexp () { #{{{
16         my $list=readfile(srcfile("smileys.mdwn"));
17         while ($list =~ m/^\s*\*\s+\\([^\s]+)\s+\[\[([^]]+)\]\]/mg) {
18                 $smileys{$1}=$2;
19         }
20         
21         if (! %smileys) {
22                 debug(gettext("failed to parse any smileys"));
23                 $smiley_regexp='';
24                 return;
25         }
26         
27         # sort and reverse so that substrings come after longer strings
28         # that contain them, in most cases.
29         $smiley_regexp='('.join('|', map { quotemeta }
30                 reverse sort keys %smileys).')';
31         #debug($smiley_regexp);
32 } #}}}
33
34 sub filter (@) { #{{{
35         my %params=@_;
36         
37         build_regexp() unless defined $smiley_regexp;
38         $params{content} =~ s{(?:^|(?<=\s))(\\?)$smiley_regexp(?:(?=\s)|$)}{
39                 $1 ? $2 : htmllink($params{page}, $params{page}, $smileys{$2}, linktext => $2)
40         }egs if length $smiley_regexp;
41
42         return $params{content};
43 } # }}}
44
45 1