use IkiWiki '3.00';
+use Encode qw(decode);
+use Digest::MD5 qw(md5_hex);
+
my $id = "sweavealike";
sub import {
+ hook(type => "getsetup", id => $id, call => \&getsetup);
hook(type => "preprocess", id => $id, call => \&preprocess);
- hook(type => "preprocess", id => $id, call => \&preprocess_scan, scan => 1);
hook(type => "htmlize", id => $id, call => \&htmlize);
hook(type => "savestate", id => $id, call => \&savestate);
}
-sub preprocess_scan {
- my %param = @_;
- # start the R process here for this page
- if (not defined $pagestate{$param{page}}{$id}{R}) {
- $pagestate{$param{page}}{$id}{R} = Statistics::R->new(shared => 1) or error("Unable to create an R process");
- }
+sub getsetup {
+ return(plugin => {safe => 1,
+ rebuild => 1,
+ section => "misc",
+ link => "http://git.donarmstrong.com/?p=ikiwiki_plugins.git;a=blob;f=sweavealike.pm;hb=HEAD",
+ description => "sweavealike plugin",
+ },
+ );
+}
+
+sub code_md5 {
+ my ($code) = @_;
+ return(md5_hex(decode('utf8',$code)));
}
sub preprocess {
my %param = @_;
+ if (not defined $pagestate{$param{page}}{$id}{R}) {
+ $pagestate{$param{page}}{$id}{R} = Statistics::R->new(shared => 1)
+ or error("Unable to create an R process");
+ }
# we currently don't bother to support anything but outputing the
# entire segment of code and its R output
- if (not exists $param{code} or not defined $param{code}) {
+ if (not exists $param{code}
+ or not defined $param{code}
+ or not length $param{code}) {
error("There wasn't any R code supplied");
}
+
+ $param{width} = '400' unless exists $param{width} and defined $param{width};
+ $param{height} = '400' unless exists $param{height} and defined $param{height};
+ for (qw(width height)) {
+ if ($param{$_} !~ /^\d+$/) {
+ error("invalid $_; must be an integer: $param{$_}");
+ }
+ }
+ if (exists $param{picture}) {
+ my $md5 = code_md5($param{code}."width=$param{width}height=$param{height}");
+ my $page_esc = $params->{page};
+ $page_esc =~ s/"/\\"/g;
+ $pagestate{$param{page}}{$id}{R}->run(qq{png(filename="$page_esc",width=$param{width},height=$param{height});});
+ }
my $code_result;
eval {
$code_result = $pagestate{$param{page}}{$id}{R}->run($param{code});
};
if ($@) {
- error($@);
+ error("code '$param{code}' produced error '$@'");
+ }
+ if (exists $param{picture}) {
+ $pagestate{$param{page}}{$id}{R}->run(qq{dev.off();});
}
- my $output;
- if ($param{verbatim}) {
- $output = $param{code};
+ if (exists $param{nooutput}) {
+ return('');
+ }
+ my $output = '';
+ if (exists $param{echo}) {
+ $output .= $param{code};
$output =~ s/^/> /mg;
+ $output .= "\n";
+ }
+ if (exists $param{results}) {
+ $output .= $code_result;
+ }
+ if (exists $param{echo} or
+ exists $param{results}) {
+ $output =~ s/^/ /mg;
}
- $output .= $code_result;
- $output =~ s/^/ /mg;
return($output);
}
next unless exists $pagestate{$page}{$id};
next unless exists $pagestate{$page}{$id}{R};
if (defined $pagestate{$page}{$id}{R}
- and $pagestate{$param{page}}{$id}{R}->is_started()) {
+ and $pagestate{$page}{$id}{R}->is_started()) {
$pagestate{$page}{$id}{R}->stop;
}
delete $pagestate{$page}{$id}{R};