X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/7a680431edd837809cd62666ead08944ddc5658c..3ef2824350a37a562df6394b801e8006eac22626:/IkiWiki.pm?ds=sidebyside diff --git a/IkiWiki.pm b/IkiWiki.pm index 81c9a92f4..9b7baa0ee 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -12,16 +12,16 @@ use Storable; use open qw{:utf8 :std}; use vars qw{%config %links %oldlinks %pagemtime %pagectime %pagecase - %pagestate %renderedfiles %oldrenderedfiles %pagesources - %destsources %depends %hooks %forcerebuild $gettext_obj - %loaded_plugins}; + %pagestate %wikistate %renderedfiles %oldrenderedfiles + %pagesources %destsources %depends %hooks %forcerebuild + $gettext_obj %loaded_plugins}; use Exporter q{import}; our @EXPORT = qw(hook debug error template htmlpage add_depends pagespec_match bestlink htmllink readfile writefile pagetype srcfile pagename displaytime will_render gettext urlto targetpage - add_underlay - %config %links %pagestate %renderedfiles + add_underlay pagetitle titlepage linkpage + %config %links %pagestate %wikistate %renderedfiles %pagesources %destsources); our $VERSION = 2.00; # plugin interface version, next is ikiwiki version our $version='unknown'; # VERSION_AUTOREPLACE done by Makefile, DNE @@ -520,7 +520,11 @@ sub loadplugin ($) { #{{{ foreach my $dir (defined $config{libdir} ? possibly_foolish_untaint($config{libdir}) : undef, "$installdir/lib/ikiwiki") { if (defined $dir && -x "$dir/plugins/$plugin") { - require IkiWiki::Plugin::external; + eval { require IkiWiki::Plugin::external }; + if ($@) { + my $reason=$@; + error(sprintf(gettext("failed to load external plugin needed for %s plugin: %s"), $plugin, $reason)); + } import IkiWiki::Plugin::external "$dir/plugins/$plugin"; $loaded_plugins{$plugin}=1; return 1; @@ -614,7 +618,7 @@ sub pagename ($) { #{{{ my $type=pagetype($file); my $page=$file; - $page=~s/\Q.$type\E*$// if defined $type; + $page=~s/\Q.$type\E*$// if defined $type && !$hooks{htmlize}{$type}{keepextension}; return $page; } #}}} @@ -746,7 +750,7 @@ sub will_render ($$;$) { #{{{ # Important security check. if (-e "$config{destdir}/$dest" && ! $config{rebuild} && - ! grep { $_ eq $dest } (@{$renderedfiles{$page}}, @{$oldrenderedfiles{$page}})) { + ! grep { $_ eq $dest } (@{$renderedfiles{$page}}, @{$oldrenderedfiles{$page}}, @{$wikistate{editpage}{previews}})) { error("$config{destdir}/$dest independently created, not overwriting with version from $page"); } @@ -1305,31 +1309,42 @@ sub loadindex () { #{{{ return; } } - my $ret=Storable::fd_retrieve($in); - if (! defined $ret) { + + my $index=Storable::fd_retrieve($in); + if (! defined $index) { return 0; } - my %index=%$ret; - foreach my $src (keys %index) { - my %d=%{$index{$src}}; + + my $pages; + if (exists $index->{version} && ! ref $index->{version}) { + $pages=$index->{page}; + %wikistate=%{$index->{state}}; + } + else { + $pages=$index; + %wikistate=(); + } + + foreach my $src (keys %$pages) { + my $d=$pages->{$src}; my $page=pagename($src); - $pagectime{$page}=$d{ctime}; + $pagectime{$page}=$d->{ctime}; if (! $config{rebuild}) { $pagesources{$page}=$src; - $pagemtime{$page}=$d{mtime}; - $renderedfiles{$page}=$d{dest}; - if (exists $d{links} && ref $d{links}) { - $links{$page}=$d{links}; - $oldlinks{$page}=[@{$d{links}}]; + $pagemtime{$page}=$d->{mtime}; + $renderedfiles{$page}=$d->{dest}; + if (exists $d->{links} && ref $d->{links}) { + $links{$page}=$d->{links}; + $oldlinks{$page}=[@{$d->{links}}]; } - if (exists $d{depends}) { - $depends{$page}=$d{depends}; + if (exists $d->{depends}) { + $depends{$page}=$d->{depends}; } - if (exists $d{state}) { - $pagestate{$page}=$d{state}; + if (exists $d->{state}) { + $pagestate{$page}=$d->{state}; } } - $oldrenderedfiles{$page}=[@{$d{dest}}]; + $oldrenderedfiles{$page}=[@{$d->{dest}}]; } foreach my $page (keys %pagesources) { $pagecase{lc $page}=$page; @@ -1355,12 +1370,13 @@ sub saveindex () { #{{{ my $newfile="$config{wikistatedir}/indexdb.new"; my $cleanup = sub { unlink($newfile) }; open (my $out, '>', $newfile) || error("cannot write to $newfile: $!", $cleanup); + my %index; foreach my $page (keys %pagemtime) { next unless $pagemtime{$page}; my $src=$pagesources{$page}; - $index{$src}={ + $index{page}{$src}={ ctime => $pagectime{$page}, mtime => $pagemtime{$page}, dest => $renderedfiles{$page}, @@ -1368,17 +1384,26 @@ sub saveindex () { #{{{ }; if (exists $depends{$page}) { - $index{$src}{depends} = $depends{$page}; + $index{page}{$src}{depends} = $depends{$page}; } if (exists $pagestate{$page}) { foreach my $id (@hookids) { foreach my $key (keys %{$pagestate{$page}{$id}}) { - $index{$src}{state}{$id}{$key}=$pagestate{$page}{$id}{$key}; + $index{page}{$src}{state}{$id}{$key}=$pagestate{$page}{$id}{$key}; } } } } + + $index{state}={}; + foreach my $id (@hookids) { + foreach my $key (keys %{$wikistate{$id}}) { + $index{state}{$id}{$key}=$wikistate{$id}{$key}; + } + } + + $index{version}="3"; my $ret=Storable::nstore_fd(\%index, $out); return if ! defined $ret || ! $ret; close $out || error("failed saving to $newfile: $!", $cleanup);