]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki/Plugin/rst.pm
memoization for injected RPC functions is a very, very good thing
[git.ikiwiki.info.git] / IkiWiki / Plugin / rst.pm
index 6bf11fe36561c516d1bd10b6e58af34396157df5..30f5d16d819023dec64598844e382b93301337ee 100644 (file)
@@ -18,7 +18,7 @@ package IkiWiki::Plugin::rst;
 
 use warnings;
 use strict;
-use IkiWiki;
+use IkiWiki 2.00;
 use IPC::Open2;
 
 # Simple python script, maybe it should be implemented using an external script.
@@ -30,40 +30,40 @@ from sys import stdin;
 html = publish_string(stdin.read(), writer_name='html', 
        settings_overrides = { 'halt_level': 6, 
                               'file_insertion_enabled': 0,
-                              'raw_enabled': 0 }
+                              'raw_enabled': 1 }
 );
 print html[html.find('<body>')+6:html.find('</body>')].strip();
 ";
 
 sub import { #{{{
-       IkiWiki::hook(type => "htmlize", id => "rst", call => \&htmlize);
+       hook(type => "htmlize", id => "rst", call => \&htmlize);
 } # }}}
 
-sub htmlize ($) { #{{{
-       my $content=shift;
+sub htmlize (@) { #{{{
+       my %params=@_;
+       my $content=$params{content};
 
-       my $tries=10;
-       while (1) {
-               eval {
-                       # Try to call python and run our command
-                       open2(*IN, *OUT, "python", "-c",  $pyCmnd)
-                               or return $content;
-               };
-               last unless $@;
-               $tries--;
-               if ($tries < 1) {
-                       IkiWiki::debug("failed to run python to convert rst: $@");
-                       return $content;
-               }
-       }
+       my $pid;
+       my $sigpipe=0;
+       $SIG{PIPE}=sub { $sigpipe=1 };
+       $pid=open2(*IN, *OUT, "python", "-c",  $pyCmnd);
+       
        # open2 doesn't respect "use open ':utf8'"
        binmode (IN, ':utf8');
        binmode (OUT, ':utf8');
        
        print OUT $content;
        close OUT;
+
        local $/ = undef;
-       return <IN>;
+       my $ret=<IN>;
+       close IN;
+       waitpid $pid, 0;
+
+       return $content if $sigpipe;
+       $SIG{PIPE}="DEFAULT";
+
+       return $ret;
 } # }}}
 
 1