diff --git a/IkiWiki/Plugin/brokenlinks.pm b/IkiWiki/Plugin/brokenlinks.pm
index deee58222..3406f9919 100644
--- a/IkiWiki/Plugin/brokenlinks.pm
+++ b/IkiWiki/Plugin/brokenlinks.pm
@@ -27,9 +27,9 @@ sub preprocess (@) { #{{{
my $bestlink=IkiWiki::bestlink($page, $link);
next if length $bestlink;
push @broken,
- IkiWiki::htmllink($page, $page, $link, 1).
+ IkiWiki::htmllink($page, $params{destpage}, $link, 1).
" in ".
- IkiWiki::htmllink($params{page}, $params{page}, $page, 1);
+ IkiWiki::htmllink($params{page}, $params{destpage}, $page, 1);
}
}
}
diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm
index 749e39fb6..06c4a3737 100644
--- a/IkiWiki/Plugin/inline.pm
+++ b/IkiWiki/Plugin/inline.pm
@@ -77,13 +77,17 @@ sub preprocess_inline (@) { #{{{
foreach my $page (@list) {
$template->param(pagelink => htmllink($params{page}, $params{page}, $page));
- $template->param(content => get_inline_content($params{page}, $page))
+ $template->param(content => get_inline_content($page, $params{page}))
if $params{archive} eq "no";
$template->param(ctime => displaytime($pagectime{$page}));
if (exists $hooks{pagetemplate}) {
foreach my $id (keys %{$hooks{pagetemplate}}) {
- $hooks{pagetemplate}{$id}{call}->($page, $template);
+ $hooks{pagetemplate}{$id}{call}->(
+ page => $page,
+ destpage => $params{page},
+ template => $template,
+ );
}
}
@@ -104,13 +108,13 @@ sub preprocess_inline (@) { #{{{
} #}}}
sub get_inline_content ($$) { #{{{
- my $parentpage=shift;
my $page=shift;
+ my $destpage=shift;
my $file=$pagesources{$page};
my $type=pagetype($file);
if (defined $type) {
- return htmlize($type, preprocess($page, linkify($page, $parentpage, readfile(srcfile($file))), 1));
+ return htmlize($type, preprocess($page, $destpage, linkify($page, $destpage, readfile(srcfile($file))), 1));
}
else {
return "";
@@ -156,7 +160,7 @@ sub genrss ($@) { #{{{
itemtitle => pagetitle(basename($p)),
itemurl => "$config{url}/$renderedfiles{$p}",
itempubdate => date_822($pagectime{$p}),
- itemcontent => absolute_urls(get_inline_content($page, $p), $url),
+ itemcontent => absolute_urls(get_inline_content($p, $page), $url),
} if exists $renderedfiles{$p};
}
diff --git a/IkiWiki/Plugin/meta.pm b/IkiWiki/Plugin/meta.pm
index d4b4e5db5..5691ff6a9 100644
--- a/IkiWiki/Plugin/meta.pm
+++ b/IkiWiki/Plugin/meta.pm
@@ -52,9 +52,10 @@ sub preprocess (@) { #{{{
return "";
} # }}}
-sub pagetemplate ($$) { #{{{
- my $page=shift;
- my $template=shift;
+sub pagetemplate (@) { #{{{
+ my %params=@_;
+ my $page=$params{page};
+ my $template=$params{template};
$template->param(meta => $meta{$page})
if exists $meta{$page} && $template->query(name => "meta");
diff --git a/IkiWiki/Plugin/orphans.pm b/IkiWiki/Plugin/orphans.pm
index 12b9d2e52..ac4b77527 100644
--- a/IkiWiki/Plugin/orphans.pm
+++ b/IkiWiki/Plugin/orphans.pm
@@ -40,7 +40,7 @@ sub preprocess (@) { #{{{
}
return "All pages are linked to by other pages." unless @orphans;
- return "
\n".join("\n", map { "- ".IkiWiki::htmllink($params{page}, $params{page}, $_, 1)."
" } sort @orphans)."
\n";
+ return "\n".join("\n", map { "- ".IkiWiki::htmllink($params{page}, $params{destpage}, $_, 1)."
" } sort @orphans)."
\n";
} # }}}
1
diff --git a/IkiWiki/Plugin/search.pm b/IkiWiki/Plugin/search.pm
index 8931e3fd4..c79d40469 100644
--- a/IkiWiki/Plugin/search.pm
+++ b/IkiWiki/Plugin/search.pm
@@ -27,9 +27,10 @@ sub checkconfig () { #{{{
}
} #}}}
-sub pagetemplate ($$) { #{{{
- my $page=shift;
- my $template=shift;
+sub pagetemplate (@) { #{{{
+ my %params=@_;
+ my $page=$params{page};
+ my $template=$params{template};
# Add search box to page header.
if ($template->query(name => "searchform")) {
diff --git a/IkiWiki/Plugin/skeleton.pm b/IkiWiki/Plugin/skeleton.pm
index 306f54415..acbc88994 100644
--- a/IkiWiki/Plugin/skeleton.pm
+++ b/IkiWiki/Plugin/skeleton.pm
@@ -63,9 +63,10 @@ sub sanitize ($) { #{{{
return $content;
} # }}}
-sub pagetemplate ($$) { #{{{
- my $page=shift;
- my $template=shift;
+sub pagetemplate (@) { #{{{
+ my %params=@_;
+ my $page=$params{page};
+ my $template=$params{template};
IkiWiki::debug("skeleton plugin running as a pagetemplate hook");
} # }}}
diff --git a/IkiWiki/Plugin/tag.pm b/IkiWiki/Plugin/tag.pm
index a6eddb019..f1f3b77f5 100644
--- a/IkiWiki/Plugin/tag.pm
+++ b/IkiWiki/Plugin/tag.pm
@@ -33,12 +33,14 @@ sub preprocess (@) { #{{{
return "";
} # }}}
-sub pagetemplate ($$) { #{{{
- my $page=shift;
- my $template=shift;
+sub pagetemplate (@) { #{{{
+ my %params=@_;
+ my $page=$params{page};
+ my $destpage=$params{destpage};
+ my $template=$params{template};
$template->param(tags => join(', ',
- map { IkiWiki::htmllink($page, $page, $_) }
+ map { IkiWiki::htmllink($page, $destpage, $_) }
@{$tags{$page}}))
if exists $tags{$page} && $template->query(name => "tags");
} # }}}
diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm
index 690945c49..02dbd34bd 100644
--- a/IkiWiki/Render.pm
+++ b/IkiWiki/Render.pm
@@ -8,8 +8,8 @@ use IkiWiki;
use Encode;
sub linkify ($$$) { #{{{
- my $lpage=shift;
- my $page=shift;
+ my $lpage=shift; # the page containing the links
+ my $page=shift; # the page the link will end up on (different for inline)
my $content=shift;
$content =~ s{(\\?)$config{wiki_link_regexp}}{
@@ -86,8 +86,9 @@ sub parentlinks ($) { #{{{
return @ret;
} #}}}
-sub preprocess ($$;$) { #{{{
- my $page=shift;
+sub preprocess ($$$;$) { #{{{
+ my $page=shift; # the page the data comes from
+ my $destpage=shift; # the page the data will appear in (different for inline)
my $content=shift;
my $onlystrip=shift || 0; # strip directives without processing
@@ -113,7 +114,11 @@ sub preprocess ($$;$) { #{{{
push @params, (defined $2 ? $2 : $3), '';
}
}
- return $hooks{preprocess}{$command}{call}->(@params, page => $page);
+ return $hooks{preprocess}{$command}{call}->(
+ @params,
+ page => $page,
+ destpage => $destpage,
+ );
}
else {
return "[[$command not processed]]";
@@ -203,7 +208,11 @@ sub genpage ($$$) { #{{{
if (exists $hooks{pagetemplate}) {
foreach my $id (keys %{$hooks{pagetemplate}}) {
- $hooks{pagetemplate}{$id}{call}->($page, $template);
+ $hooks{pagetemplate}{$id}{call}->(
+ page => $page,
+ destpage => $page,
+ template => $template,
+ );
}
}
@@ -286,7 +295,7 @@ sub render ($) { #{{{
$links{$page}=[findlinks($page, $content)];
$content=linkify($page, $page, $content);
- $content=preprocess($page, $content);
+ $content=preprocess($page, $page, $content);
$content=htmlize($type, $content);
check_overwrite("$config{destdir}/".htmlpage($page), $page);
diff --git a/debian/changelog b/debian/changelog
index f4fe47238..282fdf249 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -12,6 +12,13 @@ ikiwiki (1.11) UNRELEASED; urgency=low
list their tags.
* Make all plugins with pagetemplate hooks check that variables exist
on the template before setting them.
+ * Switch pagetemplate hooks to using named parameters.
+ * Pass a "destpage" parameter to preprocessor and pagetemplate hooks.
+ This will be the page that a source page will be part of, which is
+ different than the source page for inlined pages.
+ * Audited all plugins to endure they pass page, destpage to htmllink
+ appropriatly. This means inlining of various plugins will not work
+ properly, with correct links generated.
-- Joey Hess Thu, 27 Jul 2006 17:03:09 -0400
diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn
index abad87568..16b6e9d8e 100644
--- a/doc/plugins/write.mdwn
+++ b/doc/plugins/write.mdwn
@@ -38,9 +38,10 @@ the preprocessor directive.
Each time the directive is processed, the referenced function (`preprocess`
in the example above) is called, and is passed named parameters. A "page"
parameter gives the name of the page that embedded the preprocessor
-directive. All parameters included in the directive are included as named
-parameters as well. Whatever the function returns goes onto the page in
-place of the directive.
+directive, while a "destpage" parameter gices the name of the page the
+content is going to (different for inlined pages). All parameters included
+in the directive are included as named parameters as well. Whatever the
+function returns goes onto the page in place of the directive.
## Error handing
@@ -94,9 +95,11 @@ languages to ikiwiki.
IkiWiki::hook(type => "pagetemplate", id => "foo", call => \&pagetemplate);
Each time a page is rendered, a [[template|templates]] is filled out.
-This hook allows modifying that template. The function is passed the name
-of the page, and a `HTML::Template` object that is the template that will
-be used to generate the page. It can manipulate that template object.
+This hook allows modifying that template. The function is passed named
+parameters. The "page" and "destpage" parameters are the same as for a
+preprocess hook. The "template" parameter is a `HTML::Template` object that
+is the template that will be used to generate the page. The function
+can manipulate that template object.
The most common thing to do is probably to call $template->param() to add
a new custom parameter to the template. Note that in order to be robust,
diff --git a/doc/roadmap.mdwn b/doc/roadmap.mdwn
index e2b74e4be..05ee48dff 100644
--- a/doc/roadmap.mdwn
+++ b/doc/roadmap.mdwn
@@ -14,7 +14,7 @@ Released 29 April 2006.
* Unit test suite (with tests of at least core stuff like
[[GlobList]]). (status: exists, could of course use more tests)
-* [[Plugins]] _(status: done)_
+* [[Plugins]] _(status: done, interface still not quite stable)_
* [[Tags]] _(status: partial)_
* Should have fully working [[todo/utf8]] support. _(status: fair)_
* [[Optimised_rendering|todo/optimisations]] if possible. Deal with other