]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki.pm
Merge branch 'master' of ssh://git.kitenet.net/srv/git/ikiwiki.info
[git.ikiwiki.info.git] / IkiWiki.pm
index 1c15e9299bd0774255b89eaf080b79e54af1a481..cdbcd2481948266d1cac838e0179db9a4fe0cfbb 100644 (file)
@@ -10,15 +10,16 @@ use POSIX;
 use open qw{:utf8 :std};
 
 use vars qw{%config %links %oldlinks %pagemtime %pagectime %pagecase
-            %renderedfiles %oldrenderedfiles %pagesources %destsources
-            %depends %hooks %forcerebuild $gettext_obj};
+           %pagestate %renderedfiles %oldrenderedfiles %pagesources
+           %destsources %depends %hooks %forcerebuild $gettext_obj};
 
 use Exporter q{import};
 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
                 add_underlay
-                 %config %links %renderedfiles %pagesources %destsources);
+                 %config %links %pagestate %renderedfiles
+                 %pagesources %destsources);
 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
@@ -39,7 +40,7 @@ sub defaultconfig () { #{{{
        wiki_link_regexp => qr{
                \[\[                    # beginning of link
                (?:
-                       ([^\]\|\n]+)    # 1: link text
+                       ([^\]\|\n\s]+)  # 1: link text
                        \|              # followed by '|'
                )?                      # optional
                
@@ -141,6 +142,10 @@ sub checkconfig () { #{{{
                require IkiWiki::Rcs::Stub;
        }
 
+       if (exists $config{umask}) {
+               umask(possibly_foolish_untaint($config{umask}));
+       }
+
        run_hooks(checkconfig => sub { shift->() });
 
        return 1;
@@ -407,6 +412,7 @@ sub bestlink ($$) { #{{{
                # absolute links
                $cwd="";
        }
+       $link=~s/\/$//;
 
        do {
                my $l=$cwd;
@@ -498,19 +504,24 @@ sub abs2rel ($$) { #{{{
        return $ret;
 } #}}}
 
-sub displaytime ($) { #{{{
+sub displaytime ($;$) { #{{{
        my $time=shift;
+       my $format=shift;
+       if (! defined $format) {
+               $format=$config{timeformat};
+       }
 
        # strftime doesn't know about encodings, so make sure
        # its output is properly treated as utf8
-       return decode_utf8(POSIX::strftime(
-                       $config{timeformat}, localtime($time)));
+       return decode_utf8(POSIX::strftime($format, localtime($time)));
 } #}}}
 
 sub beautify_url ($) { #{{{
        my $url=shift;
 
-       $url =~ s!/index.$config{htmlext}$!/!;
+       if ($config{usedirs}) {
+               $url =~ s!/index.$config{htmlext}$!/!;
+       }
        $url =~ s!^$!./!; # Browsers don't like empty links...
 
        return $url;
@@ -539,6 +550,8 @@ sub htmllink ($$$;@) { #{{{
        my $link=shift;
        my %opts=@_;
 
+       $link=~s/\/$//;
+
        my $bestlink;
        if (! $opts{forcesubpage}) {
                $bestlink=bestlink($lpage, $link);
@@ -556,14 +569,15 @@ sub htmllink ($$$;@) { #{{{
        }
        
        return "<span class=\"selflink\">$linktext</span>"
-               if length $bestlink && $page eq $bestlink;
+               if length $bestlink && $page eq $bestlink &&
+                  ! defined $opts{anchor};
        
        if (! $destsources{$bestlink}) {
                $bestlink=htmlpage($bestlink);
 
                if (! $destsources{$bestlink}) {
                        return $linktext unless length $config{cgiurl};
-                       return "<span><a href=\"".
+                       return "<span class=\"createlink\"><a href=\"".
                                cgiurl(
                                        do => "create",
                                        page => pagetitle(lc($link), 1),
@@ -826,6 +840,11 @@ sub enable_commit_hook () { #{{{
 } #}}}
 
 sub loadindex () { #{{{
+       %oldrenderedfiles=%pagectime=();
+       if (! $config{rebuild}) {
+               %pagesources=%pagemtime=%oldlinks=%links=%depends=
+                       %destsources=%renderedfiles=%pagecase=();
+       }
        open (my $in, "<", "$config{wikistatedir}/index") || return;
        while (<$in>) {
                $_=possibly_foolish_untaint($_);
@@ -850,6 +869,10 @@ sub loadindex () { #{{{
                        $destsources{$_}=$page foreach @{$items{dest}};
                        $renderedfiles{$page}=[@{$items{dest}}];
                        $pagecase{lc $page}=$page;
+                       foreach my $k (grep /_/, keys %items) {
+                               my ($id, $key)=split(/_/, $k, 2);
+                               $pagestate{$page}{decode_entities($id)}{decode_entities($key)}=$items{$k}[0];
+                       }
                }
                $oldrenderedfiles{$page}=[@{$items{dest}}];
                $pagectime{$page}=$items{ctime}[0];
@@ -860,6 +883,12 @@ sub loadindex () { #{{{
 sub saveindex () { #{{{
        run_hooks(savestate => sub { shift->() });
 
+       my %hookids;
+       foreach my $type (keys %hooks) {
+               $hookids{encode_entities($_)}=1 foreach keys %{$hooks{$type}};
+       }
+       my @hookids=sort keys %hookids;
+
        if (! -d $config{wikistatedir}) {
                mkdir($config{wikistatedir});
        }
@@ -877,6 +906,13 @@ sub saveindex () { #{{{
                if (exists $depends{$page}) {
                        $line.=" depends=".encode_entities($depends{$page}, " \t\n");
                }
+               if (exists $pagestate{$page}) {
+                       foreach my $id (@hookids) {
+                               foreach my $key (keys %{$pagestate{$page}{$id}}) {
+                                       $line.=' '.$id.'_'.encode_entities($key)."=".encode_entities($pagestate{$page}{$id}{$key});
+                               }
+                       }
+               }
                print $out $line."\n" || error("failed writing to $newfile: $!", $cleanup);
        }
        close $out || error("failed saving to $newfile: $!", $cleanup);
@@ -1223,7 +1259,7 @@ sub match_link ($$;@) { #{{{
                                if $bestlink eq IkiWiki::bestlink($page, $p);
                }
                else {
-                       return IkiWiki::SuccessReason->new("$page links to page matching $link")
+                       return IkiWiki::SuccessReason->new("$page links to page $p matching $link")
                                if match_glob($p, $link, %params);
                }
        }