diff --git a/IkiWiki.pm b/IkiWiki.pm index 5f0055d3e..7c910a53d 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -18,7 +18,7 @@ our @EXPORT = qw(hook debug error template htmlpage add_depends pagespec_match bestlink htmllink readfile writefile pagetype srcfile pagename displaytime will_render gettext urlto targetpage %config %links %renderedfiles %pagesources %destsources); -our $VERSION = 1.02; # plugin interface version, next is ikiwiki version +our $VERSION = 2.00; # plugin interface version, next is ikiwiki version our $version='unknown'; # VERSION_AUTOREPLACE done by Makefile, DNE my $installdir=''; # INSTALLDIR_AUTOREPLACE done by Makefile, DNE @@ -974,38 +974,42 @@ sub pagespec_translate ($) { #{{{ } elsif ($word =~ /^(\w+)\((.*)\)$/) { if (exists $IkiWiki::PageSpec::{"match_$1"}) { - $code.="IkiWiki::PageSpec::match_$1(\$page, ".safequote($2).", \$from)"; + $code.="IkiWiki::PageSpec::match_$1(\$page, ".safequote($2).", \@params)"; } else { $code.=" 0"; } } else { - $code.=" IkiWiki::PageSpec::match_glob(\$page, ".safequote($word).", \$from)"; + $code.=" IkiWiki::PageSpec::match_glob(\$page, ".safequote($word).", \@params)"; } } return $code; } #}}} -sub pagespec_match ($$;$) { #{{{ +sub pagespec_match ($$;@) { #{{{ my $page=shift; my $spec=shift; - my $from=shift; + my @params=@_; + + # Backwards compatability with old calling convention. + if (@params == 1) { + unshift @params, "location"; + } return eval pagespec_translate($spec); } #}}} package IkiWiki::PageSpec; -sub match_glob ($$$) { #{{{ +sub match_glob ($$;@) { #{{{ my $page=shift; my $glob=shift; - my $from=shift; - if (! defined $from){ - $from = ""; - } - + my %params=@_; + + my $from=exists $params{location} ? $params{location} : ""; + # relative matching if ($glob =~ m!^\./!) { $from=~s!/?[^/]+$!!; @@ -1021,13 +1025,12 @@ sub match_glob ($$$) { #{{{ return $page=~/^$glob$/i; } #}}} -sub match_link ($$$) { #{{{ +sub match_link ($$;@) { #{{{ my $page=shift; my $link=lc(shift); - my $from=shift; - if (! defined $from){ - $from = ""; - } + my %params=@_; + + my $from=exists $params{location} ? $params{location} : ""; # relative matching if ($link =~ m!^\.! && defined $from) { @@ -1046,11 +1049,11 @@ sub match_link ($$$) { #{{{ return 0; } #}}} -sub match_backlink ($$$) { #{{{ - match_link($_[1], $_[0], $_[3]); +sub match_backlink ($$;@) { #{{{ + match_link($_[1], $_[0], @_); } #}}} -sub match_created_before ($$$) { #{{{ +sub match_created_before ($$;@) { #{{{ my $page=shift; my $testpage=shift; @@ -1062,7 +1065,7 @@ sub match_created_before ($$$) { #{{{ } } #}}} -sub match_created_after ($$$) { #{{{ +sub match_created_after ($$;@) { #{{{ my $page=shift; my $testpage=shift; @@ -1074,16 +1077,25 @@ sub match_created_after ($$$) { #{{{ } } #}}} -sub match_creation_day ($$$) { #{{{ +sub match_creation_day ($$;@) { #{{{ return ((gmtime($IkiWiki::pagectime{shift()}))[3] == shift); } #}}} -sub match_creation_month ($$$) { #{{{ +sub match_creation_month ($$;@) { #{{{ return ((gmtime($IkiWiki::pagectime{shift()}))[4] + 1 == shift); } #}}} -sub match_creation_year ($$$) { #{{{ +sub match_creation_year ($$;@) { #{{{ return ((gmtime($IkiWiki::pagectime{shift()}))[5] + 1900 == shift); } #}}} +sub match_user ($$;@) { #{{{ + shift; + my $user=shift; + my %params=@_; + + return unless exists $params{user}; + return $user eq $params{user}; +} #}}} + 1 diff --git a/IkiWiki/Plugin/aggregate.pm b/IkiWiki/Plugin/aggregate.pm index 319243727..78f8b409c 100644 --- a/IkiWiki/Plugin/aggregate.pm +++ b/IkiWiki/Plugin/aggregate.pm @@ -4,7 +4,7 @@ package IkiWiki::Plugin::aggregate; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; use HTML::Entities; use HTML::Parser; use HTML::Tagset; diff --git a/IkiWiki/Plugin/anonok.pm b/IkiWiki/Plugin/anonok.pm index 3e2a746e6..cd05cd865 100644 --- a/IkiWiki/Plugin/anonok.pm +++ b/IkiWiki/Plugin/anonok.pm @@ -3,7 +3,7 @@ package IkiWiki::Plugin::anonok; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "canedit", id => "anonok", call => \&canedit,); diff --git a/IkiWiki/Plugin/brokenlinks.pm b/IkiWiki/Plugin/brokenlinks.pm index d9d50f75f..fa34a7008 100644 --- a/IkiWiki/Plugin/brokenlinks.pm +++ b/IkiWiki/Plugin/brokenlinks.pm @@ -4,7 +4,7 @@ package IkiWiki::Plugin::brokenlinks; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "preprocess", id => "brokenlinks", call => \&preprocess); @@ -20,7 +20,7 @@ sub preprocess (@) { #{{{ my @broken; foreach my $page (keys %links) { - if (pagespec_match($page, $params{pages}, $params{page})) { + if (pagespec_match($page, $params{pages}, location => $params{page})) { my $discussion=gettext("discussion"); foreach my $link (@{$links{$page}}) { next if $link =~ /.*\/\Q$discussion\E/i && $config{discussion}; diff --git a/IkiWiki/Plugin/camelcase.pm b/IkiWiki/Plugin/camelcase.pm index 0bb35b6e2..29d22b0dd 100644 --- a/IkiWiki/Plugin/camelcase.pm +++ b/IkiWiki/Plugin/camelcase.pm @@ -2,9 +2,9 @@ # CamelCase links package IkiWiki::Plugin::camelcase; -use IkiWiki; use warnings; use strict; +use IkiWiki 2.00; sub import { #{{{ hook(type => "filter", id => "camelcase", call => \&filter); diff --git a/IkiWiki/Plugin/conditional.pm b/IkiWiki/Plugin/conditional.pm index 22057c135..29223ace2 100644 --- a/IkiWiki/Plugin/conditional.pm +++ b/IkiWiki/Plugin/conditional.pm @@ -3,12 +3,9 @@ package IkiWiki::Plugin::conditional; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; use UNIVERSAL; -# Globals used to pass information into the PageSpec functions. -our ($sourcepage, $destpage); - sub import { #{{{ hook(type => "preprocess", id => "if", call => \&preprocess_if); } # }}} @@ -21,27 +18,28 @@ sub preprocess_if (@) { #{{{ } my $result=0; - $sourcepage=$params{page}; - $destpage=$params{destpage}; # An optimisation to avoid needless looping over every page # and adding of dependencies for simple uses of some of the # tests. if ($params{test} =~ /^(enabled|sourcepage|destpage)\((.*)\)$/) { - $result=eval "IkiWiki::PageSpec::match_$1(undef, ". - IkiWiki::safequote($2).", \$params{page})"; + $result=pagespec_match($params{page}, $params{test}, + location => $params{page}, + sourcepage => $params{page}, + destpage => $params{destpage}); } else { add_depends($params{page}, $params{test}); foreach my $page (keys %pagesources) { - if (pagespec_match($page, $params{test}, $params{page})) { + if (pagespec_match($page, $params{test}, + location => $params{page}, + sourcepage => $params{page}, + destpage => $params{destpage})) { $result=1; last; } } } - $sourcepage=""; - $destpage=""; my $ret; if ($result) { @@ -59,7 +57,7 @@ sub preprocess_if (@) { #{{{ package IkiWiki::PageSpec; -sub match_enabled ($$$) { #{{{ +sub match_enabled ($$;@) { #{{{ shift; my $plugin=shift; @@ -67,24 +65,31 @@ sub match_enabled ($$$) { #{{{ return UNIVERSAL::can("IkiWiki::Plugin::".$plugin, "import"); } #}}} -sub match_sourcepage ($$$) { #{{{ +sub match_sourcepage ($$;@) { #{{{ shift; my $glob=shift; - - return match_glob($IkiWiki::Plugin::conditional::sourcepage, $glob, - $IkiWiki::Plugin::conditional::sourcepage); + my %params=@_; + + return unless exists $params{sourcepage}; + return match_glob($params{sourcepage}, $glob, @_); } #}}} -sub match_destpage ($$$) { #{{{ +sub match_destpage ($$;@) { #{{{ shift; my $glob=shift; + my %params=@_; - return match_glob($IkiWiki::Plugin::conditional::destpage, $glob, - $IkiWiki::Plugin::conditional::sourcepage); + return unless exists $params{destpage}; + return match_glob($params{destpage}, $glob, @_); } #}}} -sub match_included ($$$) { #{{{ - return $IkiWiki::Plugin::conditional::sourcepage ne $IkiWiki::Plugin::conditional::destpage; +sub match_included ($$;$) { #{{{ + shift; + shift; + my %params=@_; + + return unless exists $params{sourcepage} && exists $params{destpage}; + return $params{sourcepage} ne $params{destpage}; } #}}} 1 diff --git a/IkiWiki/Plugin/ddate.pm b/IkiWiki/Plugin/ddate.pm index 862d4da5b..f4921fdfd 100644 --- a/IkiWiki/Plugin/ddate.pm +++ b/IkiWiki/Plugin/ddate.pm @@ -1,7 +1,8 @@ #!/usr/bin/perl # Discordian date support fnord ikiwiki. package IkiWiki::Plugin::ddate; -use IkiWiki; + +use IkiWiki 2.00; no warnings; sub import { #{{{ diff --git a/IkiWiki/Plugin/favicon.pm b/IkiWiki/Plugin/favicon.pm index 864131d1e..7169c58c3 100644 --- a/IkiWiki/Plugin/favicon.pm +++ b/IkiWiki/Plugin/favicon.pm @@ -5,7 +5,7 @@ package IkiWiki::Plugin::favicon; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "pagetemplate", id => "favicon", call => \&pagetemplate); diff --git a/IkiWiki/Plugin/fortune.pm b/IkiWiki/Plugin/fortune.pm index 3bab134be..a3b13f687 100644 --- a/IkiWiki/Plugin/fortune.pm +++ b/IkiWiki/Plugin/fortune.pm @@ -2,9 +2,9 @@ # Include a fortune in a page package IkiWiki::Plugin::fortune; -use IkiWiki; use warnings; use strict; +use IkiWiki 2.00; sub import { #{{{ hook(type => "preprocess", id => "fortune", call => \&preprocess); diff --git a/IkiWiki/Plugin/goodstuff.pm b/IkiWiki/Plugin/goodstuff.pm index 384123f60..effbc7de9 100644 --- a/IkiWiki/Plugin/goodstuff.pm +++ b/IkiWiki/Plugin/goodstuff.pm @@ -4,7 +4,7 @@ package IkiWiki::Plugin::goodstuff; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; my @bundle=qw{ brokenlinks diff --git a/IkiWiki/Plugin/googlecalendar.pm b/IkiWiki/Plugin/googlecalendar.pm index 3f5102210..c6409e5e6 100644 --- a/IkiWiki/Plugin/googlecalendar.pm +++ b/IkiWiki/Plugin/googlecalendar.pm @@ -3,7 +3,7 @@ package IkiWiki::Plugin::googlecalendar; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "preprocess", id => "googlecalendar", diff --git a/IkiWiki/Plugin/graphviz.pm b/IkiWiki/Plugin/graphviz.pm index 48f520c4f..5d666e1be 100644 --- a/IkiWiki/Plugin/graphviz.pm +++ b/IkiWiki/Plugin/graphviz.pm @@ -5,7 +5,7 @@ package IkiWiki::Plugin::graphviz; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; use IPC::Open2; sub import { #{{{ diff --git a/IkiWiki/Plugin/haiku.pm b/IkiWiki/Plugin/haiku.pm index fe8a782fa..35208e56c 100644 --- a/IkiWiki/Plugin/haiku.pm +++ b/IkiWiki/Plugin/haiku.pm @@ -4,7 +4,7 @@ package IkiWiki::Plugin::haiku; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "preprocess", id => "haiku", call => \&preprocess); diff --git a/IkiWiki/Plugin/html.pm b/IkiWiki/Plugin/html.pm index fd40d5ad9..7623ba6a9 100644 --- a/IkiWiki/Plugin/html.pm +++ b/IkiWiki/Plugin/html.pm @@ -4,7 +4,7 @@ package IkiWiki::Plugin::html; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "htmlize", id => "html", call => \&htmlize); diff --git a/IkiWiki/Plugin/htmlscrubber.pm b/IkiWiki/Plugin/htmlscrubber.pm index ae3ec4456..c5b08f604 100644 --- a/IkiWiki/Plugin/htmlscrubber.pm +++ b/IkiWiki/Plugin/htmlscrubber.pm @@ -3,7 +3,7 @@ package IkiWiki::Plugin::htmlscrubber; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "sanitize", id => "htmlscrubber", call => \&sanitize); diff --git a/IkiWiki/Plugin/htmltidy.pm b/IkiWiki/Plugin/htmltidy.pm index 0609e72c3..cd5dc83ac 100644 --- a/IkiWiki/Plugin/htmltidy.pm +++ b/IkiWiki/Plugin/htmltidy.pm @@ -9,7 +9,7 @@ package IkiWiki::Plugin::htmltidy; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; use IPC::Open2; sub import { #{{{ diff --git a/IkiWiki/Plugin/httpauth.pm b/IkiWiki/Plugin/httpauth.pm index 786bcba3b..d28b6d2d0 100644 --- a/IkiWiki/Plugin/httpauth.pm +++ b/IkiWiki/Plugin/httpauth.pm @@ -4,7 +4,7 @@ package IkiWiki::Plugin::httpauth; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "auth", id => "httpauth", call => \&auth); diff --git a/IkiWiki/Plugin/img.pm b/IkiWiki/Plugin/img.pm index 8888b3a56..7226231a0 100644 --- a/IkiWiki/Plugin/img.pm +++ b/IkiWiki/Plugin/img.pm @@ -5,7 +5,7 @@ package IkiWiki::Plugin::img; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; my %imgdefaults; diff --git a/IkiWiki/Plugin/inline.pm b/IkiWiki/Plugin/inline.pm index 417eec8f3..3c029e001 100644 --- a/IkiWiki/Plugin/inline.pm +++ b/IkiWiki/Plugin/inline.pm @@ -4,7 +4,7 @@ package IkiWiki::Plugin::inline; use warnings; use strict; -use IkiWiki 1.00; +use IkiWiki 2.00; use URI; sub import { #{{{ @@ -88,7 +88,7 @@ sub preprocess_inline (@) { #{{{ my @list; foreach my $page (keys %pagesources) { next if $page eq $params{page}; - if (pagespec_match($page, $params{pages}, $params{page})) { + if (pagespec_match($page, $params{pages}, location => $params{page})) { push @list, $page; } } @@ -223,7 +223,7 @@ sub preprocess_inline (@) { #{{{ @list=@list[0..$params{feedshow} - 1]; } if (exists $params{feedpages}) { - @list=grep { pagespec_match($_, $params{feedpages}, $params{page}) } @list; + @list=grep { pagespec_match($_, $params{feedpages}, location => $params{page}) } @list; } if ($rss) { diff --git a/IkiWiki/Plugin/linkmap.pm b/IkiWiki/Plugin/linkmap.pm index 29a3339a6..62984d9b8 100644 --- a/IkiWiki/Plugin/linkmap.pm +++ b/IkiWiki/Plugin/linkmap.pm @@ -3,7 +3,7 @@ package IkiWiki::Plugin::linkmap; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; use IPC::Open2; sub import { #{{{ @@ -48,7 +48,7 @@ sub genmap ($) { #{{{ # Get all the items to map. my %mapitems = (); foreach my $item (keys %links) { - if (pagespec_match($item, $params{pages}, $params{page})) { + if (pagespec_match($item, $params{pages}, location => $params{page})) { $mapitems{$item}=urlto($item, $params{destpage}); } } diff --git a/IkiWiki/Plugin/lockedit.pm b/IkiWiki/Plugin/lockedit.pm index f204e72c0..13df5632f 100644 --- a/IkiWiki/Plugin/lockedit.pm +++ b/IkiWiki/Plugin/lockedit.pm @@ -3,7 +3,7 @@ package IkiWiki::Plugin::lockedit; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "canedit", id => "lockedit", call => \&canedit); @@ -20,7 +20,7 @@ sub canedit ($$) { #{{{ return undef if defined $user && IkiWiki::is_admin($user); foreach my $admin (@{$config{adminuser}}) { - if (pagespec_match($page, IkiWiki::userinfo_get($admin, "locked_pages"), "")) { + if (pagespec_match($page, IkiWiki::userinfo_get($admin, "locked_pages"))) { return sprintf(gettext("%s is locked by %s and cannot be edited"), htmllink("", "", $page, noimageinline => 1), IkiWiki::userlink($admin)); diff --git a/IkiWiki/Plugin/map.pm b/IkiWiki/Plugin/map.pm index 07b63cb70..5aa2852de 100644 --- a/IkiWiki/Plugin/map.pm +++ b/IkiWiki/Plugin/map.pm @@ -9,7 +9,7 @@ package IkiWiki::Plugin::map; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "preprocess", id => "map", call => \&preprocess); @@ -26,7 +26,7 @@ sub preprocess (@) { #{{{ # Get all the items to map. my @mapitems = (); foreach my $page (keys %links) { - if (pagespec_match($page, $params{pages}, $params{page})) { + if (pagespec_match($page, $params{pages}, location => $params{page})) { push @mapitems, $page; } } diff --git a/IkiWiki/Plugin/mdwn.pm b/IkiWiki/Plugin/mdwn.pm index c087f2b41..ca8898679 100644 --- a/IkiWiki/Plugin/mdwn.pm +++ b/IkiWiki/Plugin/mdwn.pm @@ -4,7 +4,7 @@ package IkiWiki::Plugin::mdwn; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "htmlize", id => "mdwn", call => \&htmlize); diff --git a/IkiWiki/Plugin/meta.pm b/IkiWiki/Plugin/meta.pm index e13f57978..18e28a196 100644 --- a/IkiWiki/Plugin/meta.pm +++ b/IkiWiki/Plugin/meta.pm @@ -4,7 +4,7 @@ package IkiWiki::Plugin::meta; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; my %meta; my %title; diff --git a/IkiWiki/Plugin/mirrorlist.pm b/IkiWiki/Plugin/mirrorlist.pm index 34a97cc0b..3997e6fef 100644 --- a/IkiWiki/Plugin/mirrorlist.pm +++ b/IkiWiki/Plugin/mirrorlist.pm @@ -3,7 +3,7 @@ package IkiWiki::Plugin::mirrorlist; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "pagetemplate", id => "mirrorlist", call => \&pagetemplate); diff --git a/IkiWiki/Plugin/more.pm b/IkiWiki/Plugin/more.pm index dae3728ba..6a34682ba 100644 --- a/IkiWiki/Plugin/more.pm +++ b/IkiWiki/Plugin/more.pm @@ -3,7 +3,7 @@ package IkiWiki::Plugin::more; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; my $linktext = gettext("more"); diff --git a/IkiWiki/Plugin/opendiscussion.pm b/IkiWiki/Plugin/opendiscussion.pm index 4b1a432b2..fd5c9673d 100644 --- a/IkiWiki/Plugin/opendiscussion.pm +++ b/IkiWiki/Plugin/opendiscussion.pm @@ -3,7 +3,7 @@ package IkiWiki::Plugin::opendiscussion; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "canedit", id => "opendiscussion", call => \&canedit); diff --git a/IkiWiki/Plugin/openid.pm b/IkiWiki/Plugin/openid.pm index 65b884814..34cd157f5 100644 --- a/IkiWiki/Plugin/openid.pm +++ b/IkiWiki/Plugin/openid.pm @@ -4,7 +4,7 @@ package IkiWiki::Plugin::openid; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "getopt", id => "openid", call => \&getopt); diff --git a/IkiWiki/Plugin/orphans.pm b/IkiWiki/Plugin/orphans.pm index 65d5e3e9b..3a0150d53 100644 --- a/IkiWiki/Plugin/orphans.pm +++ b/IkiWiki/Plugin/orphans.pm @@ -4,7 +4,7 @@ package IkiWiki::Plugin::orphans; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "preprocess", id => "orphans", call => \&preprocess); @@ -28,7 +28,7 @@ sub preprocess (@) { #{{{ my $discussion=gettext("discussion"); foreach my $page (keys %pagesources) { next if $linkedto{$page}; - next unless pagespec_match($page, $params{pages}, $params{page}); + next unless pagespec_match($page, $params{pages}, location => $params{page}); # If the page has a link to some other page, it's # indirectly linked to a page via that page's backlinks. next if grep { diff --git a/IkiWiki/Plugin/otl.pm b/IkiWiki/Plugin/otl.pm index 94a2b80f6..20291d7e5 100644 --- a/IkiWiki/Plugin/otl.pm +++ b/IkiWiki/Plugin/otl.pm @@ -4,7 +4,7 @@ package IkiWiki::Plugin::otl; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "filter", id => "otl", call => \&filter); diff --git a/IkiWiki/Plugin/pagecount.pm b/IkiWiki/Plugin/pagecount.pm index 313ffdff0..2c20ca195 100644 --- a/IkiWiki/Plugin/pagecount.pm +++ b/IkiWiki/Plugin/pagecount.pm @@ -3,7 +3,7 @@ package IkiWiki::Plugin::pagecount; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "preprocess", id => "pagecount", call => \&preprocess); @@ -21,7 +21,7 @@ sub preprocess (@) { #{{{ return $#pages+1 if $params{pages} eq "*"; # optimisation my $count=0; foreach my $page (@pages) { - $count++ if pagespec_match($page, $params{pages}, $params{page}); + $count++ if pagespec_match($page, $params{pages}, location => $params{page}); } return $count; } # }}} diff --git a/IkiWiki/Plugin/pagestats.pm b/IkiWiki/Plugin/pagestats.pm index 1edb39455..f6398c535 100644 --- a/IkiWiki/Plugin/pagestats.pm +++ b/IkiWiki/Plugin/pagestats.pm @@ -12,7 +12,7 @@ package IkiWiki::Plugin::pagestats; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; # Names of the HTML classes to use for the tag cloud our @classes = ('smallestPC', 'smallPC', 'normalPC', 'bigPC', 'biggestPC' ); @@ -33,7 +33,7 @@ sub preprocess (@) { #{{{ my %counts; my $max = 0; foreach my $page (keys %links) { - if (pagespec_match($page, $params{pages}, $params{page})) { + if (pagespec_match($page, $params{pages}, location => $params{page})) { use IkiWiki::Render; my @bl = IkiWiki::backlinks($page); $counts{$page} = scalar(@bl); diff --git a/IkiWiki/Plugin/passwordauth.pm b/IkiWiki/Plugin/passwordauth.pm index e0aa72a19..131b3a43e 100644 --- a/IkiWiki/Plugin/passwordauth.pm +++ b/IkiWiki/Plugin/passwordauth.pm @@ -4,7 +4,7 @@ package IkiWiki::Plugin::passwordauth; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "formbuilder_setup", id => "passwordauth", diff --git a/IkiWiki/Plugin/poll.pm b/IkiWiki/Plugin/poll.pm index 86ed4c840..63c93c62d 100644 --- a/IkiWiki/Plugin/poll.pm +++ b/IkiWiki/Plugin/poll.pm @@ -3,7 +3,7 @@ package IkiWiki::Plugin::poll; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "preprocess", id => "poll", call => \&preprocess); diff --git a/IkiWiki/Plugin/polygen.pm b/IkiWiki/Plugin/polygen.pm index 63f6bf5db..5208a44ec 100644 --- a/IkiWiki/Plugin/polygen.pm +++ b/IkiWiki/Plugin/polygen.pm @@ -7,7 +7,7 @@ package IkiWiki::Plugin::polygen; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; use File::Find; sub import { #{{{ diff --git a/IkiWiki/Plugin/postsparkline.pm b/IkiWiki/Plugin/postsparkline.pm index 2bc93088d..e4fe9c154 100644 --- a/IkiWiki/Plugin/postsparkline.pm +++ b/IkiWiki/Plugin/postsparkline.pm @@ -3,7 +3,7 @@ package IkiWiki::Plugin::postsparkline; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ IkiWiki::loadplugin('sparkline'); @@ -37,7 +37,7 @@ sub preprocess (@) { #{{{ my @list; foreach my $page (keys %pagesources) { next if $page eq $params{page}; - if (pagespec_match($page, $params{pages}, $params{page})) { + if (pagespec_match($page, $params{pages}, location => $params{page})) { push @list, $page; } } diff --git a/IkiWiki/Plugin/prettydate.pm b/IkiWiki/Plugin/prettydate.pm index 11bd69d3f..44ffb719e 100644 --- a/IkiWiki/Plugin/prettydate.pm +++ b/IkiWiki/Plugin/prettydate.pm @@ -1,6 +1,6 @@ #!/usr/bin/perl package IkiWiki::Plugin::prettydate; -use IkiWiki; +use IkiWiki 2.00; use warnings; no warnings 'redefine'; use strict; diff --git a/IkiWiki/Plugin/rawhtml.pm b/IkiWiki/Plugin/rawhtml.pm index 30e971514..011c3a862 100644 --- a/IkiWiki/Plugin/rawhtml.pm +++ b/IkiWiki/Plugin/rawhtml.pm @@ -4,7 +4,7 @@ package IkiWiki::Plugin::rawhtml; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ $config{wiki_file_prune_regexps} = [ grep { !m/\\\.x\?html\?\$/ } @{$config{wiki_file_prune_regexps}} ]; diff --git a/IkiWiki/Plugin/rst.pm b/IkiWiki/Plugin/rst.pm index afd60f668..1f4c8bf9e 100644 --- a/IkiWiki/Plugin/rst.pm +++ b/IkiWiki/Plugin/rst.pm @@ -18,7 +18,7 @@ package IkiWiki::Plugin::rst; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; use IPC::Open2; # Simple python script, maybe it should be implemented using an external script. diff --git a/IkiWiki/Plugin/search.pm b/IkiWiki/Plugin/search.pm index 61e9214e6..da818e5cf 100644 --- a/IkiWiki/Plugin/search.pm +++ b/IkiWiki/Plugin/search.pm @@ -4,7 +4,7 @@ package IkiWiki::Plugin::search; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "getopt", id => "hyperestraier", diff --git a/IkiWiki/Plugin/shortcut.pm b/IkiWiki/Plugin/shortcut.pm index 7b89bf879..28d0c7177 100644 --- a/IkiWiki/Plugin/shortcut.pm +++ b/IkiWiki/Plugin/shortcut.pm @@ -3,7 +3,7 @@ package IkiWiki::Plugin::shortcut; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "checkconfig", id => "shortcut", call => \&checkconfig); diff --git a/IkiWiki/Plugin/sidebar.pm b/IkiWiki/Plugin/sidebar.pm index da1f82b82..f0dd0ca03 100644 --- a/IkiWiki/Plugin/sidebar.pm +++ b/IkiWiki/Plugin/sidebar.pm @@ -6,7 +6,7 @@ package IkiWiki::Plugin::sidebar; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "pagetemplate", id => "sidebar", call => \&pagetemplate); diff --git a/IkiWiki/Plugin/signinedit.pm b/IkiWiki/Plugin/signinedit.pm index 04532f4dc..08932e2f6 100644 --- a/IkiWiki/Plugin/signinedit.pm +++ b/IkiWiki/Plugin/signinedit.pm @@ -3,7 +3,7 @@ package IkiWiki::Plugin::signinedit; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "canedit", id => "signinedit", call => \&canedit, diff --git a/IkiWiki/Plugin/skeleton.pm b/IkiWiki/Plugin/skeleton.pm index 8b51b1550..b8c327c9d 100644 --- a/IkiWiki/Plugin/skeleton.pm +++ b/IkiWiki/Plugin/skeleton.pm @@ -6,7 +6,7 @@ package IkiWiki::Plugin::skeleton; use warnings; use strict; -use IkiWiki '1.02'; +use IkiWiki 2.00; sub import { #{{{ hook(type => "getopt", id => "skeleton", call => \&getopt); diff --git a/IkiWiki/Plugin/smiley.pm b/IkiWiki/Plugin/smiley.pm index e85abbb85..1a9833e6e 100644 --- a/IkiWiki/Plugin/smiley.pm +++ b/IkiWiki/Plugin/smiley.pm @@ -3,7 +3,7 @@ package IkiWiki::Plugin::smiley; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; my %smileys; my $smiley_regexp; diff --git a/IkiWiki/Plugin/sparkline.pm b/IkiWiki/Plugin/sparkline.pm index 060368679..69b3512c2 100644 --- a/IkiWiki/Plugin/sparkline.pm +++ b/IkiWiki/Plugin/sparkline.pm @@ -3,7 +3,7 @@ package IkiWiki::Plugin::sparkline; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; use IPC::Open2; my $match_num=qr/[-+]?[0-9]+(?:\.[0-9]+)?/; diff --git a/IkiWiki/Plugin/table.pm b/IkiWiki/Plugin/table.pm index 2ed60ab46..698f9c9b6 100644 --- a/IkiWiki/Plugin/table.pm +++ b/IkiWiki/Plugin/table.pm @@ -3,8 +3,7 @@ package IkiWiki::Plugin::table; use warnings; use strict; - -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "preprocess", id => "table", call => \&preprocess); diff --git a/IkiWiki/Plugin/tag.pm b/IkiWiki/Plugin/tag.pm index 733d76f4e..48ed1a8f8 100644 --- a/IkiWiki/Plugin/tag.pm +++ b/IkiWiki/Plugin/tag.pm @@ -4,7 +4,7 @@ package IkiWiki::Plugin::tag; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; my %tags; diff --git a/IkiWiki/Plugin/template.pm b/IkiWiki/Plugin/template.pm index 690443558..b169f7e75 100644 --- a/IkiWiki/Plugin/template.pm +++ b/IkiWiki/Plugin/template.pm @@ -4,7 +4,7 @@ package IkiWiki::Plugin::template; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; use HTML::Template; use Encode; diff --git a/IkiWiki/Plugin/textile.pm b/IkiWiki/Plugin/textile.pm index ee8e88ed2..5de71bf6e 100644 --- a/IkiWiki/Plugin/textile.pm +++ b/IkiWiki/Plugin/textile.pm @@ -6,7 +6,7 @@ package IkiWiki::Plugin::textile; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "htmlize", id => "txtl", call => \&htmlize); diff --git a/IkiWiki/Plugin/toc.pm b/IkiWiki/Plugin/toc.pm index 279eef008..797bfc6bd 100644 --- a/IkiWiki/Plugin/toc.pm +++ b/IkiWiki/Plugin/toc.pm @@ -4,7 +4,7 @@ package IkiWiki::Plugin::toc; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; use HTML::Parser; sub import { #{{{ diff --git a/IkiWiki/Plugin/toggle.pm b/IkiWiki/Plugin/toggle.pm index 7318731c5..4a16ef32c 100644 --- a/IkiWiki/Plugin/toggle.pm +++ b/IkiWiki/Plugin/toggle.pm @@ -3,7 +3,7 @@ package IkiWiki::Plugin::toggle; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; # Here's the javascript that makes this possible. A key feature is the use # of css to hide toggleables, to avoid any flashing on page load. The css diff --git a/IkiWiki/Plugin/typography.pm b/IkiWiki/Plugin/typography.pm index 682dadab7..3b66ab0d0 100644 --- a/IkiWiki/Plugin/typography.pm +++ b/IkiWiki/Plugin/typography.pm @@ -4,7 +4,7 @@ package IkiWiki::Plugin::typography; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ IkiWiki::hook(type => "sanitize", id => "typography", call => \&sanitize); diff --git a/IkiWiki/Plugin/wikitext.pm b/IkiWiki/Plugin/wikitext.pm index 586be0874..e1d346ae6 100644 --- a/IkiWiki/Plugin/wikitext.pm +++ b/IkiWiki/Plugin/wikitext.pm @@ -4,7 +4,7 @@ package IkiWiki::Plugin::wikitext; use warnings; use strict; -use IkiWiki; +use IkiWiki 2.00; sub import { #{{{ hook(type => "htmlize", id => "wiki", call => \&htmlize); diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm index e77379a65..0b7e00d9d 100644 --- a/IkiWiki/Render.pm +++ b/IkiWiki/Render.pm @@ -365,7 +365,7 @@ sub refresh () { #{{{ foreach my $file (keys %rendered, @del) { next if $f eq $file; my $page=pagename($file); - if (pagespec_match($page, $depends{$p}, $p)) { + if (pagespec_match($page, $depends{$p}, location => $p)) { debug(sprintf(gettext("rendering %s, which depends on %s"), $f, $page)); render($f); $rendered{$f}=1; diff --git a/IkiWiki/UserInfo.pm b/IkiWiki/UserInfo.pm index 8bd056248..d0ef578c2 100644 --- a/IkiWiki/UserInfo.pm +++ b/IkiWiki/UserInfo.pm @@ -92,11 +92,8 @@ sub set_banned_users (@) { #{{{ return userinfo_store($userinfo); } #}}} -# Global used to pass information into the PageSpec function. -our $committer; - sub commit_notify_list ($@) { #{{{ - $committer=shift; + my $committer=shift; my @pages = map pagename($_), @_; my @ret; @@ -107,7 +104,9 @@ sub commit_notify_list ($@) { #{{{ length $userinfo->{$user}->{subscriptions} && exists $userinfo->{$user}->{email} && length $userinfo->{$user}->{email} && - grep { pagespec_match($_, $userinfo->{$user}->{subscriptions}, "") } + grep { pagespec_match($_, + $userinfo->{$user}->{subscriptions}, + user => $committer) } map pagename($_), @_) { push @ret, $userinfo->{$user}->{email}; } @@ -180,13 +179,4 @@ sub send_commit_mails ($$$@) { #{{{ } } #}}} -package IkiWiki::PageSpec; - -sub match_user ($$$) { #{{{ - shift; - my $user=shift; - - return $user eq $committer; -} #}}} - 1 diff --git a/debian/changelog b/debian/changelog index 2ebb385b8..739b76484 100644 --- a/debian/changelog +++ b/debian/changelog @@ -22,8 +22,15 @@ ikiwiki (1.51) UNRELEASED; urgency=low * Avoid .svn directories when installing from svn checkout. * Fix sending of commit mails when new pages are added via the web. * Add user(name) to the PageSpec for commit subscriptions. + * pagespec_match() has changed to take named parameters, to better allow + for extended pagespecs. The old calling convention will still work for + back-compat for now. + * The calling convention for functions in the IkiWiki::PageSpec namespace + has changed so they are passed named parameters. + * Plugin interface version increased to 2.00 since I don't anticipate any + more interface changes before 2.0. - -- Joey Hess Thu, 26 Apr 2007 20:25:53 -0400 + -- Joey Hess Thu, 26 Apr 2007 22:18:47 -0400 ikiwiki (1.50) unstable; urgency=low diff --git a/doc/plugins/write.mdwn b/doc/plugins/write.mdwn index 4dd057074..d9f25641d 100644 --- a/doc/plugins/write.mdwn +++ b/doc/plugins/write.mdwn @@ -20,6 +20,8 @@ being edited. ## Registering plugins All plugins should `use IkiWiki` to import the ikiwiki plugin interface. +It's a good idea to include the version number of the plugin interface that +your plugin expects: `use IkiWiki 2.00` Plugins should, when imported, call `hook()` to hook into ikiwiki's processing. The function uses named parameters, and use varies depending on @@ -316,12 +318,15 @@ page created from it. (Ie, it appends ".html".) Makes the specified page depend on the specified [[PageSpec]]. -#### `pagespec_match($$;$)` +#### `pagespec_match($$;@)` -Passed a page name, a [[PageSpec]], and the location the [[PageSpec]] should -be matched against, returns true if the [[PageSpec]] matches the page. (If -the third parameter is not passed, relative PageSpecs will match relative to -the top of the wiki.) +Passed a page name, and [[PageSpec]], returns true if the [[PageSpec]] +matches the page. + +Additional named parameters can be passed, to further limit the match. +The most often used is "location", which specifies the location the +PageSpec should match against. If not passed, relative PageSpecs will match +relative to the top of the wiki. #### `bestlink($$)` @@ -441,6 +446,6 @@ It's also possible to write plugins that add new functions to [[PageSpecs|PageSpec]]. Such a plugin should add a function to the IkiWiki::PageSpec package, that is named `match_foo`, where "foo()" is how it will be accessed in a [[PageSpec]]. The function will be passed -three parameters: The name of the page being matched, the thing to match -against, and the page that the matching is occuring on. It should return +two parameters: The name of the page being matched, and the thing to match +against. It may also be passed additional, named parameters. It should return true if the page matches. diff --git a/po/ikiwiki.pot b/po/ikiwiki.pot index 28d837cf3..64af1d2a9 100644 --- a/po/ikiwiki.pot +++ b/po/ikiwiki.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-04-26 20:28-0400\n" +"POT-Creation-Date: 2007-04-26 22:52-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -119,7 +119,7 @@ msgstr "" msgid "There are no broken links!" msgstr "" -#: ../IkiWiki/Plugin/conditional.pm:20 +#: ../IkiWiki/Plugin/conditional.pm:17 msgid "\"test\" and \"then\" parameters are required" msgstr "" @@ -397,23 +397,23 @@ msgstr "" msgid "failed to run php" msgstr "" -#: ../IkiWiki/Plugin/table.pm:22 +#: ../IkiWiki/Plugin/table.pm:21 msgid "cannot find file" msgstr "" -#: ../IkiWiki/Plugin/table.pm:45 +#: ../IkiWiki/Plugin/table.pm:44 msgid "unknown data format" msgstr "" -#: ../IkiWiki/Plugin/table.pm:53 +#: ../IkiWiki/Plugin/table.pm:52 msgid "empty data" msgstr "" -#: ../IkiWiki/Plugin/table.pm:73 +#: ../IkiWiki/Plugin/table.pm:72 msgid "Direct data download" msgstr "" -#: ../IkiWiki/Plugin/table.pm:106 +#: ../IkiWiki/Plugin/table.pm:105 #, perl-format msgid "parse fail at line %d: %s" msgstr "" @@ -513,7 +513,7 @@ msgstr "" #. translators: A list of one or more pages that were changed, #. translators: And the name of the user making the change. #. translators: This is used as the subject of a commit email. -#: ../IkiWiki/UserInfo.pm:146 +#: ../IkiWiki/UserInfo.pm:145 #, perl-format msgid "update of %s's %s by %s" msgstr "" diff --git a/t/pagespec_match.t b/t/pagespec_match.t index 09e9582d1..eac2395ed 100755 --- a/t/pagespec_match.t +++ b/t/pagespec_match.t @@ -1,29 +1,30 @@ #!/usr/bin/perl use warnings; use strict; -use Test::More tests => 46; +use Test::More tests => 49; BEGIN { use_ok("IkiWiki"); } -ok(pagespec_match("foo", "*", "")); -ok(pagespec_match("page", "?ag?", "")); -ok(! pagespec_match("page", "?a?g?", "")); -ok(pagespec_match("foo.png", "*.*", "")); -ok(! pagespec_match("foo", "*.*", "")); -ok(pagespec_match("foo", "foo or bar", ""), "simple list"); -ok(pagespec_match("bar", "foo or bar", ""), "simple list 2"); -ok(pagespec_match("foo", "f?? and !foz", "")); -ok(! pagespec_match("foo", "f?? and !foo", "")); -ok(! pagespec_match("foo", "* and !foo", "")); -ok(! pagespec_match("foo", "foo and !foo", "")); -ok(! pagespec_match("foo.png", "* and !*.*", "")); -ok(pagespec_match("foo", "(bar or ((meep and foo) or (baz or foo) or beep))", "")); -ok(! pagespec_match("a/foo", "foo", "a/b"), "nonrelative fail"); -ok(! pagespec_match("foo", "./*", "a/b"), "relative fail"); -ok(pagespec_match("a/foo", "./*", "a/b"), "relative"); -ok(pagespec_match("a/b/foo", "./*", "a/b"), "relative 2"); -ok(pagespec_match("foo", "./*", "a"), "relative toplevel"); -ok(pagespec_match("foo/bar", "*", "baz"), "absolute"); +ok(pagespec_match("foo", "*")); +ok(pagespec_match("page", "?ag?")); +ok(! pagespec_match("page", "?a?g?")); +ok(pagespec_match("foo.png", "*.*")); +ok(! pagespec_match("foo", "*.*")); +ok(pagespec_match("foo", "foo or bar"), "simple list"); +ok(pagespec_match("bar", "foo or bar"), "simple list 2"); +ok(pagespec_match("foo", "f?? and !foz")); +ok(! pagespec_match("foo", "f?? and !foo")); +ok(! pagespec_match("foo", "* and !foo")); +ok(! pagespec_match("foo", "foo and !foo")); +ok(! pagespec_match("foo.png", "* and !*.*")); +ok(pagespec_match("foo", "(bar or ((meep and foo) or (baz or foo) or beep))")); +ok(! pagespec_match("a/foo", "foo", location => "a/b"), "nonrelative fail"); +ok(! pagespec_match("foo", "./*", location => "a/b"), "relative fail"); +ok(pagespec_match("a/foo", "./*", location => "a/b"), "relative"); +ok(pagespec_match("a/b/foo", "./*", location => "a/b"), "relative 2"); +ok(pagespec_match("a/foo", "./*", "a/b"), "relative oldstyle call"); +ok(pagespec_match("foo", "./*", location => "a"), "relative toplevel"); +ok(pagespec_match("foo/bar", "*", location => "baz"), "absolute"); # The link and backlink stuff needs this. $config{userdir}=""; @@ -37,16 +38,16 @@ $links{"done"}=[]; $links{"examples/softwaresite/bugs/fails_to_frobnicate"}=[qw{done}]; $links{"examples/softwaresite/bugs/done"}=[]; -ok(pagespec_match("foo", "link(bar)", ""), "link"); -ok(! pagespec_match("foo", "link(quux)", ""), "failed link"); -ok(pagespec_match("bugs/foo", "link(done)", "bugs/done"), "link match to bestlink"); +ok(pagespec_match("foo", "link(bar)"), "link"); +ok(! pagespec_match("foo", "link(quux)"), "failed link"); +ok(pagespec_match("bugs/foo", "link(done)", location => "bugs/done"), "link match to bestlink"); ok(! pagespec_match("examples/softwaresite/bugs/done", "link(done)", - "bugs/done"), "link match to bestlink"); + location => "bugs/done"), "link match to bestlink"); ok(pagespec_match("examples/softwaresite/bugs/fails_to_frobnicate", - "link(./done)", "examples/softwaresite/bugs/done"), "link relative"); -ok(! pagespec_match("foo", "link(./bar)", "foo/bar"), "link relative fail"); -ok(pagespec_match("bar", "backlink(foo)", ""), "backlink"); -ok(! pagespec_match("quux", "backlink(foo)", ""), "failed backlink"); + "link(./done)", location => "examples/softwaresite/bugs/done"), "link relative"); +ok(! pagespec_match("foo", "link(./bar)", location => "foo/bar"), "link relative fail"); +ok(pagespec_match("bar", "backlink(foo)"), "backlink"); +ok(! pagespec_match("quux", "backlink(foo)"), "failed backlink"); $IkiWiki::pagectime{foo}=1154532692; # Wed Aug 2 11:26 EDT 2006 $IkiWiki::pagectime{bar}=1154532695; # after @@ -63,6 +64,9 @@ ok(! pagespec_match("foo", "creation_day(3)"), "other day"); ok(! pagespec_match("foo", "no_such_function(foo)"), "foo"); +ok(pagespec_match("foo", "foo and user(bar)", user => "bar"), "user"); +ok(! pagespec_match("foo", "foo and user(bar)", user => "baz"), "user fail"); + # old style globlists ok(pagespec_match("foo", "foo bar"), "simple list"); ok(pagespec_match("bar", "foo bar"), "simple list 2");