X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/25294defb814e6d4a53848c89a86e982bda1fc30..fa90bdf4bf44d108bd8c3d53104b48aa20dc18eb:/IkiWiki.pm diff --git a/IkiWiki.pm b/IkiWiki.pm index 6d89adddf..cdbcd2481 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 @@ -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 "$linktext" - 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 " "create", page => pagetitle(lc($link), 1), @@ -588,6 +602,9 @@ sub htmllink ($$$;@) { #{{{ if (defined $opts{rel}) { push @attrs, ' rel="'.$opts{rel}.'"'; } + if (defined $opts{class}) { + push @attrs, ' class="'.$opts{class}.'"'; + } return "$linktext"; } #}}} @@ -823,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($_); @@ -847,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]; @@ -857,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}); } @@ -874,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); @@ -903,7 +942,7 @@ sub template_params (@) { #{{{ my @ret=( filter => sub { my $text_ref = shift; - ${$text_ref} = Encode::decode_utf8(${$text_ref}); + ${$text_ref} = decode_utf8(${$text_ref}); }, filename => $filename, loop_context_vars => 1, @@ -1220,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); } }