]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blobdiff - IkiWiki.pm
web commit by http://ptecza.myopenid.com/: * Response
[git.ikiwiki.info.git] / IkiWiki.pm
index 81a634e2b185a4c1e32ac1539e90275777405d69..b0ac8bbb4a1457496294f0d9644f3399044af1ec 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
@@ -31,7 +32,7 @@ memoize("file_pruned");
 
 sub defaultconfig () { #{{{
        return
-       wiki_file_prune_regexps => [qr/\.\./, qr/^\./, qr/\/\./,
+       wiki_file_prune_regexps => [qr/(^|\/)\.\.(\/|$)/, qr/^\./, qr/\/\./,
                qr/\.x?html?$/, qr/\.ikiwiki-new$/,
                qr/(^|\/).svn\//, qr/.arch-ids\//, qr/{arch}\//,
                qr/(^|\/)_MTN\//,
@@ -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;
@@ -514,7 +519,9 @@ sub displaytime ($;$) { #{{{
 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;
@@ -562,7 +569,8 @@ 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);
@@ -672,7 +680,7 @@ sub preprocess ($$$;$$) { #{{{
                        # consider it significant.
                        my @params;
                        while ($params =~ m{
-                               (?:(\w+)=)?             # 1: named parameter key?
+                               (?:([-\w]+)=)?          # 1: named parameter key?
                                (?:
                                        """(.*?)"""     # 2: triple-quoted value
                                |
@@ -732,11 +740,11 @@ sub preprocess ($$$;$$) { #{{{
        $content =~ s{
                (\\?)           # 1: escape?
                \[\[            # directive open
-               (\w+)           # 2: command
+               ([-\w]+)        # 2: command
                \s+
                (               # 3: the parameters..
                        (?:
-                               (?:\w+=)?               # named parameter key?
+                               (?:[-\w]+=)?            # named parameter key?
                                (?:
                                        """.*?"""       # triple-quoted value
                                        |
@@ -861,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];
@@ -871,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});
        }
@@ -888,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);
@@ -1042,10 +1067,10 @@ sub file_pruned ($$) { #{{{
        require File::Spec;
        my $file=File::Spec->canonpath(shift);
        my $base=File::Spec->canonpath(shift);
-       $file =~ s#^\Q$base\E/*##;
+       $file =~ s#^\Q$base\E/+##;
 
        my $regexp='('.join('|', @{$config{wiki_file_prune_regexps}}).')';
-       return $file =~ m/$regexp/;
+       return $file =~ m/$regexp/ && $file ne $base;
 } #}}}
 
 sub gettext { #{{{