summaryrefslogtreecommitdiff
path: root/IkiWiki/Render.pm
diff options
context:
space:
mode:
authorJoey Hess <joey@gnu.kitenet.net>2009-08-14 01:11:53 -0400
committerJoey Hess <joey@gnu.kitenet.net>2009-08-14 01:11:53 -0400
commit82bb3af579db809b884c7be5f49012469902bf52 (patch)
treefb0074bc0ce0bf1831846b1bc75b6323c5bc152d /IkiWiki/Render.pm
parentf486271009142ec7e04e1a62c1e94ad9e51b6d39 (diff)
optimise brokenlinks by gathering the data when calculating backlinks
During backlink calulation, all links are examined and broken links can be detected for free, so store a list of broken links and have brokenlinks use it. Exposing the %brokenlinks structure is a bit ugly, but the speedup seems worth it: Around 1 second for wikis the size of the doc wiki that use brokenlinks.
Diffstat (limited to 'IkiWiki/Render.pm')
-rw-r--r--IkiWiki/Render.pm23
1 files changed, 14 insertions, 9 deletions
diff --git a/IkiWiki/Render.pm b/IkiWiki/Render.pm
index d5e81f1b9..578142d2e 100644
--- a/IkiWiki/Render.pm
+++ b/IkiWiki/Render.pm
@@ -8,26 +8,31 @@ use IkiWiki;
use Encode;
my %backlinks;
-my $backlinks_calculated=0;
+our %brokenlinks;
+my $links_calculated=0;
-sub calculate_backlinks () {
- return if $backlinks_calculated;
- %backlinks=();
+sub calculate_links () {
+ return if $links_calculated;
+ %backlinks=%brokenlinks=();
foreach my $page (keys %links) {
foreach my $link (@{$links{$page}}) {
my $bestlink=bestlink($page, $link);
- if (length $bestlink && $bestlink ne $page) {
- $backlinks{$bestlink}{$page}=1;
+ if (length $bestlink) {
+ $backlinks{$bestlink}{$page}=1
+ if $bestlink ne $page;
+ }
+ else {
+ push @{$brokenlinks{$link}}, $page;
}
}
}
- $backlinks_calculated=1;
+ $links_calculated=1;
}
sub backlink_pages ($) {
my $page=shift;
- calculate_backlinks();
+ calculate_links();
return keys %{$backlinks{$page}};
}
@@ -416,7 +421,7 @@ sub refresh () {
debug(sprintf(gettext("scanning %s"), $file));
scan($file);
}
- calculate_backlinks();
+ calculate_links();
foreach my $file (@needsbuild) {
debug(sprintf(gettext("building %s"), $file));
render($file);