]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blob - IkiWiki/Plugin/rst.pm
08ac15e43fb419b05e2a5d718c266b44c7bb4a50
[git.ikiwiki.info.git] / IkiWiki / Plugin / rst.pm
1 #!/usr/bin/perl
2 # Very simple reStructuredText processor.
3 #
4 # This plugin calls python and requires python-docutils to transform the text
5 # into html.
6 #
7 # Its main problem is that it does not support ikiwiki's WikiLinks nor
8 # Preprocessor Directives.
9 #
10 # Probably Wikilinks and Preprocessor Directives should support a list of
11 # extensions to process (i.e. the linkify function could be transformed into
12 # reStructuredText instead of HTML using a hook on rst.py instead of the
13 # current linkify function)
14 #
15 # by Sergio Talens-Oliag <sto@debian.org>
17 package IkiWiki::Plugin::rst;
19 use warnings;
20 use strict;
21 use IkiWiki;
22 use IPC::Open2;
24 # Simple python script, maybe it should be implemented using an external script.
25 # The settings_overrides are given to avoid potential security risks when
26 # reading external files or if raw html is included on rst pages.
27 my $pyCmnd = "
28 from docutils.core import publish_string;
29 from sys import stdin;
30 html = publish_string(stdin.read(), writer_name='html', 
31        settings_overrides = { 'halt_level': 6, 
32                               'file_insertion_enabled': 0,
33                               'raw_enabled': 0 }
34 );
35 print html[html.find('<body>')+6:html.find('</body>')].strip();
36 ";
38 sub import { #{{{
39         IkiWiki::hook(type => "htmlize", id => "rst", call => \&htmlize);
40 } # }}}
42 sub htmlize (@) { #{{{
43         my %params=@_;
44         my $content=$params{content};
46         my $tries=10;
47         while (1) {
48                 eval {
49                         # Try to call python and run our command
50                         open2(*IN, *OUT, "python", "-c",  $pyCmnd)
51                                 or return $content;
52                 };
53                 last unless $@;
54                 $tries--;
55                 if ($tries < 1) {
56                         IkiWiki::debug("failed to run python to convert rst: $@");
57                         return $content;
58                 }
59         }
60         # open2 doesn't respect "use open ':utf8'"
61         binmode (IN, ':utf8');
62         binmode (OUT, ':utf8');
63         
64         print OUT $content;
65         close OUT;
66         local $/ = undef;
67         return <IN>;
68 } # }}}
70 1