]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Plugin/external.pm
load HTML::Entities at top
[ikiwiki.git] / IkiWiki / Plugin / external.pm
index e3504a30d510b83124516171a307b0a5656488cb..a5afdc4bef4b28b849b8b25ed414d1f4757f17b8 100644 (file)
@@ -20,7 +20,8 @@ sub import { #{{{
        return unless defined $plugin;
 
        my ($plugin_read, $plugin_write);
-       my $pid = open2($plugin_read, $plugin_write, $plugin);
+       my $pid = open2($plugin_read, $plugin_write,
+               IkiWiki::possibly_foolish_untaint($plugin));
 
        # open2 doesn't respect "use open ':utf8'"
        binmode($plugin_read, ':utf8');
@@ -28,6 +29,7 @@ sub import { #{{{
 
        $plugins{$plugin}={in => $plugin_read, out => $plugin_write, pid => $pid,
                accum => ""};
+       $RPC::XML::ENCODING="utf-8";
 
        rpc_call($plugins{$plugin}, "import");
 } #}}}
@@ -107,6 +109,7 @@ sub rpc_call ($$;@) { #{{{
 } #}}}
 
 package IkiWiki::RPC::XML;
+use Memoize;
 
 sub getvar ($$$) { #{{{
        my $plugin=shift;
@@ -130,6 +133,24 @@ sub setvar ($$$;@) { #{{{
        return $ret;
 } #}}}
 
+sub getstate ($$$$) { #{{{
+       my $plugin=shift;
+       my $page=shift;
+       my $id=shift;
+       my $key=shift;
+
+       return $IkiWiki::pagestate{$page}{$id}{$key};
+} #}}}
+
+sub setstate ($$$$;@) { #{{{
+       my $plugin=shift;
+       my $page=shift;
+       my $id=shift;
+       my $key=shift;
+
+       return $IkiWiki::pagestate{$page}{$id}{$key}=@_;
+} #}}}
+
 sub inject ($@) { #{{{
        # Bind a given perl function name to a particular RPC request.
        my $plugin=shift;
@@ -142,6 +163,7 @@ sub inject ($@) { #{{{
                IkiWiki::Plugin::external::rpc_call($plugin, $params{call}, @_)
        };
        eval qq{*$params{name}=\$sub};
+       memoize($params{name}) if $params{memoize};
        return 1;
 } #}}}