]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki/Render.pm
preserve ctimes across rebuilds
[git.ikiwiki.info.git] / IkiWiki / Render.pm
index 98c86bac8b5d4d87b76de9252e1955f8dff4fd80..f397ff3207add69a0b7a2b1b7a0fc31256c6b356 100644 (file)
@@ -79,13 +79,18 @@ sub parentlinks ($) { #{{{
        return @ret;
 } #}}}
 
-sub finalize ($$$) { #{{{
+sub rsspage ($) { #{{{
+       my $page=shift;
+
+       return $page.".rss";
+} #}}}
+
+sub genpage ($$$) { #{{{
        my $content=shift;
        my $page=shift;
        my $mtime=shift;
 
-       my $title=basename($page);
-       $title=~s/_/ /g;
+       my $title=pagetitle(basename($page));
        
        my $template=HTML::Template->new(blind_cache => 1,
                filename => "$config{templatedir}/page.tmpl");
@@ -103,6 +108,10 @@ sub finalize ($$$) { #{{{
                $u=~s/\[\[file\]\]/$pagesources{$page}/g;
                $template->param(historyurl => $u);
        }
+
+       if ($config{rss}) {
+               $template->param(rssurl => rsspage($page));
+       }
        
        $template->param(
                title => $title,
@@ -117,6 +126,55 @@ sub finalize ($$$) { #{{{
        return $template->output;
 } #}}}
 
+sub date_822 ($) { #{{{
+       my $time=shift;
+
+       eval q{use POSIX};
+       return POSIX::strftime("%a, %d %b %Y %H:%M:%S %z", localtime($time));
+} #}}}
+
+sub absolute_urls ($$) { #{{{
+       my $content=shift;
+       my $url=shift;
+
+       $url=~s/[^\/]+$//;
+       
+       $content=~s/<a\s+href="(?!http:\/\/)([^"]+)"/<a href="$url$1"/ig;
+       $content=~s/<img\s+src="(?!http:\/\/)([^"]+)"/<img src="$url$1"/ig;
+       return $content;
+} #}}}
+
+sub genrss ($$$) { #{{{
+       my $content=shift;
+       my $page=shift;
+       my $mtime=shift;
+
+       my $url="$config{url}/".htmlpage($page);
+       
+       my $template=HTML::Template->new(blind_cache => 1,
+               filename => "$config{templatedir}/rsspage.tmpl");
+       
+       # Regular page gets a feed that is updated every time the
+       # page is changed, so the mtime is encoded in the guid.
+       my @items=(
+               {
+                       itemtitle => pagetitle(basename($page)),
+                       itemguid => "$url?mtime=$mtime",
+                       itemurl => $url,
+                       itempubdate => date_822($mtime),
+                       itemcontent => absolute_urls($content, $url), # rss sucks
+               },
+       );
+       
+       $template->param(
+               title => $config{wikiname},
+               pageurl => $url,
+               items => \@items,
+       );
+       
+       return $template->output;
+} #}}}
+
 sub check_overwrite ($$) { #{{{
        # Important security check. Make sure to call this before saving
        # any files to the source directory.
@@ -162,13 +220,20 @@ sub render ($) { #{{{
                
                $content=linkify($content, $page);
                $content=htmlize($type, $content);
-               $content=finalize($content, $page,
-                       mtime("$config{srcdir}/$file"));
                
                check_overwrite("$config{destdir}/".htmlpage($page), $page);
-               writefile("$config{destdir}/".htmlpage($page), $content);
+               writefile("$config{destdir}/".htmlpage($page),
+                       genpage($content, $page, mtime("$config{srcdir}/$file")));              
                $oldpagemtime{$page}=time;
                $renderedfiles{$page}=htmlpage($page);
+
+               # TODO: should really add this to renderedfiles and call
+               # check_overwrite, as above, but currently renderedfiles
+               # only supports listing one file per page.
+               if ($config{rss}) {
+                       writefile("$config{destdir}/".rsspage($page),
+                               genrss($content, $page, mtime("$config{srcdir}/$file")));
+               }
        }
        else {
                $links{$file}=[];
@@ -223,10 +288,11 @@ sub refresh () { #{{{
        foreach my $file (@files) {
                my $page=pagename($file);
                if (! $oldpagemtime{$page}) {
-                       debug("new page $page");
+                       debug("new page $page") unless exists $pagectime{$page};
                        push @add, $file;
                        $links{$page}=[];
                        $pagesources{$page}=$file;
+                       $pagectime{$page}=time unless exists $pagectime{$page};
                }
        }
        my @del;