- }
- }
-
- open (OUT, ">$file") || error("failed to write $file: $!");
- print OUT $content;
- close OUT;
-}
-
-sub findlinks {
- my $content=shift;
-
- my @links;
- while ($content =~ /$wiki_link_regexp/g) {
- push @links, lc($1);
- }
- return @links;
-}
-
-# Given a page and the text of a link on the page, determine which existing
-# page that link best points to. Prefers pages under a subdirectory with
-# the same name as the source page, failing that goes down the directory tree
-# to the base looking for matching pages.
-sub bestlink ($$) {
- my $page=shift;
- my $link=lc(shift);
-
- my $cwd=$page;
- do {
- my $l=$cwd;
- $l.="/" if length $l;
- $l.=$link;
-
- if (exists $links{$l}) {
- #debug("for $page, \"$link\", use $l");
- return $l;
- }
- } while $cwd=~s!/?[^/]+$!!;
-
- #print STDERR "warning: page $page, broken link: $link\n";
- return "";
-}
-
-sub isinlinableimage ($) {
- my $file=shift;
-
- $file=~/\.(png|gif|jpg|jpeg)$/;
-}
-
-sub htmllink ($$) {
- my $page=shift;
- my $link=shift;
-
- my $bestlink=bestlink($page, $link);
-
- return $link if $page eq $bestlink;
-
- # TODO BUG: %renderedfiles may not have it, if the linked to page
- # was also added and isn't yet rendered! Note that this bug is
- # masked by the bug mentioned below that makes all new files
- # be rendered twice.
- if (! grep { $_ eq $bestlink } values %renderedfiles) {
- $bestlink=htmlpage($bestlink);
- }
- if (! grep { $_ eq $bestlink } values %renderedfiles) {
- return "<a href=\"$cgiurl?do=create&page=$link&from=$page\">?</a>$link"
- }
-
- $bestlink=File::Spec->abs2rel($bestlink, dirname($page));
-
- if (isinlinableimage($bestlink)) {
- return "<img src=\"$bestlink\">";
- }
- return "<a href=\"$bestlink\">$link</a>";
-}
-
-sub linkify ($$) {
- my $content=shift;
- my $file=shift;
-
- $content =~ s/$wiki_link_regexp/htmllink(pagename($file), $1)/eg;
-
- return $content;
-}
-
-sub htmlize ($$) {
- my $type=shift;
- my $content=shift;
-
- if ($type eq '.mdwn') {
- return Markdown::Markdown($content);
- }
- else {
- error("htmlization of $type not supported");
- }
-}
-
-sub linkbacks ($$) {
- my $content=shift;
- my $page=shift;
-
- my @links;
- foreach my $p (keys %links) {
- next if bestlink($page, $p) eq $page;
- if (grep { length $_ && bestlink($p, $_) eq $page } @{$links{$p}}) {
- my $href=File::Spec->abs2rel(htmlpage($p), dirname($page));
-
- # Trim common dir prefixes from both pages.
- my $p_trimmed=$p;
- my $page_trimmed=$page;
- my $dir;
- 1 while (($dir)=$page_trimmed=~m!^([^/]+/)!) &&
- defined $dir &&
- $p_trimmed=~s/^\Q$dir\E// &&
- $page_trimmed=~s/^\Q$dir\E//;
-
- push @links, "<a href=\"$href\">$p_trimmed</a>";
- }
- }
-
- $content.="<hr><p>Links: ".join(" ", sort @links)."</p>\n" if @links;
- return $content;
-}
-
-sub finalize ($$) {
- my $content=shift;
- my $page=shift;
-
- my $title=basename($page);
- $title=~s/_/ /g;
-
- my $pagelink="";
- my $path="";
- foreach my $dir (reverse split("/", $page)) {
- if (length($pagelink)) {
- $pagelink="<a href=\"$path$dir.html\">$dir</a>/ $pagelink";
- }
- else {
- $pagelink=$dir;
- }
- $path.="../";
- }
- $path=~s/\.\.\/$/index.html/;
- $pagelink="<a href=\"$path\">$wikiname</a>/ $pagelink";
-
- my @actions;
- if (length $cgiurl) {
- push @actions, "<a href=\"$cgiurl?do=edit&page=$page\">Edit</a>";
- push @actions, "<a href=\"$cgiurl?do=recentchanges\">RecentChanges</a>";
- }
-
- $content="<html>\n<head><title>$title</title></head>\n<body>\n".
- "<h1>$pagelink</h1>\n".
- "@actions\n<hr>\n".
- $content.
- "</body>\n</html>\n";
-
- return $content;
-}
-
-sub render ($) {
- my $file=shift;
-
- my $type=pagetype($file);
- my $content=readfile("$srcdir/$file");
- if ($type ne 'unknown') {
- my $page=pagename($file);
-
- $links{$page}=[findlinks($content)];
-
- $content=linkify($content, $file);
- $content=htmlize($type, $content);
- $content=linkbacks($content, $page);
- $content=finalize($content, $page);
-
- writefile("$destdir/".htmlpage($page), $content);
- $oldpagemtime{$page}=time;
- $renderedfiles{$page}=htmlpage($page);
- }
- else {
- $links{$file}=[];
- writefile("$destdir/$file", $content);
- $oldpagemtime{$file}=time;
- $renderedfiles{$file}=$file;
- }
-}
-
-sub loadindex () {
- open (IN, "$srcdir/.index") || return;
- while (<IN>) {
- $_=possibly_foolish_untaint($_);
- chomp;
- my ($mtime, $file, $rendered, @links)=split(' ', $_);
- my $page=pagename($file);
- $pagesources{$page}=$file;
- $oldpagemtime{$page}=$mtime;
- $oldlinks{$page}=[@links];
- $links{$page}=[@links];
- $renderedfiles{$page}=$rendered;
- }
- 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 rcs_update () {
- if (-d "$srcdir/.svn") {
- if (system("svn", "update", "--quiet", $srcdir) != 0) {
- warn("svn update failed\n");
- }
- }
-}
-
-sub rcs_commit ($) {
- my $message=shift;
-
- if (-d "$srcdir/.svn") {
- if (system("svn", "commit", "--quiet", "-m",
- possibly_foolish_untaint($message), $srcdir) != 0) {
- warn("svn commit failed\n");
- }
- }
-}
-
-sub rcs_add ($) {
- my $file=shift;
-
- if (-d "$srcdir/.svn") {
- my $parent=dirname($file);
- while (! -d "$srcdir/$parent/.svn") {
- $file=$parent;
- $parent=dirname($file);
- }
-
- if (system("svn", "add", "--quiet", "$srcdir/$file") != 0) {
- warn("svn add failed\n");
- }
- }
-}
-
-sub prune ($) {
- my $file=shift;