-use IkiWiki 2.00;
-
-sub import { #{{{
- hook(type => "checkconfig", id => "recentchanges",
- call => \&checkconfig);
- hook(type => "needsbuild", id => "recentchanges",
- call => \&needsbuild);
- hook(type => "preprocess", id => "recentchanges",
- call => \&preprocess);
- hook(type => "htmlize", id => "_change",
- call => \&htmlize);
-} #}}}
-
-sub checkconfig () { #{{{
- my @changes=IkiWiki::rcs_recentchanges(100);
- updatechanges("*", "recentchanges", \@changes);
-} #}}}
-
-sub needsbuild () { #{{{
- # TODO
-} #}}}
-
-sub preprocess (@) { #{{{
- my %params=@_;
+use IkiWiki 3.00;
+use Encode;
+use HTML::Entities;
+
+sub import {
+ hook(type => "getsetup", id => "recentchanges", call => \&getsetup);
+ hook(type => "checkconfig", id => "recentchanges", call => \&checkconfig);
+ hook(type => "refresh", id => "recentchanges", call => \&refresh);
+ hook(type => "pagetemplate", id => "recentchanges", call => \&pagetemplate);
+ hook(type => "htmlize", id => "_change", call => \&htmlize);
+ # Load goto to fix up links from recentchanges
+ IkiWiki::loadplugin("goto");
+}
+
+sub getsetup () {
+ return
+ plugin => {
+ safe => 1,
+ rebuild => 1,
+ },
+ recentchangespage => {
+ type => "string",
+ example => "recentchanges",
+ description => "name of the recentchanges page",
+ safe => 1,
+ rebuild => 1,
+ },
+ recentchangesnum => {
+ type => "integer",
+ example => 100,
+ description => "number of changes to track",
+ safe => 1,
+ rebuild => 0,
+ },
+}
+
+sub checkconfig () {
+ $config{recentchangespage}='recentchanges' unless defined $config{recentchangespage};
+ $config{recentchangesnum}=100 unless defined $config{recentchangesnum};
+}
+
+sub refresh ($) {
+ my %seen;
+
+ # add new changes
+ foreach my $change (IkiWiki::rcs_recentchanges($config{recentchangesnum})) {
+ $seen{store($change, $config{recentchangespage})}=1;
+ }
+
+ # delete old and excess changes
+ foreach my $page (keys %pagesources) {
+ if ($pagesources{$page} =~ /\._change$/ && ! $seen{$page}) {
+ unlink($config{srcdir}.'/'.$pagesources{$page});
+ }
+ }
+}
+
+sub confirmation_form {
+ my ($q, $session, $rev) = @_;
+
+ eval q{use CGI::FormBuilder};
+ error($@) if $@;
+ my $f = CGI::FormBuilder->new(
+ name => "revert",
+ header => 0,
+ charset => "utf-8",
+ method => 'POST',
+ javascript => 0,
+ params => $q,
+ action => $config{cgiurl},
+ stylesheet => 1,
+ template => { template('revert.tmpl') },
+ );
+
+ $f->field(name => "sid", type => "hidden", value => $session->id,
+ force => 1);
+ $f->field(name => "do", type => "hidden", value => "revert", force => 1);
+ $f->field(name => "rev", type => "hidden", value => $rev, force => 1);
+
+ return $f, ["Revert", "Cancel"];
+}
+
+sub sessioncgi ($$) {
+ my ($q, $session) = @_;
+ my $do = $q->param('do');
+ my $rev = $q->param('rev');
+
+ return unless $do eq 'revert' && $rev;
+
+ # FIXME rcs_preprevert ??
+ IkiWiki::check_canedit('FIXME', $q, $session);
+
+ my ($form, $buttons) = confirmation_form($q, $session);
+ IkiWiki::decode_form_utf8($form);