#!/usr/bin/perl # Provides a list of broken links. package IkiWiki::Plugin::brokenlinks; use warnings; use strict; use IkiWiki 3.00; sub import { hook(type => "getsetup", id => "brokenlinks", call => \&getsetup); hook(type => "preprocess", id => "brokenlinks", call => \&preprocess); } sub getsetup { return plugin => { safe => 1, rebuild => undef, }, } sub preprocess (@) { my %params=@_; $params{pages}="*" unless defined $params{pages}; # Needs to update whenever a page is added or removed, so # register a dependency. add_depends($params{page}, $params{pages}); my %broken; foreach my $page (pagespec_match_list([keys %links], $params{pages}, location => $params{page})) { my $discussion=gettext("Discussion"); my %seen; foreach my $link (@{$links{$page}}) { next if $seen{$link}; $seen{$link}=1; next if $link =~ /.*\/\Q$discussion\E/i && $config{discussion}; my $bestlink=bestlink($page, $link); next if length $bestlink; push @{$broken{$link}}, $page; } } my @broken; foreach my $link (keys %broken) { my $page=$broken{$link}->[0]; push @broken, sprintf(gettext("%s from %s"), htmllink($page, $params{destpage}, $link, noimageinline => 1), join(", ", map { htmllink($params{page}, $params{destpage}, $_, noimageinline => 1) } @{$broken{$link}})); } return gettext("There are no broken links!") unless %broken; return "