X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/4a75dee651390b79ce4ceb1d951b02e28b3ce83a..f8f8770a652520b2f09eb2262510a04a8e353e9d:/IkiWiki.pm diff --git a/IkiWiki.pm b/IkiWiki.pm index 941ee13c4..f57ef8c6c 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -2388,7 +2388,7 @@ sub glob2re ($) { my $re=quotemeta(shift); $re=~s/\\\*/.*/g; $re=~s/\\\?/./g; - return $re; + return qr/^$re$/i; } package IkiWiki::FailReason; @@ -2482,6 +2482,8 @@ sub derel ($$) { return $path; } +my %glob_cache; + sub match_glob ($$;@) { my $page=shift; my $glob=shift; @@ -2489,8 +2491,13 @@ sub match_glob ($$;@) { $glob=derel($glob, $params{location}); - my $regexp=IkiWiki::glob2re($glob); - if ($page=~/^$regexp$/i) { + # Instead of converting the glob to a regex every time, + # cache the compiled regex to save time. + my $re=$glob_cache{$glob}; + unless (defined $re) { + $glob_cache{$glob} = $re = IkiWiki::glob2re($glob); + } + if ($page =~ $re) { if (! IkiWiki::isinternal($page) || $params{internal}) { return IkiWiki::SuccessReason->new("$glob matches $page"); } @@ -2608,11 +2615,12 @@ sub match_created_after ($$;@) { } sub match_creation_day ($$;@) { + my $page=shift; my $d=shift; if ($d !~ /^\d+$/) { - return IkiWiki::FailReason->new('invalid day'); + return IkiWiki::ErrorReason->new("invalid day $d"); } - if ((localtime($IkiWiki::pagectime{shift()}))[3] == shift) { + if ((localtime($IkiWiki::pagectime{$page}))[3] == $d) { return IkiWiki::SuccessReason->new('creation_day matched'); } else { @@ -2621,11 +2629,12 @@ sub match_creation_day ($$;@) { } sub match_creation_month ($$;@) { + my $page=shift; my $m=shift; if ($m !~ /^\d+$/) { - return IkiWiki::FailReason->new('invalid month'); + return IkiWiki::ErrorReason->new("invalid month $m"); } - if ((localtime($IkiWiki::pagectime{shift()}))[4] + 1 == shift) { + if ((localtime($IkiWiki::pagectime{$page}))[4] + 1 == $m) { return IkiWiki::SuccessReason->new('creation_month matched'); } else { @@ -2634,11 +2643,12 @@ sub match_creation_month ($$;@) { } sub match_creation_year ($$;@) { + my $page=shift; my $y=shift; if ($y !~ /^\d+$/) { - return IkiWiki::FailReason->new('invalid year'); + return IkiWiki::ErrorReason->new("invalid year $y"); } - if ((localtime($IkiWiki::pagectime{shift()}))[5] + 1900 == $y) { + if ((localtime($IkiWiki::pagectime{$page}))[5] + 1900 == $y) { return IkiWiki::SuccessReason->new('creation_year matched'); } else { @@ -2657,7 +2667,7 @@ sub match_user ($$;@) { return IkiWiki::ErrorReason->new("no user specified"); } - if (defined $params{user} && $params{user}=~/^$regexp$/i) { + if (defined $params{user} && $params{user}=~$regexp) { return IkiWiki::SuccessReason->new("user is $user"); } elsif (! defined $params{user}) {