* --getctime had bitrotted (well I only ever used it the once so far..),
[ikiwiki.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;
4
5 use warnings;
6 use strict;
7 use IkiWiki;
8
9 sub import { #{{{
10         IkiWiki::hook(type => "preprocess", id => "orphans",
11                 call => \&preprocess);
12 } # }}}
13
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::globlist_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 { length $_ && ($_ !~/\/Discussion$/i || ! $IkiWiki::config{discussion}) && IkiWiki::bestlink($page, $_) ne $page } @{$IkiWiki::links{$page}};
35                 push @orphans, $page;
36         }
37         
38         return "All pages are linked to by other pages." unless @orphans;
39         return "<ul>\n".join("\n", map { "<li>".IkiWiki::htmllink($params{page}, $params{page}, $_, 1)."</li>" } sort @orphans)."</ul>\n";
40 } # }}}
41
42 1