82fd575a78e5b921e1c73977626ff11d44825b4f
[ikiwiki.git] / IkiWiki / Plugin / polygen.pm
1 #!/usr/bin/perl
2 #
3 # Include polygen output in a page
4
5 # by Enrico Zini
6 package IkiWiki::Plugin::polygen;
7
8 use warnings;
9 use strict;
10 use IkiWiki;
11 use File::Find;
12
13 sub import { #{{{
14         IkiWiki::hook(type => "preprocess", id => "polygen",
15                 call => \&preprocess);
16 } # }}}
17
18 sub preprocess (@) { #{{{
19         my %params=@_;
20         my $grammar = ($params{grammar} or 'polygen');
21         my $symbol = ($params{symbol} or undef);
22
23         # Sanitize parameters
24         $grammar =~ IkiWiki::basename($grammar);
25         $grammar =~ s/\.grm$//;
26         $grammar .= '.grm';
27         $symbol =~ s/[^A-Za-z0-9]//g if defined $symbol;
28         $symbol = IkiWiki::possibly_foolish_untaint($symbol) if defined $symbol;
29
30         my $grmfile = '/usr/share/polygen/ita/polygen.grm';
31         if (! -d '/usr/share/polygen') {
32                 return "[[polygen not installed]]";
33         }
34         find({wanted => sub {
35                         if (substr($File::Find::name, -length($grammar)) eq $grammar) {
36                                 $grmfile = IkiWiki::possibly_foolish_untaint($File::Find::name);
37                         }
38                 },
39                 no_chdir => 1,
40         }, '/usr/share/polygen');
41         
42         my $res;
43         if (defined $symbol) {
44                 $res = `polygen -S $symbol $grmfile 2>/dev/null`;
45         }
46         else {
47                 $res = `polygen $grmfile 2>/dev/null`;
48         }
49
50         if ($?) {
51                 $res="[[polygen failed]]";
52         }
53
54         # Strip trainling spaces and newlines so that we flow well with the
55         # markdown text
56         $res =~ s/\s*$//;
57         return $res;
58 } # }}}
59
60 1