X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/a326ffed1f20aaebf751002476696e9878178092..c7bdebaaf134729356852918b387071c92f85e72:/IkiWiki/Plugin/autoindex.pm?ds=sidebyside diff --git a/IkiWiki/Plugin/autoindex.pm b/IkiWiki/Plugin/autoindex.pm index 6ff06538f..c443f01d2 100644 --- a/IkiWiki/Plugin/autoindex.pm +++ b/IkiWiki/Plugin/autoindex.pm @@ -3,108 +3,138 @@ package IkiWiki::Plugin::autoindex; use warnings; use strict; -use IkiWiki 2.00; +use IkiWiki 3.00; use Encode; -sub import { #{{{ +sub import { + hook(type => "checkconfig", id => "autoindex", call => \&checkconfig); hook(type => "getsetup", id => "autoindex", call => \&getsetup); hook(type => "refresh", id => "autoindex", call => \&refresh); -} # }}} + IkiWiki::loadplugin("transient"); +} -sub getsetup () { #{{{ +sub getsetup () { return plugin => { safe => 1, rebuild => 0, }, -} #}}} + autoindex_commit => { + type => "boolean", + example => 1, + default => 1, + description => "commit autocreated index pages", + safe => 1, + rebuild => 0, + }, +} -sub genindex ($) { #{{{ - my $page=shift; - my $file=$page.".".$config{default_pageext}; - my $template=template("autoindex.tmpl"); - $template->param(page => $page); - writefile($file, $config{srcdir}, $template->output); - if ($config{rcs}) { - IkiWiki::rcs_add($file); +sub checkconfig () { + if (! defined $config{autoindex_commit}) { + $config{autoindex_commit} = 1; } -} #}}} +} + +sub genindex ($) { + my $page=shift; + my $file=newpagefile($page, $config{default_pageext}); + + add_autofile($file, "autoindex", sub { + my $message = sprintf(gettext("creating index page %s"), + $page); + debug($message); -sub refresh () { #{{{ + my $dir = $config{srcdir}; + if (! $config{autoindex_commit}) { + no warnings 'once'; + $dir = $IkiWiki::Plugin::transient::transientdir; + } + + my $template = template("autoindex.tmpl"); + $template->param(page => $page); + writefile($file, $dir, $template->output); + + if ($config{rcs} && $config{autoindex_commit}) { + IkiWiki::disable_commit_hook(); + IkiWiki::rcs_add($file); + IkiWiki::rcs_commit_staged(message => $message); + IkiWiki::enable_commit_hook(); + } + }); +} + +sub refresh () { eval q{use File::Find}; error($@) if $@; + eval q{use Cwd}; + error($@) if $@; + my $origdir=getcwd(); my (%pages, %dirs); foreach my $dir ($config{srcdir}, @{$config{underlaydirs}}, $config{underlaydir}) { + chdir($dir) || next; + find({ no_chdir => 1, wanted => sub { - $_=decode_utf8($_); - if (IkiWiki::file_pruned($_, $dir)) { + my $file=decode_utf8($_); + $file=~s/^\.\/?//; + return unless length $file; + if (IkiWiki::file_pruned($file)) { + no warnings 'once'; $File::Find::prune=1; } elsif (! -l $_) { - my ($f)=/$config{wiki_file_regexp}/; # untaint + my ($f) = $file =~ /$config{wiki_file_regexp}/; # untaint return unless defined $f; - $f=~s/^\Q$dir\E\/?//; - return unless length $f; return if $f =~ /\._([^.]+)$/; # skip internal page if (! -d _) { $pages{pagename($f)}=1; } - elsif ($dir eq $config{srcdir}) { + elsif ($dir eq $config{srcdir} || ! $config{autoindex_commit}) { $dirs{$f}=1; } } } - }, $dir); + }, '.'); + + chdir($origdir) || die "chdir $origdir: $!"; } - + + # Compatibility code. + # + # {deleted} contains pages that have been deleted at some point. + # This plugin used to delete from the hash sometimes, but no longer + # does; in [[todo/autoindex_should_use_add__95__autofile]] Joey + # thought the old behaviour was probably a bug. + # + # The effect of listing a page in {deleted} was to avoid re-creating + # it; we migrate these pages to {autofile} which has the same effect. + # However, {autofile} contains source filenames whereas {deleted} + # contains page names. my %deleted; - if (ref $pagestate{index}{autoindex}{deleted}) { - %deleted=%{$pagestate{index}{autoindex}{deleted}}; + if (ref $wikistate{autoindex}{deleted}) { + %deleted=%{$wikistate{autoindex}{deleted}}; + delete $wikistate{autoindex}{deleted}; + } + elsif (ref $pagestate{index}{autoindex}{deleted}) { + # an even older version + %deleted=%{$pagestate{index}{autoindex}{deleted}}; + delete $pagestate{index}{autoindex}; + } + + if (keys %deleted) { foreach my $dir (keys %deleted) { - # remove deleted page state if the deleted page is re-added, - # or if all its subpages are deleted - if ($deleted{$dir} && (exists $pages{$dir} || - ! grep /^$dir\/.*/, keys %pages)) { - delete $deleted{$dir}; - } + my $file=newpagefile($dir, $config{default_pageext}); + $wikistate{autoindex}{autofile}{$file} = 1; } - $pagestate{index}{autoindex}{deleted}=\%deleted; } - my @needed; foreach my $dir (keys %dirs) { - if (! exists $pages{$dir} && ! $deleted{$dir} && - grep /^$dir\/.*/, keys %pages) { - if (exists $IkiWiki::pagemtime{$dir}) { - # This page must have just been deleted, so - # don't re-add it. And remember it was - # deleted. - if (! ref $pagestate{index}{autoindex}{deleted}) { - $pagestate{index}{autoindex}{deleted}={}; - } - ${$pagestate{index}{autoindex}{deleted}}{$dir}=1; - } - else { - push @needed, $dir; - } - } - } - - if (@needed) { - if ($config{rcs}) { - IkiWiki::disable_commit_hook(); - } - genindex($_) foreach @needed; - if ($config{rcs}) { - IkiWiki::rcs_commit_staged( - gettext("automatic index generation"), - undef, undef); - IkiWiki::enable_commit_hook(); + if (! exists $pages{$dir} && grep /^$dir\/.*/, keys %pages) { + genindex($dir); } } -} #}}} +} 1