]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Render.pm
fixes
[ikiwiki.git] / IkiWiki / Render.pm
index 1ac85be44dad722e1588000fde059d420a433659..a981dcb24979da75d8f83923b9d629230a3dc1a2 100644 (file)
@@ -85,11 +85,106 @@ sub rsspage ($) { #{{{
        return $page.".rss";
 } #}}}
 
+sub postprocess { #{{{
+       # Takes content to postprocess followed by a list of postprocessor
+       # commands and subroutine references to run for the commands.
+       my $page=shift;
+       my $content=shift;
+       my %commands=@_;
+       
+       my $handle=sub {
+               my $escape=shift;
+               my $command=shift;
+               my $params=shift;
+               if (length $escape) {
+                       "[[$command $params]]";
+               }
+               elsif (exists $commands{$command}) {
+                       my %params;
+                       while ($params =~ /(\w+)=\"([^"]+)"(\s+|$)/g) {
+                               $params{$1}=$2;
+                       }
+                       $commands{$command}->($page, %params);
+               }
+               else {
+                       "[[bad directive $command]]";
+               }
+       };
+       
+       $content =~ s{(\\?)$config{wiki_processor_regexp}}{$handle->($1, $2, $3)}eg;
+       return $content;
+} #}}}
+
+sub blog_list ($$) { #{{{
+       my $globlist=shift;
+       my $maxitems=shift;
+       
+       my @list;
+       foreach my $page (keys %pagesources) {
+               if (globlist_match($page, $globlist)) {
+                       push @list, $page;
+               }
+       }
+
+       @list=sort { $pagectime{$b} <=> $pagectime{$a} } @list;
+       return @list if ! $maxitems || @list <= $maxitems;
+       return @list[0..$maxitems - 1];
+} #}}}
+
+sub get_inline_content ($$) { #{{{
+       my $parentpage=shift;
+       my $page=shift;
+       
+       my $file=$pagesources{$page};
+       my $type=pagetype($file);
+       if ($type ne 'unknown') {
+               return htmlize($type, linkify(readfile("$config{srcdir}/$file"), $parentpage));
+       }
+       else {
+               return "";
+       }
+} #}}}
+
+sub postprocess_html_inline { #{{{
+       my $parentpage=shift;
+       my %params=@_;
+       
+       if (! exists $params{pages}) {
+               return "";
+       }
+       if (! exists $params{archive}) {
+               $params{archive}="no";
+       }
+       if (! exists $params{show} && $params{archive} eq "no") {
+               $params{show}=10;
+       }
+       $inlinepages{$parentpage}=$params{pages};
+       
+       my $template=HTML::Template->new(blind_cache => 1,
+               filename => (($params{archive} eq "no") 
+                               ? "$config{templatedir}/inlinepage.tmpl"
+                               : "$config{templatedir}/inlinepagetitle.tmpl"));
+       
+       my $ret="";
+       foreach my $page (blog_list($params{pages}, $params{show})) {
+               next if $page eq $parentpage;
+               $template->param(pagelink => htmllink($parentpage, $page));
+               $template->param(content => get_inline_content($parentpage, $page))
+                       if $params{archive} eq "no";
+               $template->param(ctime => scalar(gmtime($pagectime{$page})));
+               $ret.=$template->output;
+       }
+       
+       return $ret;
+} #}}}
+
 sub genpage ($$$) { #{{{
        my $content=shift;
        my $page=shift;
        my $mtime=shift;
 
+       $content = postprocess($page, $content, inline => \&postprocess_html_inline);
+       
        my $title=pagetitle(basename($page));
        
        my $template=HTML::Template->new(blind_cache => 1,
@@ -109,7 +204,7 @@ sub genpage ($$$) { #{{{
                $template->param(historyurl => $u);
        }
 
-       if ($config{rss}) {
+       if ($config{rss} && $inlinepages{$page}) {
                $template->param(rssurl => rsspage($page));
        }
        
@@ -134,6 +229,7 @@ sub date_822 ($) { #{{{
 } #}}}
 
 sub absolute_urls ($$) { #{{{
+       # sucky sub because rss sucks
        my $content=shift;
        my $url=shift;
 
@@ -148,24 +244,43 @@ 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
-               },
-       );
+       my @items;
+       my $isblog=0;
+       my $gen_blog=sub {
+               my $parentpage=shift;
+               my %params=@_;
+               
+               return "" if exists $params{archive} && $params{archive} eq 'yes';
+               
+               if (! exists $params{show}) {
+                       $params{show}=10;
+               }
+               if (! exists $params{pages}) {
+                       return "";
+               }
+               
+               $isblog=1;
+               foreach my $page (blog_list($params{pages}, $params{show})) {
+                       next if $page eq $parentpage;
+                       push @items, {
+                               itemtitle => pagetitle(basename($page)),
+                               itemurl => "$config{url}/$renderedfiles{$page}",
+                               itempubdate => date_822($pagectime{$page}),
+                               itemcontent => absolute_urls(get_inline_content($parentpage, $page), $url),
+                       } if exists $renderedfiles{$page};
+               }
+               
+               return "";
+       };
        
+       $content = postprocess($page, $content, inline => $gen_blog);
+
        $template->param(
                title => $config{wikiname},
                pageurl => $url,
@@ -217,20 +332,21 @@ sub render ($) { #{{{
                my $page=pagename($file);
                
                $links{$page}=[findlinks($content, $page)];
+               delete $inlinepages{$page};
                
                $content=linkify($content, $page);
                $content=htmlize($type, $content);
                
                check_overwrite("$config{destdir}/".htmlpage($page), $page);
                writefile("$config{destdir}/".htmlpage($page),
-                       genpage($content, $page, mtime("$config{srcdir}/$file")));              
+                       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}) {
+               if ($config{rss} && exists $inlinepages{$page}) {
                        writefile("$config{destdir}/".rsspage($page),
                                genrss($content, $page, mtime("$config{srcdir}/$file")));
                }
@@ -288,10 +404,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;
@@ -319,7 +436,7 @@ sub refresh () { #{{{
        }
        
        # if any files were added or removed, check to see if each page
-       # needs an update due to linking to them
+       # needs an update due to linking to them or inlining 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
@@ -340,15 +457,26 @@ FILE:             foreach my $file (@files) {
                }
        }
 
-       # handle backlinks; if a page has added/removed links, update the
-       # pages it links to
+       # Handle backlinks; if a page has added/removed links, update the
+       # pages it links to. Also handle inlining here.
        # TODO: inefficient; pages may get rendered above and again here;
        # problem is the backlinks could be wrong in the first pass render
        # above
-       if (%rendered) {
+       if (%rendered || @del) {
                my %linkchanged;
                foreach my $file (keys %rendered, @del) {
                        my $page=pagename($file);
+                       
+                       foreach my $f (@files) {
+                               my $p=pagename($f);
+                               if (exists $inlinepages{$p} && 
+                                   globlist_match($page, $inlinepages{$p})) {
+                                       debug("rendering $f, which inlines $page");
+                                       render($f);
+                                       next;
+                               }
+                       }
+                       
                        if (exists $links{$page}) {
                                foreach my $link (map { bestlink($page, $_) } @{$links{$page}}) {
                                        if (length $link &&