]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki.pm
web commit by JoshTriplett
[ikiwiki.git] / IkiWiki.pm
index c272a294e9e912e6be2b7d6e5093795b069118bc..331300db067e41fde2f5a1547587bad8dea92a12 100644 (file)
@@ -6,11 +6,12 @@ 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
@@ -83,8 +84,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;
@@ -152,7 +151,7 @@ sub error ($;$) { #{{{
                print misctemplate(gettext("Error"),
                        "<p>".gettext("Error").": $message</p>");
        }
-       log_message(debug => $message) if $config{syslog};
+       log_message('err' => $message) if $config{syslog};
        if (defined $cleaner) {
                $cleaner->();
        }
@@ -177,7 +176,7 @@ sub log_message ($$) { #{{{
                }
                eval {
                        Sys::Syslog::syslog($type, "%s", join(" ", @_));
-               }
+               };
        }
        elsif (! $config{cgi}) {
                print "@_\n";
@@ -328,9 +327,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 ($$) { #{{{
@@ -430,8 +433,6 @@ 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(
@@ -455,7 +456,7 @@ sub urlto ($$) { #{{{
                return beautify_url(baseurl($from));
        }
 
-       if (! grep { $_ eq $to } map { @{$_} } values %renderedfiles) {
+       if (! $destsources{$to}) {
                $to=htmlpage($to);
        }
 
@@ -489,18 +490,19 @@ sub htmllink ($$$;@) { #{{{
        return "<span class=\"selflink\">$linktext</span>"
                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 "<span><a href=\"".
-                       cgiurl(
-                               do => "create",
-                               page => pagetitle(lc($link), 1),
-                               from => $lpage
-                       ).
-                       "\">?</a>$linktext</span>"
+
+               if (! $destsources{$bestlink}) {
+                       return $linktext unless length $config{cgiurl};
+                       return "<span><a href=\"".
+                               cgiurl(
+                                       do => "create",
+                                       page => pagetitle(lc($link), 1),
+                                       from => $lpage
+                               ).
+                               "\">?</a>$linktext</span>"
+               }
        }
        
        $bestlink=abs2rel($bestlink, dirname(htmlpage($page)));
@@ -549,8 +551,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;
@@ -717,6 +725,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;
@@ -1027,6 +1036,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);
        }