X-Git-Url: https://sipb.mit.edu/gitweb.cgi/ikiwiki.git/blobdiff_plain/bbb0b3e72f6a3ffaac8343fc847800d7faaa7573..14fc12312d3ef58b2edd59ee804b2293f341944e:/IkiWiki.pm diff --git a/IkiWiki.pm b/IkiWiki.pm index a290b479a..5f0055d3e 100644 --- a/IkiWiki.pm +++ b/IkiWiki.pm @@ -6,19 +6,22 @@ use strict; use Encode; use HTML::Entities; use URI::Escape q{uri_escape_utf8}; +use POSIX; use open qw{:utf8 :std}; use vars qw{%config %links %oldlinks %pagemtime %pagectime %pagecase - %renderedfiles %oldrenderedfiles %pagesources %depends %hooks - %forcerebuild $gettext_obj}; + %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 - %config %links %renderedfiles %pagesources); + displaytime will_render gettext urlto targetpage + %config %links %renderedfiles %pagesources %destsources); our $VERSION = 1.02; # plugin interface version, next is ikiwiki version -our $version="1.45";my $installdir="/usr"; +our $version='unknown'; # VERSION_AUTOREPLACE done by Makefile, DNE +my $installdir=''; # INSTALLDIR_AUTOREPLACE done by Makefile, DNE + # Optimisation. use Memoize; memoize("abs2rel"); @@ -28,7 +31,8 @@ memoize("file_pruned"); sub defaultconfig () { #{{{ wiki_file_prune_regexps => [qr/\.\./, qr/^\./, qr/\/\./, qr/\.x?html?$/, qr/\.ikiwiki-new$/, - qr/(^|\/).svn\//, qr/.arch-ids\//, qr/{arch}\//], + qr/(^|\/).svn\//, qr/.arch-ids\//, qr/{arch}\//, + qr/\.dpkg-tmp$/], wiki_link_regexp => qr/\[\[(?:([^\]\|]+)\|)?([^\s\]#]+)(?:#([^\s\]]+))?\]\]/, wiki_file_regexp => qr/(^[-[:alnum:]_.:\/+]+$)/, web_commit_regexp => qr/^web commit (by (.*?(?=: |$))|from (\d+\.\d+\.\d+\.\d+)):?(.*)/, @@ -72,6 +76,8 @@ sub defaultconfig () { #{{{ sslcookie => 0, httpauth => 0, userdir => "", + usedirs => 0, + numbacklinks => 10, } #}}} sub checkconfig () { #{{{ @@ -81,8 +87,6 @@ sub checkconfig () { #{{{ delete $ENV{LC_ALL}; } if (defined $config{locale}) { - eval q{use POSIX}; - error($@) if $@; if (POSIX::setlocale(&POSIX::LC_ALL, $config{locale})) { $ENV{LANG}=$config{locale}; $gettext_obj=undef; @@ -150,7 +154,7 @@ sub error ($;$) { #{{{ print misctemplate(gettext("Error"), "

".gettext("Error").": $message

