]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki.pm
Merge branch 'master' of ssh://git.ikiwiki.info/srv/git/ikiwiki.info
[git.ikiwiki.info.git] / IkiWiki.pm
index 2a3a84d9ae3586c529ae8e347f6c26107b15a413..66fea4369b1326903f0bce26ed019a288e12788e 100644 (file)
@@ -24,9 +24,9 @@ our @EXPORT = qw(hook debug error template htmlpage add_depends pagespec_match
                 inject
                  %config %links %pagestate %wikistate %renderedfiles
                  %pagesources %destsources);
-our $VERSION = 2.00; # plugin interface version, next is ikiwiki version
+our $VERSION = 3.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
+our $installdir=''; # INSTALLDIR_AUTOREPLACE done by Makefile, DNE
 
 # Optimisation.
 use Memoize;
@@ -100,7 +100,7 @@ sub getsetup () {
                type => "string",
                default => '',
                example => "/var/www/wiki/ikiwiki.cgi",
-               description => "cgi wrapper to generate",
+               description => "filename of cgi wrapper to generate",
                safe => 0, # file
                rebuild => 0,
        },
@@ -174,7 +174,7 @@ sub getsetup () {
        verbose => {
                type => "boolean",
                example => 1,
-               description => "display verbose messages when building?",
+               description => "display verbose messages?",
                safe => 1,
                rebuild => 0,
        },
@@ -194,7 +194,7 @@ sub getsetup () {
        },
        prefix_directives => {
                type => "boolean",
-               default => 0,
+               default => 1,
                description => "use '!'-prefixed preprocessor directives?",
                safe => 0, # changing requires manual transition
                rebuild => 1,
@@ -949,16 +949,16 @@ sub formattime ($;$) {
 sub beautify_urlpath ($) {
        my $url=shift;
 
-       if ($config{usedirs}) {
-               $url =~ s!/index.$config{htmlext}$!/!;
-       }
-
        # Ensure url is not an empty link, and if necessary,
        # add ./ to avoid colon confusion.
-       if ($url !~ /^\// && $url !~ /^\.\.\//) {
+       if ($url !~ /^\// && $url !~ /^\.\.?\//) {
                $url="./$url";
        }
 
+       if ($config{usedirs}) {
+               $url =~ s!/index.$config{htmlext}$!/!;
+       }
+
        return $url;
 }
 
@@ -1536,15 +1536,19 @@ sub run_hooks ($$) {
        my $sub=shift;
 
        if (exists $hooks{$type}) {
-               my @deferred;
+               my (@first, @middle, @last);
                foreach my $id (keys %{$hooks{$type}}) {
-                       if ($hooks{$type}{$id}{last}) {
-                               push @deferred, $id;
-                               next;
+                       if ($hooks{$type}{$id}{first}) {
+                               push @first, $id;
+                       }
+                       elsif ($hooks{$type}{$id}{last}) {
+                               push @last, $id;
+                       }
+                       else {
+                               push @middle, $id;
                        }
-                       $sub->($hooks{$type}{$id}{call});
                }
-               foreach my $id (@deferred) {
+               foreach my $id (@first, @middle, @last) {
                        $sub->($hooks{$type}{$id}{call});
                }
        }
@@ -1596,37 +1600,6 @@ sub rcs_receive () {
        $hooks{rcs}{rcs_receive}{call}->();
 }
 
-sub globlist_to_pagespec ($) {
-       my @globlist=split(' ', shift);
-
-       my (@spec, @skip);
-       foreach my $glob (@globlist) {
-               if ($glob=~/^!(.*)/) {
-                       push @skip, $glob;
-               }
-               else {
-                       push @spec, $glob;
-               }
-       }
-
-       my $spec=join(' or ', @spec);
-       if (@skip) {
-               my $skip=join(' and ', @skip);
-               if (length $spec) {
-                       $spec="$skip and ($spec)";
-               }
-               else {
-                       $spec=$skip;
-               }
-       }
-       return $spec;
-}
-
-sub is_globlist ($) {
-       my $s=shift;
-       return ( $s =~ /[^\s]+\s+([^\s]+)/ && $1 ne "and" && $1 ne "or" );
-}
-
 sub safequote ($) {
        my $s=shift;
        $s=~s/[{}]//g;
@@ -1685,7 +1658,7 @@ sub gettext {
 sub yesno ($) {
        my $val=shift;
 
-       return (defined $val && lc($val) eq gettext("yes"));
+       return (defined $val && (lc($val) eq gettext("yes") || lc($val) eq "yes" || $val eq "1"));
 }
 
 sub inject {
@@ -1718,26 +1691,12 @@ sub pagespec_merge ($$) {
        my $b=shift;
 
        return $a if $a eq $b;
-
-        # Support for old-style GlobLists.
-        if (is_globlist($a)) {
-                $a=globlist_to_pagespec($a);
-        }
-        if (is_globlist($b)) {
-                $b=globlist_to_pagespec($b);
-        }
-
        return "($a) or ($b)";
 }
 
 sub pagespec_translate ($) {
        my $spec=shift;
 
-       # Support for old-style GlobLists.
-       if (is_globlist($spec)) {
-               $spec=globlist_to_pagespec($spec);
-       }
-
        # Convert spec to perl code.
        my $code="";
        while ($spec=~m{
@@ -1770,7 +1729,7 @@ sub pagespec_translate ($) {
                                $code.="IkiWiki::PageSpec::match_$1(\$page, ".safequote($2).", \@_)";
                        }
                        else {
-                               $code.=' 0';
+                               $code.="IkiWiki::FailReason->new(".safequote(qq{unknown function in pagespec "$word"}).")";
                        }
                }
                else {
@@ -1779,7 +1738,7 @@ sub pagespec_translate ($) {
        }
 
        if (! length $code) {
-               $code=0;
+               $code="IkiWiki::FailReason->new('empty pagespec')";
        }
 
        no warnings;
@@ -1848,19 +1807,25 @@ sub new {
 
 package IkiWiki::PageSpec;
 
+sub derel ($$) {
+       my $path=shift;
+       my $from=shift;
+
+       if ($path =~ m!^\./!) {
+               $from=~s#/?[^/]+$## if defined $from;
+               $path=~s#^\./##;
+               $path="$from/$path" if length $from;
+       }
+
+       return $path;
+}
+
 sub match_glob ($$;@) {
        my $page=shift;
        my $glob=shift;
        my %params=@_;
        
-       my $from=exists $params{location} ? $params{location} : '';
-       
-       # relative matching
-       if ($glob =~ m!^\./!) {
-               $from=~s#/?[^/]+$##;
-               $glob=~s#^\./##;
-               $glob="$from/$glob" if length $from;
-       }
+       $glob=derel($glob, $params{location});
 
        my $regexp=IkiWiki::glob2re($glob);
        if ($page=~/^$regexp$/i) {
@@ -1885,15 +1850,9 @@ sub match_link ($$;@) {
        my $link=lc(shift);
        my %params=@_;
 
+       $link=derel($link, $params{location});
        my $from=exists $params{location} ? $params{location} : '';
 
-       # relative matching
-       if ($link =~ m!^\.! && defined $from) {
-               $from=~s#/?[^/]+$##;
-               $link=~s#^\./##;
-               $link="$from/$link" if length $from;
-       }
-
        my $links = $IkiWiki::links{$page};
        return IkiWiki::FailReason->new("$page has no links") unless $links && @{$links};
        my $bestlink = IkiWiki::bestlink($from, $link);
@@ -1921,6 +1880,9 @@ sub match_backlink ($$;@) {
 sub match_created_before ($$;@) {
        my $page=shift;
        my $testpage=shift;
+       my %params=@_;
+       
+       $testpage=derel($testpage, $params{location});
 
        if (exists $IkiWiki::pagectime{$testpage}) {
                if ($IkiWiki::pagectime{$page} < $IkiWiki::pagectime{$testpage}) {
@@ -1938,6 +1900,9 @@ sub match_created_before ($$;@) {
 sub match_created_after ($$;@) {
        my $page=shift;
        my $testpage=shift;
+       my %params=@_;
+       
+       $testpage=derel($testpage, $params{location});
 
        if (exists $IkiWiki::pagectime{$testpage}) {
                if ($IkiWiki::pagectime{$page} > $IkiWiki::pagectime{$testpage}) {