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
sub defaultconfig () { #{{{
wiki_file_prune_regexps => [qr/\.\./, qr/^\./, qr/\/\./,
qr/\.x?html?$/, qr/\.ikiwiki-new$/,
- qr/(^|\/).svn\//, qr/.arch-ids\//, qr/{arch}\//],
+ qr/(^|\/).svn\//, qr/.arch-ids\//, qr/{arch}\//,
+ qr/\.dpkg-tmp$/],
wiki_link_regexp => qr/\[\[(?:([^\]\|]+)\|)?([^\s\]#]+)(?:#([^\s\]]+))?\]\]/,
wiki_file_regexp => qr/(^[-[:alnum:]_.:\/+]+$)/,
web_commit_regexp => qr/^web commit (by (.*?(?=: |$))|from (\d+\.\d+\.\d+\.\d+)):?(.*)/,
$log_open=1;
}
eval {
- Sys::Syslog::syslog($type, "%s", join(" ", @_));
+ Sys::Syslog::syslog($type, "[$config{wikiname}] %s", join(" ", @_));
};
}
elsif (! $config{cgi}) {
}
} while $cwd=~s!/?[^/]+$!!;
- if (length $config{userdir} && exists $links{"$config{userdir}/".lc($link)}) {
- return "$config{userdir}/".lc($link);
+ if (length $config{userdir}) {
+ my $l = "$config{userdir}/".lc($link);
+ if (exists $links{$l}) {
+ return $l;
+ }
+ elsif (exists $pagecase{lc $l}) {
+ return $pagecase{lc $l};
+ }
}
#print STDERR "warning: page $page, broken link: $link\n";
}
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";
+ }
+
+ my $ret=eval pagespec_translate($spec);
+ return IkiWiki::FailReason->new("syntax error") if $@;
+ return $ret;
+} #}}}
+
+package IkiWiki::FailReason;
+
+use overload ( #{{{
+ '""' => sub { ${$_[0]} },
+ '0+' => sub { 0 },
+ '!' => sub { bless $_[0], 'IkiWiki::SuccessReason'},
+ fallback => 1,
+); #}}}
- return eval pagespec_translate($spec);
+sub new { #{{{
+ bless \$_[1], $_[0];
} #}}}
+package IkiWiki::SuccessReason;
+
+use overload ( #{{{
+ '""' => sub { ${$_[0]} },
+ '0+' => sub { 1 },
+ '!' => sub { bless $_[0], 'IkiWiki::FailReason'},
+ fallback => 1,
+); #}}}
+
+sub new { #{{{
+ bless \$_[1], $_[0];
+}; #}}}
+
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!/?[^/]+$!!;
$glob=~s/\\\*/.*/g;
$glob=~s/\\\?/./g;
- return $page=~/^$glob$/i;
+ if ($page=~/^$glob$/i) {
+ return IkiWiki::SuccessReason->new("$glob matches $page");
+ }
+ else {
+ return IkiWiki::FailReason->new("$glob does not match $page");
+ }
} #}}}
-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) {
}
my $links = $IkiWiki::links{$page} or return undef;
- return 0 unless @$links;
+ return IkiWiki::FailReason->new("$page has no links") unless @$links;
my $bestlink = IkiWiki::bestlink($from, $link);
- return 0 unless length $bestlink;
+ return IkiWiki::FailReason->new("no such link") unless length $bestlink;
foreach my $p (@$links) {
- return 1 if $bestlink eq IkiWiki::bestlink($page, $p);
+ return IkiWiki::SuccessReason->new("$page links to $link")
+ if $bestlink eq IkiWiki::bestlink($page, $p);
}
- return 0;
+ return IkiWiki::FailReason->new("$page does not link to $link");
} #}}}
-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;
if (exists $IkiWiki::pagectime{$testpage}) {
- return $IkiWiki::pagectime{$page} < $IkiWiki::pagectime{$testpage};
+ if ($IkiWiki::pagectime{$page} < $IkiWiki::pagectime{$testpage}) {
+ IkiWiki::SuccessReason->new("$page created before $testpage");
+ }
+ else {
+ IkiWiki::FailReason->new("$page not created before $testpage");
+ }
}
else {
- return 0;
+ return IkiWiki::FailReason->new("$testpage has no ctime");
}
} #}}}
-sub match_created_after ($$$) { #{{{
+sub match_created_after ($$;@) { #{{{
my $page=shift;
my $testpage=shift;
if (exists $IkiWiki::pagectime{$testpage}) {
- return $IkiWiki::pagectime{$page} > $IkiWiki::pagectime{$testpage};
+ if ($IkiWiki::pagectime{$page} > $IkiWiki::pagectime{$testpage}) {
+ IkiWiki::SuccessReason->new("$page created after $testpage");
+ }
+ else {
+ IkiWiki::FailReason->new("$page not created after $testpage");
+ }
}
else {
- return 0;
+ return IkiWiki::FailReason->new("$testpage has no ctime");
}
} #}}}
-sub match_creation_day ($$$) { #{{{
- return ((gmtime($IkiWiki::pagectime{shift()}))[3] == shift);
+sub match_creation_day ($$;@) { #{{{
+ if ((gmtime($IkiWiki::pagectime{shift()}))[3] == shift) {
+ return IkiWiki::SuccessReason->new("creation_day matched");
+ }
+ else {
+ return IkiWiki::FailReason->new("creation_day did not match");
+ }
} #}}}
-sub match_creation_month ($$$) { #{{{
- return ((gmtime($IkiWiki::pagectime{shift()}))[4] + 1 == shift);
+sub match_creation_month ($$;@) { #{{{
+ if ((gmtime($IkiWiki::pagectime{shift()}))[4] + 1 == shift) {
+ return IkiWiki::SuccessReason->new("creation_month matched");
+ }
+ else {
+ return IkiWiki::FailReason->new("creation_month did not match");
+ }
} #}}}
-sub match_creation_year ($$$) { #{{{
- return ((gmtime($IkiWiki::pagectime{shift()}))[5] + 1900 == shift);
+sub match_creation_year ($$;@) { #{{{
+ if ((gmtime($IkiWiki::pagectime{shift()}))[5] + 1900 == shift) {
+ return IkiWiki::SuccessReason->new("creation_year matched");
+ }
+ else {
+ return IkiWiki::FailReason->new("creation_year did not match");
+ }
+} #}}}
+
+sub match_user ($$;@) { #{{{
+ shift;
+ my $user=shift;
+ my %params=@_;
+
+ return IkiWiki::FailReason->new("cannot match user") unless exists $params{user};
+ if ($user eq $params{user}) {
+ return IkiWiki::SuccessReason->new("user is $user")
+ }
+ else {
+ return IkiWiki::FailReason->new("user is not $user");
+ }
} #}}}
1