10 $blosxom::version="is a proper perl module too much to ask?";
11 do "/usr/bin/markdown";
17 my ($srcdir)= shift =~ /(.*)/; # untaint
18 my ($destdir)= shift =~ /(.*)/; # untaint
19 my $link=qr/\[\[([^\s]+)\]\]/;
32 print "@_\n" if $verbose;
38 return (stat($page))[9];
58 if ($page =~ /\.mdwn$/) {
69 my $type=pagetype($file);
71 $page=~s/\Q$type\E*$// unless $type eq 'unknown';
85 open (PAGE, "$srcdir/$page") || error("failed to read $page: $!");
95 my $dir=dirname("$destdir/$page");
98 foreach my $s (split(m!/+!, $dir)) {
101 mkdir($d) || error("failed to create directory $d: $!");
106 open (PAGE, ">$destdir/$page") || error("failed to write $page: $!");
115 while ($content =~ /$link/g) {
121 # Given a page and the text of a link on the page, determine which existing
122 # page that link best points to. Prefers pages under a subdirectory with
123 # the same name as the source page, failing that goes down the directory tree
124 # to the base looking for matching pages.
132 $l.="/" if length $l;
135 if (exists $links{$l}) {
136 #debug("for $page, \"$link\", use $l");
139 } while $cwd=~s!/?[^/]+$!!;
141 print STDERR "warning: page $page, broken link: $link\n";
145 sub isinlinableimage ($) {
148 $file=~/\.(png|gif|jpg|jpeg)$/;
155 my $bestlink=bestlink($page, $link);
157 return $link if $page eq $bestlink;
159 if (! grep { $_ eq $bestlink } values %renderedfiles) {
160 $bestlink=htmlpage($bestlink);
162 if (! grep { $_ eq $bestlink } values %renderedfiles) {
163 return "<a href=\"?\">?</a>$link"
166 $bestlink=File::Spec->abs2rel($bestlink, dirname($page));
168 if (isinlinableimage($bestlink)) {
169 return "<img src=\"$bestlink\">";
171 return "<a href=\"$bestlink\">$link</a>";
178 $content =~ s/$link/htmllink(pagename($file), $1)/eg;
187 if ($type eq '.mdwn') {
188 return Markdown::Markdown($content);
191 error("htmlization of $type not supported");
199 my $title=basename($page);
204 foreach my $dir (reverse split("/", $page)) {
205 if (length($pagelink)) {
206 $pagelink="<a href=\"$path$dir.html\">$dir/</a> $pagelink";
213 $path=~s/\.\.\/$/index.html/;
214 $pagelink="<a href=\"$path\">$wikiname/</a> $pagelink";
216 $content="<html>\n<head><title>$title</title></head>\n<body>\n".
217 "<h1>$pagelink</h1>\n".
219 "</body>\n</html>\n";
227 my $type=pagetype($file);
228 my $content=readpage($file);
229 if ($type ne 'unknown') {
230 my $page=pagename($file);
231 $links{$page}=[findlinks($content)];
233 $content=linkify($content, $file);
234 $content=htmlize($type, $content);
235 $content=finalize($content, $page);
237 writepage(htmlpage($page), $content);
238 $oldpagemtime{$page}=time;
239 $renderedfiles{$page}=htmlpage($page);
243 writepage($file, $content);
244 $oldpagemtime{$file}=time;
245 $renderedfiles{$file}=$file;
250 open (IN, "$srcdir/.index") || return;
253 my ($mtime, $page, $rendered, @links)=split(' ', $_);
254 $oldpagemtime{$page}=$mtime;
255 $links{$page}=\@links;
256 ($renderedfiles{$page})=$rendered=~m/(.*)/; # untaint
262 open (OUT, ">$srcdir/.index") || error("cannot write to .index: $!");
263 foreach my $page (keys %oldpagemtime) {
264 print OUT "$oldpagemtime{$page} $page $renderedfiles{$page} ".
265 join(" ", @{$links{$page}})."\n"
266 if $oldpagemtime{$page};
275 my $dir=dirname($file);
276 while (rmdir($dir)) {
282 # Find existing pages.
289 $File::Find::prune=1;
291 elsif (! -d $_ && ! /\.html$/ && ! /\/\./) {
292 my ($f)=/(^[-A-Za-z0-9_.:\/+]+$)/; # untaint
294 warn("skipping bad filename $_\n");
297 $f=~s/^\Q$srcdir\E\/?//;
299 $exists{pagename($f)}=1;
305 # check for added or removed pages
307 foreach my $file (@files) {
308 my $page=pagename($file);
309 if (! $oldpagemtime{$page}) {
310 debug("new page $page");
315 foreach my $page (keys %oldpagemtime) {
316 if (! $exists{$page}) {
317 debug("removing old page $page");
318 prune($destdir."/".$renderedfiles{$page});
319 delete $renderedfiles{$page};
320 $oldpagemtime{$page}=0;
325 # render any updated files
326 foreach my $file (@files) {
327 my $page=pagename($file);
329 if (! exists $oldpagemtime{$page} ||
330 mtime("$srcdir/$file") > $oldpagemtime{$page}) {
331 debug("rendering changed file $file");
336 # if any files were added or removed, check to see if each page
337 # needs an update due to linking to them
339 FILE: foreach my $file (@files) {
340 my $page=pagename($file);
341 foreach my $p (@adddel) {
342 foreach my $link (@{$links{$page}}) {
343 if (bestlink($page, $link) eq $p) {
344 debug("rendering $file, which links to $p");