use warnings;
use strict;
use File::Spec;
+use IkiWiki;
sub linkify ($$) { #{{{
my $content=shift;
return @ret;
} #}}}
-sub rsspage ($) { #{{{
- my $page=shift;
-
- return $page.".rss";
-} #}}}
-
sub preprocess ($$) { #{{{
my $page=shift;
my $content=shift;
- my %commands=(inline => \&preprocess_inline);
-
my $handle=sub {
my $escape=shift;
my $command=shift;
my $params=shift;
if (length $escape) {
- "[[$command $params]]";
+ return "[[$command $params]]";
}
- elsif (exists $commands{$command}) {
+ elsif (exists $hooks{preprocess}{$command}) {
my %params;
while ($params =~ /(\w+)=\"([^"]+)"(\s+|$)/g) {
$params{$1}=$2;
}
- $commands{$command}->($page, %params);
+ return $hooks{preprocess}{$command}{call}->(page => $page, %params);
}
else {
- "[[bad directive $command]]";
+ return "[[$command not processed]]";
}
};
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;
+sub add_depends ($$) { #{{{
my $page=shift;
+ my $globlist=shift;
- my $file=$pagesources{$page};
- my $type=pagetype($file);
- if ($type ne 'unknown') {
- return htmlize($type, linkify(readfile(srcfile($file)), $parentpage));
+ if (! exists $depends{$page}) {
+ $depends{$page}=$globlist;
}
else {
- return "";
+ $depends{$page}=globlist_merge($depends{$page}, $globlist);
}
-} #}}}
+} # }}}
-sub preprocess_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};
+sub globlist_merge ($$) { #{{{
+ my $a=shift;
+ my $b=shift;
my $ret="";
-
- if (exists $params{rootpage}) {
- my $formtemplate=HTML::Template->new(blind_cache => 1,
- filename => "$config{templatedir}/blogpost.tmpl");
- $formtemplate->param(cgiurl => $config{cgiurl});
- $formtemplate->param(rootpage => $params{rootpage});
- my $form=$formtemplate->output;
- $ret.=$form;
- }
-
- my $template=HTML::Template->new(blind_cache => 1,
- filename => (($params{archive} eq "no")
- ? "$config{templatedir}/inlinepage.tmpl"
- : "$config{templatedir}/inlinepagetitle.tmpl"));
-
- my @pages;
- foreach my $page (blog_list($params{pages}, $params{show})) {
- next if $page eq $parentpage;
- push @pages, $page;
- $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;
- }
-
- # TODO: should really add this to renderedfiles and call
- # check_overwrite, but currently renderedfiles
- # only supports listing one file per page.
- if ($config{rss}) {
- writefile(rsspage($parentpage), $config{destdir},
- genrss($parentpage, @pages));
+ # Only add negated globs if they are not matched by the other globlist.
+ foreach my $i ((map { [ $a, $_ ] } split(" ", $b)),
+ (map { [ $b, $_ ] } split(" ", $a))) {
+ if ($i->[1]=~/^!(.*)/) {
+ if (! globlist_match($1, $i->[0])) {
+ $ret.=" ".$i->[1];
+ }
+ }
+ else {
+ $ret.=" ".$i->[1];
+ }
}
return $ret;
$template->param(hyperestraierurl => cgiurl());
}
- if ($config{rss} && $inlinepages{$page}) {
- $template->param(rssurl => rsspage(basename($page)));
- }
-
$template->param(
title => $title,
wikiname => $config{wikiname},
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 ($$) { #{{{
- # sucky sub because rss sucks
- 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 $page=shift;
- my @pages=@_;
-
- my $url="$config{url}/".htmlpage($page);
-
- my $template=HTML::Template->new(blind_cache => 1,
- filename => "$config{templatedir}/rsspage.tmpl");
-
- my @items;
- foreach my $p (@pages) {
- push @items, {
- itemtitle => pagetitle(basename($p)),
- itemurl => "$config{url}/$renderedfiles{$p}",
- itempubdate => date_822($pagectime{$p}),
- itemcontent => absolute_urls(get_inline_content($page, $p), $url),
- } if exists $renderedfiles{$p};
- }
-
- $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.
my $page=pagename($file);
$links{$page}=[findlinks($content, $page)];
- delete $inlinepages{$page};
+ delete $depends{$page};
$content=linkify($content, $page);
$content=preprocess($page, $content);
else {
my $content=readfile($srcfile, 1);
$links{$file}=[];
+ delete $depends{$file};
check_overwrite("$config{destdir}/$file", $file);
writefile($file, $config{destdir}, $content, 1);
$oldpagemtime{$file}=time;
}
# Handle backlinks; if a page has added/removed links, update the
- # pages it links to. Also handle inlining here.
+ # pages it links to. Also handles rebuilding dependat pages.
# 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 || @del) {
foreach my $f (@files) {
my $p=pagename($f);
- if (exists $inlinepages{$p}) {
+ if (exists $depends{$p}) {
foreach my $file (keys %rendered, @del) {
+ next if $f eq $file;
my $page=pagename($file);
- if (globlist_match($page, $inlinepages{$p})) {
- debug("rendering $f, which inlines $page");
+ if (globlist_match($page, $depends{$p})) {
+ debug("rendering $f, which depends on $page");
render($f);
$rendered{$f}=1;
last;
if (exists $links{$page}) {
foreach my $link (map { bestlink($page, $_) } @{$links{$page}}) {
if (length $link &&
- ! exists $oldlinks{$page} ||
- ! grep { $_ eq $link } @{$oldlinks{$page}}) {
+ (! exists $oldlinks{$page} ||
+ ! grep { bestlink($page, $_) eq $link } @{$oldlinks{$page}})) {
$linkchanged{$link}=1;
}
}
if (exists $oldlinks{$page}) {
foreach my $link (map { bestlink($page, $_) } @{$oldlinks{$page}}) {
if (length $link &&
- ! exists $links{$page} ||
- ! grep { $_ eq $link } @{$links{$page}}) {
+ (! exists $links{$page} ||
+ ! grep { bestlink($page, $_) eq $link } @{$links{$page}})) {
$linkchanged{$link}=1;
}
}