X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/5f162cfd344f6b75fa39a57be4b3d488cadd1535..e0d6d268bc20b772d30381444e6e37d774058ab1:/IkiWiki.pm diff --git a/IkiWiki.pm b/IkiWiki.pm index 2d692a978..b605ac370 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -65,7 +65,8 @@ sub defaultconfig () { #{{{ setup => undef, adminuser => undef, adminemail => undef, - plugin => [qw{mdwn inline htmlscrubber passwordauth signinedit lockedit}], + plugin => [qw{mdwn inline htmlscrubber passwordauth signinedit + lockedit conditional}], timeformat => '%c', locale => undef, sslcookie => 0, @@ -231,9 +232,10 @@ sub srcfile ($) { #{{{ error("internal error: $file cannot be found"); } #}}} -sub readfile ($;$) { #{{{ +sub readfile ($;$$) { #{{{ my $file=shift; my $binary=shift; + my $wantfd=shift; if (-l $file) { error("cannot read a symlink ($file)"); @@ -242,16 +244,18 @@ sub readfile ($;$) { #{{{ local $/=undef; open (IN, $file) || error("failed to read $file: $!"); binmode(IN) if ($binary); + return \*IN if $wantfd; my $ret=; close IN; return $ret; } #}}} -sub writefile ($$$;$) { #{{{ +sub writefile ($$$;$$) { #{{{ my $file=shift; # can include subdirs my $destdir=shift; # directory to put file in my $content=shift; my $binary=shift; + my $wantfd=shift; my $test=$file; while (length $test) { @@ -274,6 +278,7 @@ sub writefile ($$$;$) { #{{{ open (OUT, ">$destdir/$file") || error("failed to write $destdir/$file: $!"); binmode(OUT) if ($binary); + return \*OUT if $wantfd; print OUT $content; close OUT; } #}}} @@ -846,27 +851,46 @@ sub pagespec_translate ($) { #{{{ elsif ($word eq "(" || $word eq ")" || $word eq "!") { $code.=" ".$word; } - elsif ($word =~ /^(link|backlink|created_before|created_after|creation_month|creation_year|creation_day)\((.+)\)$/) { - $code.=" match_$1(\$page, ".safequote($2).")"; + elsif ($word =~ /^(\w+)\((.*)\)$/) { + if (exists $IkiWiki::PageSpec::{"match_$1"}) { + $code.=" IkiWiki::PageSpec::match_$1(\$page, ".safequote($2).")"; + } + else { + $code.=" 0"; + } } else { - $code.=" match_glob(\$page, ".safequote($word).")"; + $code.=" IkiWiki::PageSpec::match_glob(\$page, ".safequote($word).", \$from)"; } } return $code; } #}}} -sub pagespec_match ($$) { #{{{ +sub pagespec_match ($$;$) { #{{{ my $page=shift; my $spec=shift; + my $from=shift; return eval pagespec_translate($spec); } #}}} -sub match_glob ($$) { #{{{ +package IkiWiki::PageSpec; + +sub match_glob ($$$) { #{{{ my $page=shift; my $glob=shift; + my $from=shift; + if (! defined $from){ + $from = ""; + } + + # relative matching + if ($glob =~ m!^\./!) { + $from=~s!/?[^/]+$!!; + $glob=~s!^\./!!; + $glob="$from/$glob" if length $from; + } # turn glob into safe regexp $glob=quotemeta($glob); @@ -880,7 +904,7 @@ sub match_link ($$) { #{{{ my $page=shift; my $link=lc(shift); - my $links = $links{$page} or return undef; + my $links = $IkiWiki::links{$page} or return undef; foreach my $p (@$links) { return 1 if lc $p eq $link; } @@ -895,8 +919,8 @@ sub match_created_before ($$) { #{{{ my $page=shift; my $testpage=shift; - if (exists $pagectime{$testpage}) { - return $pagectime{$page} < $pagectime{$testpage}; + if (exists $IkiWiki::pagectime{$testpage}) { + return $IkiWiki::pagectime{$page} < $IkiWiki::pagectime{$testpage}; } else { return 0; @@ -907,8 +931,8 @@ sub match_created_after ($$) { #{{{ my $page=shift; my $testpage=shift; - if (exists $pagectime{$testpage}) { - return $pagectime{$page} > $pagectime{$testpage}; + if (exists $IkiWiki::pagectime{$testpage}) { + return $IkiWiki::pagectime{$page} > $IkiWiki::pagectime{$testpage}; } else { return 0; @@ -916,15 +940,15 @@ sub match_created_after ($$) { #{{{ } #}}} sub match_creation_day ($$) { #{{{ - return ((gmtime($pagectime{shift()}))[3] == shift); + return ((gmtime($IkiWiki::pagectime{shift()}))[3] == shift); } #}}} sub match_creation_month ($$) { #{{{ - return ((gmtime($pagectime{shift()}))[4] + 1 == shift); + return ((gmtime($IkiWiki::pagectime{shift()}))[4] + 1 == shift); } #}}} sub match_creation_year ($$) { #{{{ - return ((gmtime($pagectime{shift()}))[5] + 1900 == shift); + return ((gmtime($IkiWiki::pagectime{shift()}))[5] + 1900 == shift); } #}}} 1