From dea23a1031b55dbc408e9f99c761fd667331cccd Mon Sep 17 00:00:00 2001 From: joey Date: Thu, 27 Jul 2006 23:41:58 +0000 Subject: [PATCH] * 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. --- IkiWiki/Plugin/brokenlinks.pm | 4 ++-- IkiWiki/Plugin/inline.pm | 14 +++++++++----- IkiWiki/Plugin/meta.pm | 7 ++++--- IkiWiki/Plugin/orphans.pm | 2 +- IkiWiki/Plugin/search.pm | 7 ++++--- IkiWiki/Plugin/skeleton.pm | 7 ++++--- IkiWiki/Plugin/tag.pm | 10 ++++++---- IkiWiki/Render.pm | 23 ++++++++++++++++------- debian/changelog | 7 +++++++ doc/plugins/write.mdwn | 15 +++++++++------ doc/roadmap.mdwn | 2 +- 11 files changed, 63 insertions(+), 35 deletions(-) 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"; + return "\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