]> sipb.mit.edu Git - ikiwiki.git/blobdiff - IkiWiki/Render.pm
web commit by JoshTriplett: meta title
[ikiwiki.git] / IkiWiki / Render.pm
index 5b951df83255e40051f9bcc2f2e48ec2e05dc87d..d8bc5a9d90267d1357f5187ec9bc3420964030d5 100644 (file)
@@ -94,8 +94,13 @@ sub genpage ($$$) { #{{{
                $actions++;
        }
        if ($config{discussion}) {
-               $template->param(discussionlink => htmllink($page, $page, "Discussion", 1, 1));
-               $actions++;
+               my $discussionlink=gettext("discussion");
+               if ($page !~ /.*\/\Q$discussionlink\E$/ &&
+                  (length $config{cgiurl} ||
+                   exists $links{$page."/".$discussionlink})) {
+                       $template->param(discussionlink => htmllink($page, $page, gettext("Discussion"), 1, 1));
+                       $actions++;
+               }
        }
 
        if ($actions) {
@@ -155,9 +160,9 @@ sub scan ($) { #{{{
                        push @links, titlepage($2);
                }
                if ($config{discussion}) {
-                       # Discussion links are a special case since they're not in the
-                       # text of the page, but on its template.
-                       push @links, "$page/discussion";
+                       # Discussion links are a special case since they're
+                       # not in the text of the page, but on its template.
+                       push @links, $page."/".gettext("discussion");
                }
                $links{$page}=\@links;
                
@@ -190,10 +195,25 @@ sub render ($) { #{{{
                $oldpagemtime{$page}=time;
        }
        else {
-               my $content=readfile($srcfile, 1);
+               my $srcfd=readfile($srcfile, 1, 1);
                delete $depends{$file};
                will_render($file, $file, 1);
-               writefile($file, $config{destdir}, $content, 1);
+               my $destfd=writefile($file, $config{destdir}, undef, 1, 1);
+               my $blksize = 16384;
+               my ($len, $buf, $written);
+               while ($len = sysread $srcfd, $buf, $blksize) {
+                       if (! defined $len) {
+                               next if $! =~ /^Interrupted/;
+                               error("failed to read $srcfile: $!");
+                       }
+                       my $offset = 0;
+                       while ($len) {
+                               defined($written = syswrite OUT, $buf, $len, $offset)
+                                       or error("failed to write $file: $!");
+                               $len -= $written;
+                               $offset += $written;
+                       }
+               }
                $oldpagemtime{$file}=time;
        }
 } #}}}
