]> sipb.mit.edu Git - ikiwiki.git/blob - IkiWiki/Plugin/otl.pm
bugnum
[ikiwiki.git] / IkiWiki / Plugin / otl.pm
1 #!/usr/bin/perl
2 # outline markup
3 package IkiWiki::Plugin::otl;
4
5 use warnings;
6 use strict;
7 use IkiWiki;
8 use IPC::Open2;
9
10 sub import { #{{{
11         IkiWiki::hook(type => "filter", id => "otl", call => \&filter);
12         IkiWiki::hook(type => "htmlize", id => "otl", call => \&htmlize);
13
14 } # }}}
15
16 sub filter (@) { #{{{
17         my %params=@_;
18         
19         # Munge up check boxes to look a little bit better. This is a hack.
20         my $checked=IkiWiki::htmllink($params{page}, $params{page},
21                 "smileys/star_on.png", 0);
22         my $unchecked=IkiWiki::htmllink($params{page}, $params{page},
23                 "smileys/star_off.png", 0);
24         $params{content}=~s/^(\s*)\[X\]\s/${1}$checked /mg;
25         $params{content}=~s/^(\s*)\[_\]\s/${1}$unchecked /mg;
26         
27         return $params{content};
28 } # }}}
29
30 sub htmlize ($) { #{{{
31         my $tries=10;
32         while (1) {
33                 eval {
34                         open2(*IN, *OUT, 'otl2html -S /dev/null -T /dev/stdin');
35                 };
36                 last unless $@;
37                 $tries--;
38                 if ($tries < 1) {
39                         IkiWiki::debug("failed to run otl2html: $@");
40                         return shift;
41                 }
42         }
43         # open2 doesn't respect "use open ':utf8'"
44         binmode (IN, ':utf8'); 
45         binmode (OUT, ':utf8'); 
46         
47         print OUT shift;
48         close OUT;
49
50         local $/ = undef;
51         my $ret=<IN>;
52         $ret=~s/.*<body>//s;
53         $ret=~s/<body>.*//s;
54         $ret=~s/<div class="Footer">.*//s;
55         return $ret;
56 } # }}}
57
58 1