X-Git-Url: http://git.vanrenterghem.biz/git.ikiwiki.info.git/blobdiff_plain/0bfc364a7df124509855b8ed0b1b33ab5bc9ebbb..17a89d3d19f3a04ca2686ff18df127e5afaf9577:/IkiWiki.pm diff --git a/IkiWiki.pm b/IkiWiki.pm index 74d452c50..dbf50feb4 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -12,19 +12,20 @@ use Storable; use open qw{:utf8 :std}; use vars qw{%config %links %oldlinks %pagemtime %pagectime %pagecase - %pagestate %wikistate %renderedfiles %oldrenderedfiles - %pagesources %destsources %depends %depends_simple %hooks - %forcerebuild %loaded_plugins %typedlinks %oldtypedlinks}; + %pagestate %wikistate %renderedfiles %oldrenderedfiles + %pagesources %destsources %depends %depends_simple %hooks + %forcerebuild %loaded_plugins %typedlinks %oldtypedlinks + %autofiles}; use Exporter q{import}; our @EXPORT = qw(hook debug error template htmlpage deptype - add_depends pagespec_match pagespec_match_list bestlink - htmllink readfile writefile pagetype srcfile pagename - displaytime will_render gettext ngettext urlto targetpage - add_underlay pagetitle titlepage linkpage newpagefile - inject add_link - %config %links %pagestate %wikistate %renderedfiles - %pagesources %destsources %typedlinks); + add_depends pagespec_match pagespec_match_list bestlink + htmllink readfile writefile pagetype srcfile pagename + displaytime will_render gettext ngettext urlto targetpage + add_underlay pagetitle titlepage linkpage newpagefile + inject add_link add_autofile + %config %links %pagestate %wikistate %renderedfiles + %pagesources %destsources %typedlinks); our $VERSION = 3.00; # plugin interface version, next is ikiwiki version our $version='unknown'; # VERSION_AUTOREPLACE done by Makefile, DNE our $installdir='/usr'; # INSTALLDIR_AUTOREPLACE done by Makefile, DNE @@ -355,7 +356,7 @@ sub getsetup () { }, wiki_file_prune_regexps => { type => "internal", - default => [qr/(^|\/)\.\.(\/|$)/, qr/^\./, qr/\/\./, + default => [qr/(^|\/)\.\.(\/|$)/, qr/^\//, qr/^\./, qr/\/\./, qr/\.x?html?$/, qr/\.ikiwiki-new$/, qr/(^|\/).svn\//, qr/.arch-ids\//, qr/{arch}\//, qr/(^|\/)_MTN\//, qr/(^|\/)_darcs\//, @@ -440,10 +441,9 @@ sub getsetup () { safe => 0, rebuild => 0, }, - getctime => { + gettime => { type => "internal", - default => 0, - description => "running in getctime mode", + description => "running in gettime mode", safe => 0, rebuild => 0, }, @@ -1087,14 +1087,16 @@ sub htmllink ($$$;@) { $bestlink=htmlpage($bestlink); if (! $destsources{$bestlink}) { - return $linktext unless length $config{cgiurl}; - return " "create", - page => lc($link), - from => $lpage - ). - "\" rel=\"nofollow\">?$linktext" + my $cgilink = ""; + if (length $config{cgiurl}) { + $cgilink = " "create", + page => lc($link), + from => $lpage + )."\" rel=\"nofollow\">?"; + } + return "$cgilink$linktext" } } @@ -1512,6 +1514,7 @@ sub loadindex () { open ($in, "<", "$config{wikistatedir}/indexdb") || return; } else { + $config{gettime}=1; # first build return; } } @@ -1790,6 +1793,10 @@ sub rcs_getctime ($) { $hooks{rcs}{rcs_getctime}{call}->(@_); } +sub rcs_getmtime ($) { + $hooks{rcs}{rcs_getmtime}{call}->(@_); +} + sub rcs_receive () { $hooks{rcs}{rcs_receive}{call}->(); } @@ -1839,15 +1846,8 @@ sub deptype (@) { } my $file_prune_regexp; -sub file_pruned ($;$) { +sub file_pruned ($) { my $file=shift; - if (@_) { - require File::Spec; - $file=File::Spec->canonpath($file); - my $base=File::Spec->canonpath(shift); - return if $file eq $base; - $file =~ s#^\Q$base\E/+##; - } if (defined $config{include} && length $config{include}) { return 0 if $file =~ m/$config{include}/; @@ -1886,7 +1886,7 @@ sub define_gettext () { return shift; } }; - *ngettext=sub { + *ngettext=sub { $getobj->() if $getobj; if ($gettext_obj) { $gettext_obj->nget(@_); @@ -1951,6 +1951,15 @@ sub add_link ($$;$) { } } +sub add_autofile ($$$) { + my $file=shift; + my $plugin=shift; + my $generator=shift; + + $autofiles{$file}{plugin}=$plugin; + $autofiles{$file}{generator}=$generator; +} + sub sortspec_translate ($$) { my $spec = shift; my $reverse = shift; @@ -2102,6 +2111,8 @@ sub pagespec_match_list ($$;@) { my $sub=pagespec_translate($pagespec); error "syntax error in pagespec \"$pagespec\"" if ! defined $sub; + my $sort=sortspec_translate($params{sort}, $params{reverse}) + if defined $params{sort}; my @candidates; if (exists $params{list}) { @@ -2115,21 +2126,18 @@ sub pagespec_match_list ($$;@) { : keys %pagesources; } + # clear params, remainder is passed to pagespec + $depends{$page}{$pagespec} |= ($params{deptype} || $DEPEND_CONTENT); my $num=$params{num}; - my $sort=$params{sort}; - my $reverse=$params{reverse}; + delete @params{qw{num deptype reverse sort filter list}}; + # when only the top matches will be returned, it's efficient to # sort before matching to pagespec, if (defined $num && defined $sort) { @candidates=IkiWiki::SortSpec::sort_pages( - $sort, $reverse, @candidates); + $sort, @candidates); } - $depends{$page}{$pagespec} |= ($params{deptype} || $DEPEND_CONTENT); - - # clear params, remainder is passed to pagespec - delete @params{qw{num deptype reverse sort filter list}}; - my @matches; my $firstfail; my $count=0; @@ -2155,7 +2163,7 @@ sub pagespec_match_list ($$;@) { # sort after matching if (! defined $num && defined $sort) { return IkiWiki::SortSpec::sort_pages( - $sort, $reverse, @matches); + $sort, @matches); } else { return @matches; @@ -2247,7 +2255,7 @@ sub derel ($$) { if ($path =~ m!^\./!) { $from=~s#/?[^/]+$## if defined $from; $path=~s#^\./##; - $path="$from/$path" if length $from; + $path="$from/$path" if defined $from && length $from; } return $path; @@ -2452,7 +2460,7 @@ package IkiWiki::SortSpec; # This is in the SortSpec namespace so that the $a and $b that sort() uses # are easily available in this namespace, for cmp functions to use them. sub sort_pages { - my $f=IkiWiki::sortspec_translate(shift, shift); + my $f=shift; sort $f @_ }