]> git.vanrenterghem.biz Git - git.ikiwiki.info.git/blob - IkiWiki/Plugin/orphans.pm
* Add a googlecalendar plugin. A bit special-purpose, but it shows
[git.ikiwiki.info.git] / IkiWiki / Plugin / orphans.pm
1 #!/usr/bin/perl
2 # Provides a list of pages no other page links to.
3 package IkiWiki::Plugin::orphans;
5 use warnings;
6 use strict;
7 use IkiWiki;
9 sub import { #{{{
10         IkiWiki::hook(type => "preprocess", id => "orphans",
11                 call => \&preprocess);
12 } # }}}
14 sub preprocess (@) { #{{{
15         my %params=@_;
16         $params{pages}="*" unless defined $params{pages};
17         
18         # Needs to update whenever a page is added or removed, so
19         # register a dependency.
20         IkiWiki::add_depends($params{page}, $params{pages});
21         
22         my %linkedto;
23         foreach my $p (keys %IkiWiki::links) {
24                 map { $linkedto{IkiWiki::bestlink($p, $_)}=1 if length $_ }
25                         @{$IkiWiki::links{$p}};
26         }
27         
28         my @orphans;
29         foreach my $page (keys %IkiWiki::renderedfiles) {
30                 next if $linkedto{$page};
31                 next unless IkiWiki::pagespec_match($page, $params{pages});
32                 # If the page has a link to some other page, it's
33                 # indirectly linked to a page via that page's backlinks.
34                 next if grep { 
35                         length $_ &&
36                         ($_ !~ /\/Discussion$/i || ! $IkiWiki::config{discussion}) &&
37                         IkiWiki::bestlink($page, $_) !~ /^($page|)$/ 
38                 } @{$IkiWiki::links{$page}};
39                 push @orphans, $page;
40         }
41         
42         return "All pages are linked to by other pages." unless @orphans;
43         return "<ul>\n".join("\n", map { "<li>".IkiWiki::htmllink($params{page}, $params{destpage}, $_, 1)."</li>" } sort @orphans)."</ul>\n";
44 } # }}}
46 1