X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/3e17b7d6122c2b1cbfa90dc04b419635342e2b02..0f95adbd1d33e267b9654c80ef2d38ca06407ecb:/IkiWiki.pm diff --git a/IkiWiki.pm b/IkiWiki.pm index 81a634e2b..46060c1b2 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -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 "$linktext" - if length $bestlink && $page eq $bestlink; + if length $bestlink && $page eq $bestlink && + ! defined $opts{anchor}; if (! $destsources{$bestlink}) { $bestlink=htmlpage($bestlink); @@ -605,6 +613,8 @@ sub htmlize ($$$) { #{{{ my $page=shift; my $type=shift; my $content=shift; + + my $oneline = $content !~ /\n/; if (exists $hooks{htmlize}{$type}) { $content=$hooks{htmlize}{$type}{call}->( @@ -622,6 +632,14 @@ sub htmlize ($$$) { #{{{ content => $content, ); }); + + if ($oneline) { + # hack to get rid of enclosing junk added by markdown + # and other htmlizers + $content=~s/^

//i; + $content=~s/<\/p>$//i; + chomp $content; + } return $content; } #}}} @@ -672,7 +690,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 | @@ -715,12 +733,25 @@ sub preprocess ($$$;$$) { #{{{ $command, $page, $preprocessing{$page}). "]]"; } - my $ret=$hooks{preprocess}{$command}{call}->( - @params, - page => $page, - destpage => $destpage, - preview => $preprocess_preview, - ); + my $ret; + if (! $scan) { + $ret=$hooks{preprocess}{$command}{call}->( + @params, + page => $page, + destpage => $destpage, + preview => $preprocess_preview, + ); + } + else { + # use void context during scan pass + $hooks{preprocess}{$command}{call}->( + @params, + page => $page, + destpage => $destpage, + preview => $preprocess_preview, + ); + $ret=""; + } $preprocessing{$page}--; return $ret; } @@ -732,11 +763,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 +892,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 +906,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 +929,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 +1090,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 { #{{{