]> sipb.mit.edu Git - ikiwiki.git/blob - IkiWiki/Plugin/otl.pm
fix
[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 %params=@_;
32
33         my $tries=10;
34         my $pid;
35         while (1) {
36                 eval {
37                         $pid=open2(*IN, *OUT, 'otl2html -S /dev/null -T /dev/stdin');
38                 };
39                 last unless $@;
40                 $tries--;
41                 if ($tries < 1) {
42                         IkiWiki::debug("failed to run otl2html: $@");
43                         return $params{content};
44                 }
45         }
46         # open2 doesn't respect "use open ':utf8'"
47         binmode (IN, ':utf8'); 
48         binmode (OUT, ':utf8'); 
49         
50         print OUT $params{content};
51         close OUT;
52
53         local $/ = undef;
54         my $ret=<IN>;
55         close IN;
56         waitpid $pid, 0;
57
58         $ret=~s/.*<body>//s;
59         $ret=~s/<body>.*//s;
60         $ret=~s/<div class="Footer">.*//s;
61         return $ret;
62 } # }}}
63
64 1