This file is indexed.

/usr/share/perl5/IkiWiki/Plugin/linkmap.pm is in ikiwiki 3.20160121.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/usr/bin/perl
package IkiWiki::Plugin::linkmap;

use warnings;
use strict;
use IkiWiki 3.00;
use IPC::Open2;
use HTML::Entities;

sub import {
	hook(type => "getsetup", id => "linkmap", call => \&getsetup);
	hook(type => "preprocess", id => "linkmap", call => \&preprocess);
}

sub getsetup () {
	return
		plugin => {
			safe => 1,
			rebuild => undef,
			section => "widget",
		},
}

my $mapnum=0;

sub pageescape {
	my $item = shift;
	# encoding explicitly in case ikiwiki is configured to accept <> or &
	# in file names
	my $title = pagetitle($item, 1);
	# it would not be necessary to encode *all* the html entities (<> would
	# be sufficient, &" probably a good idea), as dot accepts utf8, but it
	# isn't bad either
	$title = encode_entities($title);
	return("<$title>");
}

sub preprocess (@) {
	my %params=@_;

	$params{pages}="*" unless defined $params{pages};
	
	$mapnum++;
	my $connected=IkiWiki::yesno($params{connected});

	# Get all the items to map.
	my %mapitems = map { $_ => urlto($_, $params{destpage}) }
		pagespec_match_list($params{page}, $params{pages},
			# update when a page is added or removed, or its
			# links change
			deptype => deptype("presence", "links"));

	my $dest=$params{page}."/linkmap.png";

	# Use ikiwiki's function to create the file, this makes sure needed
	# subdirs are there and does some sanity checking.
	will_render($params{page}, $dest);
	writefile($dest, $config{destdir}, "");

	# Run dot to create the graphic and get the map data.
	my $pid;
	my $sigpipe=0;
	$SIG{PIPE}=sub { $sigpipe=1 };
	$pid=open2(*IN, *OUT, "dot -Tpng -o '$config{destdir}/$dest' -Tcmapx");
	
	# open2 doesn't respect "use open ':utf8'"
	binmode (IN, ':utf8'); 
	binmode (OUT, ':utf8'); 

	print OUT "digraph linkmap$mapnum {\n";
	print OUT "concentrate=true;\n";
	print OUT "charset=\"utf-8\";\n";
	print OUT "ratio=compress;\nsize=\"".($params{width}+0).", ".($params{height}+0)."\";\n"
		if defined $params{width} and defined $params{height};
	my %shown;
	my $show=sub {
		my $item=shift;
		if (! $shown{$item}) {
			print OUT pageescape($item)." [shape=box,href=\"$mapitems{$item}\"];\n";
			$shown{$item}=1;
		}
	};
	foreach my $item (keys %mapitems) {
		$show->($item) unless $connected;
		foreach my $link (map { bestlink($item, $_) } @{$links{$item}}) {
			next unless length $link and $mapitems{$link};
			foreach my $endpoint ($item, $link) {
				$show->($endpoint);
			}
			print OUT pageescape($item)." -> ".pageescape($link).";\n";
		}
	}
	print OUT "}\n";
	close OUT || error gettext("failed to run dot");

	local $/=undef;
	my $ret="<img src=\"".urlto($dest, $params{destpage}).
	       "\" alt=\"".gettext("linkmap").
	       "\" usemap=\"#linkmap$mapnum\" />\n".
	        <IN>;
	close IN || error gettext("failed to run dot");
	
	waitpid $pid, 0;
	if ($?) {
		error gettext("failed to run dot");
	}
	$SIG{PIPE}="DEFAULT";
	error gettext("failed to run dot") if $sigpipe;

	return $ret;
}

1