@@ -213,17 +233,18 @@ sub refresh () { #{{{
        my %exists;
        my @files;
        eval q{use File::Find};
+       error($@) if $@;
        find({
                no_chdir => 1,
                wanted => sub {
                        $_=decode_utf8($_);
-                       if (/$config{wiki_file_prune_regexp}/) {
+                       if (file_pruned($_, $config{srcdir})) {
                                $File::Find::prune=1;
                        }
                        elsif (! -d $_ && ! -l $_) {
                                my ($f)=/$config{wiki_file_regexp}/; # untaint
                                if (! defined $f) {
-                                       warn("skipping bad filename $_\n");
+                                       warn(sprintf(gettext("skipping bad filename %s"), $_)."\n");
                                }
                                else {
                                        $f=~s/^\Q$config{srcdir}\E\/?//;
@@ -237,22 +258,25 @@ sub refresh () { #{{{
                no_chdir => 1,
                wanted => sub {
                        $_=decode_utf8($_);
-                       if (/$config{wiki_file_prune_regexp}/) {
+                       if (file_pruned($_, $config{underlaydir})) {
                                $File::Find::prune=1;
                        }
                        elsif (! -d $_ && ! -l $_) {
                                my ($f)=/$config{wiki_file_regexp}/; # untaint
                                if (! defined $f) {
-                                       warn("skipping bad filename $_\n");
+                                       warn(sprintf(gettext("skipping bad filename %s"), $_)."\n");
                                }
                                else {
-                                       # Don't add files that are in the
+                                       # Don't add pages that are in the
                                        # srcdir.
                                        $f=~s/^\Q$config{underlaydir}\E\/?//;
                                        if (! -e "$config{srcdir}/$f" && 
                                            ! -l "$config{srcdir}/$f") {
-                                               push @files, $f;
-                                               $exists{pagename($f)}=1;
+                                               my $page=pagename($f);
+                                               if (! $exists{$page}) {
+                                                       push @files, $f;
+                                                       $exists{$page}=1;
+                                               }
                                        }
                                }
                        }
@@ -265,10 +289,10 @@ sub refresh () { #{{{
        my @add;
        foreach my $file (@files) {
                my $page=pagename($file);
+               $pagesources{$page}=$file;
                if (! $oldpagemtime{$page}) {
                        push @add, $file;
                        $pagecase{lc $page}=$page;
-                       $pagesources{$page}=$file;
                        if ($config{getctime} && -e "$config{srcdir}/$file") {
                                $pagectime{$page}=rcs_getctime("$config{srcdir}/$file");
                        }
@@ -280,7 +304,7 @@ sub refresh () { #{{{
        my @del;
        foreach my $page (keys %oldpagemtime) {
                if (! $exists{$page}) {
-                       debug("removing old page $page");
+                       debug(sprintf(gettext("removing old page %s"), $page));
                        push @del, $pagesources{$page};
                        $links{$page}=[];
                        $renderedfiles{$page}=[];
@@ -299,7 +323,7 @@ sub refresh () { #{{{
                if (! exists $oldpagemtime{$page} ||
                    mtime(srcfile($file)) > $oldpagemtime{$page} ||
                    $forcerebuild{$page}) {
-                       debug("scanning $file");
+                       debug(sprintf(gettext("scanning %s"), $file));
                        push @changed, $file;
                        scan($file);
                }
@@ -308,7 +332,7 @@ sub refresh () { #{{{
 
        # render changed and new pages
        foreach my $file (@changed) {
-               debug("rendering $file");
+               debug(sprintf(gettext("rendering %s"), $file));
                render($file);
                $rendered{$file}=1;
        }
@@ -320,7 +344,7 @@ sub refresh () { #{{{
                        foreach my $page (keys %{$backlinks{$p}}) {
                                my $file=$pagesources{$page};
                                next if $rendered{$file};
-                               debug("rendering $file, which links to $p");
+                               debug(sprintf(gettext("rendering %s, which links to %s"), $file, $p));
                                render($file);
                                $rendered{$file}=1;
                        }
@@ -336,8 +360,8 @@ sub refresh () { #{{{
                                foreach my $file (keys %rendered, @del) {
                                        next if $f eq $file;
                                        my $page=pagename($file);
-                                       if (pagespec_match($page, $depends{$p})) {
-                                               debug("rendering $f, which depends on $page");
+                                       if (pagespec_match($page, $depends{$p}, $p)) {
+                                               debug(sprintf(gettext("rendering %s, which depends on %s"), $f, $page));
                                                render($f);
                                                $rendered{$f}=1;
                                                last;
@@ -375,7 +399,7 @@ sub refresh () { #{{{
                        my $linkfile=$pagesources{$link};
                        if (defined $linkfile) {
                                next if $rendered{$linkfile};
-                               debug("rendering $linkfile, to update its backlinks");
+                               debug(sprintf(gettext("rendering %s, to update its backlinks"), $linkfile));
                                render($linkfile);
                                $rendered{$linkfile}=1;
                        }
@@ -387,7 +411,7 @@ sub refresh () { #{{{
                my $page=pagename($src);
                foreach my $file (@{$oldrenderedfiles{$page}}) {
                        if (! grep { $_ eq $file } @{$renderedfiles{$page}}) {
-                               debug("removing $file, no longer rendered by $page");
+                               debug(sprintf(gettext("removing %s, no longer rendered by %s"), $file, $page));
                                prune($config{destdir}."/".$file);
                        }
                }
@@ -413,7 +437,7 @@ sub commandline_render () { #{{{
        $file=~s/\Q$config{srcdir}\E\/?//;
 
        my $type=pagetype($file);
-       die "ikiwiki: cannot render $srcfile\n" unless defined $type;
+       die sprintf(gettext("ikiwiki: cannot render %s"), $srcfile)."\n" unless defined $type;
        my $content=readfile($srcfile);
        my $page=pagename($file);
        $pagesources{$page}=$file;