"); } - log_message(debug => $message) if $config{syslog}; + log_message('err' => $message) if $config{syslog}; if (defined $cleaner) { $cleaner->(); } @@ -175,7 +179,7 @@ sub log_message ($$) { #{{{ } eval { Sys::Syslog::syslog($type, "%s", join(" ", @_)); - } + }; } elsif (! $config{cgi}) { print "@_\n"; @@ -223,10 +227,21 @@ sub pagename ($) { #{{{ return $page; } #}}} -sub htmlpage ($) { #{{{ +sub targetpage ($$) { #{{{ my $page=shift; + my $ext=shift; + + if (! $config{usedirs} || $page =~ /^index$/ ) { + return $page.".".$ext; + } else { + return $page."/index.".$ext; + } +} #}}} - return $page.".html"; +sub htmlpage ($) { #{{{ + my $page=shift; + + return targetpage($page, "html"); } #}}} sub srcfile ($) { #{{{ @@ -234,7 +249,7 @@ sub srcfile ($) { #{{{ return "$config{srcdir}/$file" if -e "$config{srcdir}/$file"; return "$config{underlaydir}/$file" if -e "$config{underlaydir}/$file"; - error("internal error: $file cannot be found"); + error("internal error: $file cannot be found in $config{srcdir} or $config{underlaydir}"); } #}}} sub readfile ($;$$) { #{{{ @@ -315,9 +330,13 @@ sub will_render ($$;$) { #{{{ $renderedfiles{$page}=[$dest, grep { $_ ne $dest } @{$renderedfiles{$page}}]; } else { + foreach my $old (@{$renderedfiles{$page}}) { + delete $destsources{$old}; + } $renderedfiles{$page}=[$dest]; $cleared{$page}=1; } + $destsources{$dest}=$page; } #}}} sub bestlink ($$) { #{{{ @@ -395,6 +414,7 @@ sub baseurl (;$) { #{{{ return "$config{url}/" if ! defined $page; + $page=htmlpage($page); $page=~s/[^\/]+$//; $page=~s/[^\/]+\//..\//g; return $page; @@ -416,14 +436,38 @@ sub abs2rel ($$) { #{{{ sub displaytime ($) { #{{{ my $time=shift; - eval q{use POSIX}; - error($@) if $@; # 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))); } #}}} +sub beautify_url ($) { #{{{ + my $url=shift; + + $url =~ s!/index.html$!/!; + $url =~ s!^$!./!; # Browsers don't like empty links... + + return $url; +} #}}} + +sub urlto ($$) { #{{{ + my $to=shift; + my $from=shift; + + if (! length $to) { + return beautify_url(baseurl($from)); + } + + if (! $destsources{$to}) { + $to=htmlpage($to); + } + + my $link = abs2rel($to, dirname(htmlpage($from))); + + return beautify_url($link); +} #}}} + sub htmllink ($$$;@) { #{{{ my $lpage=shift; # the page doing the linking my $page=shift; # the page that will contain the link (different for inline) @@ -449,21 +493,23 @@ sub htmllink ($$$;@) { #{{{ return "$linktext" if length $bestlink && $page eq $bestlink; - if (! grep { $_ eq $bestlink } map { @{$_} } values %renderedfiles) { + if (! $destsources{$bestlink}) { $bestlink=htmlpage($bestlink); - } - if (! grep { $_ eq $bestlink } map { @{$_} } values %renderedfiles) { - return $linktext unless length $config{cgiurl}; - return " "create", - page => pagetitle(lc($link), 1), - from => $lpage - ). - "\">?$linktext" + + if (! $destsources{$bestlink}) { + return $linktext unless length $config{cgiurl}; + return " "create", + page => pagetitle(lc($link), 1), + from => $lpage + ). + "\">?$linktext" + } } - $bestlink=abs2rel($bestlink, dirname($page)); + $bestlink=abs2rel($bestlink, dirname(htmlpage($page))); + $bestlink=beautify_url($bestlink); if (! $opts{noimageinline} && isinlinableimage($bestlink)) { return "\"$linktext\""; @@ -508,8 +554,14 @@ sub linkify ($$$) { #{{{ $content =~ s{(\\?)$config{wiki_link_regexp}}{ defined $2 - ? ( $1 ? "[[$2|$3]]" : htmllink($lpage, $page, linkpage($3), anchor => $4, linktext => pagetitle($2))) - : ( $1 ? "[[$3]]" : htmllink($lpage, $page, linkpage($3), anchor => $4)) + ? ( $1 + ? "[[$2|$3".($4 ? "#$4" : "")."]]" + : htmllink($lpage, $page, linkpage($3), + anchor => $4, linktext => pagetitle($2))) + : ( $1 + ? "[[$3".($4 ? "#$4" : "")."]]" + : htmllink($lpage, $page, linkpage($3), + anchor => $4)) }eg; return $content; @@ -676,6 +728,7 @@ sub loadindex () { #{{{ $oldlinks{$page}=[@{$items{link}}]; $links{$page}=[@{$items{link}}]; $depends{$page}=$items{depends}[0] if exists $items{depends}; + $destsources{$_}=$page foreach @{$items{dest}}; $renderedfiles{$page}=[@{$items{dest}}]; $oldrenderedfiles{$page}=[@{$items{dest}}]; $pagecase{lc $page}=$page; @@ -986,6 +1039,7 @@ sub match_link ($$$) { #{{{ my $links = $IkiWiki::links{$page} or return undef; return 0 unless @$links; my $bestlink = IkiWiki::bestlink($from, $link); + return 0 unless length $bestlink; foreach my $p (@$links) { return 1 if $bestlink eq IkiWiki::bestlink($page, $p); }