- close IN;
-}
-
-sub saveindex () {
- open (OUT, ">$srcdir/.index") || error("cannot write to .index: $!");
- foreach my $page (keys %oldpagemtime) {
- print OUT "$oldpagemtime{$page} $pagesources{$page} $renderedfiles{$page} ".
- join(" ", @{$links{$page}})."\n"
- if $oldpagemtime{$page};
- }
- close OUT;
-}
-
-sub prune ($) {
- my $file=shift;
-
- unlink($file);
- my $dir=dirname($file);
- while (rmdir($dir)) {
- $dir=dirname($dir);
- }
-}
-
-sub refresh () {
- # Find existing pages.
- my %exists;
- my @files;
- find({
- no_chdir => 1,
- wanted => sub {
- if (/\/\.svn\//) {
- $File::Find::prune=1;
- }
- elsif (! -d $_ && ! /\.html$/ && ! /\/\./) {
- my ($f)=/(^[-A-Za-z0-9_.:\/+]+$)/; # untaint
- if (! defined $f) {
- warn("skipping bad filename $_\n");
- }
- else {
- $f=~s/^\Q$srcdir\E\/?//;
- push @files, $f;
- $exists{pagename($f)}=1;
- }
- }
- },
- }, $srcdir);
-
- my %rendered;
-
- # check for added or removed pages
- my @add;
- foreach my $file (@files) {
- my $page=pagename($file);
- if (! $oldpagemtime{$page}) {
- debug("new page $page");
- push @add, $file;
- $links{$page}=[];
- $pagesources{$page}=$file;
- }
- }
- my @del;
- foreach my $page (keys %oldpagemtime) {
- if (! $exists{$page}) {
- debug("removing old page $page");
- push @del, $renderedfiles{$page};
- prune($destdir."/".$renderedfiles{$page});
- delete $renderedfiles{$page};
- $oldpagemtime{$page}=0;
- delete $pagesources{$page};
- }
- }
-
- # render any updated files
- foreach my $file (@files) {
- my $page=pagename($file);
-
- if (! exists $oldpagemtime{$page} ||
- mtime("$srcdir/$file") > $oldpagemtime{$page}) {
- debug("rendering changed file $file");
- render($file);
- $rendered{$file}=1;
- }
- }
-
- # if any files were added or removed, check to see if each page
- # needs an update due to linking to them
- # TODO: inefficient; pages may get rendered above and again here;
- # problem is the bestlink may have changed and we won't know until
- # now
- if (@add || @del) {
-FILE: foreach my $file (@files) {
- my $page=pagename($file);
- foreach my $f (@add, @del) {
- my $p=pagename($f);
- foreach my $link (@{$links{$page}}) {
- if (bestlink($page, $link) eq $p) {
- debug("rendering $file, which links to $p");
- render($file);
- $rendered{$file}=1;
- next FILE;
- }
- }
- }
- }
- }
-
- # handle linkbacks; if a page has added/removed links, update the
- # pages it links to
- # TODO: inefficient; pages may get rendered above and again here;
- # problem is the linkbacks could be wrong in the first pass render
- # above
- if (%rendered) {
- my %linkchanged;
- foreach my $file (keys %rendered, @del) {
- my $page=pagename($file);
- if (exists $links{$page}) {
- foreach my $link (@{$links{$page}}) {
- $link=bestlink($page, $link);
- if (length $link &&
- ! exists $oldlinks{$page} ||
- ! grep { $_ eq $link } @{$oldlinks{$page}}) {
- $linkchanged{$link}=1;
- }
- }
- }
- if (exists $oldlinks{$page}) {
- foreach my $link (@{$oldlinks{$page}}) {
- $link=bestlink($page, $link);
- if (length $link &&
- ! exists $links{$page} ||
- ! grep { $_ eq $link } @{$links{$page}}) {
- $linkchanged{$link}=1;
- }
- }
- }
- }
- foreach my $link (keys %linkchanged) {
- my $linkfile=$pagesources{$link};
- if (defined $linkfile) {
- debug("rendering $linkfile, to update its linkbacks");
- render($linkfile);
- }
- }