Files
xen/docs/gen-html-index
T
Ian Campbell d3900dea28 docs: fix documentation index for hypercalls
This was broken by 118104e5eaf2 "docs: Build docs for ARM as well as x86_64".

Move docs to hypercall/ARCH instead of hypercall-ARCH.

Support mulitple levels of subdirectories in gen-html-index tool.

This removes the need for a symlink hypercall->hypercall-x86_64 since there is
now a proper index at hypercall/index.html.

Update INDEX to human readable names for the architecture specific hypercalls.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
2013-09-17 17:03:54 +01:00

158 lines
2.9 KiB
Perl

#!/usr/bin/env perl
#
# Generate indexes for html documentation
#
use strict;
use warnings;
use Getopt::Long;
use IO::File;
use File::Basename;
Getopt::Long::Configure('bundling');
@ARGV >= 2 or die;
our @docs;
our @dirs;
our %index;
our $outdir;
GetOptions("i=s" => sub { read_index(@_);} )
or die;
($outdir,@docs) = @ARGV;
sub write_file ($$) {
my ($opath, $odata) = @_;
print STDOUT "Writing: $opath\n";
my $out = new IO::File "$opath.new", '>' or die "$opath $!";
print $out $odata or die $!;
rename "$opath.new", "$opath" or die "$opath $!";
}
sub make_page ($$$) {
my ($file,$title,$content) = @_;
my $o = '';
my $h1;
if ( $title eq "" )
{
$title = $h1 = "Xen Documentation";
}
else
{
$h1 = "<a href=\"../index.html\">Xen Documentation</a> - $title";
$title = "Xen Documentation - $title";
}
$o .= <<END;
<html><head><title>$title</title></head>
<body>
<h1>$h1</h1>
<ul>
$content
</ul>
</body></html>
END
write_file($file, $o);
}
sub make_linktext ($) {
my ($l) = @_;
return "$1($2)" if $l =~ m,^man/(.*)\.([0-9].*)\.html,;
$l =~ s/.(?:html|txt)$//g;
return $index{$l} if exists $index{$l};
return basename($l);
}
sub make_link ($$) {
my ($ref,$base) = @_;
my $txt = make_linktext($ref);
$ref =~ s,^$base/,, if $base; #/
return "<li><a href=\"$ref\">$txt</a></li>\n";
}
sub make_links ($@) {
my ($dir,@docs) = @_;
my $idx = '';
foreach my $of (sort { make_linktext($a) cmp make_linktext($b) } @docs) {
$idx .= make_link($of,$dir);
}
return $idx;
}
sub read_index ($$) {
my ($opt, $val) = @_;
my $idx = new IO::File "$val", '<' or die "$val $!";
while ($_ = $idx->getline()) {
s/^\s+//;
s/\s+$//;
next if m/^\#/;
next unless m/\S/;
m/^(\S+)\s+(\S.*)$/ or die;
$index{$1} = $2;
}
}
sub uniq (@) {
my %h;
foreach (@_) { $h{$_} = 1; }
return keys %h;
}
for (@docs) { s,^\Q$outdir\E/,, }
@docs = grep { -e "$outdir/$_" && (make_linktext($_) ne "NO-INDEX") } @docs;
my $top = '';
# Return a list of all directories leading to $path
sub dirs($)
{
my ($path) = @_;
my @dirs;
while ( $path =~ m,/, )
{
$path =~ m,/([^/]+)$,;
push @dirs, $`;#`
$path = $`;#`
}
return @dirs;
}
foreach my $od (sort { $a cmp $b } uniq map { dirs($_) } @docs) {
my @d = (grep /^\Q$od\E/, @docs);
if ( @d == 1 and $d[0] eq "$od/index.html" )
{
next if $d[0] =~ m,/,;#/ linked to from the subdirectory entry.
$top .= make_link("$od/index.html", 0);
}
else
{
my $links = make_links(undef,@d);
my $secttitle = make_linktext($od);
$top .= <<END;
<li><a href=\"${od}/index.html\">$secttitle</a></li>
<ul>
$links
</ul>
END
$links = make_links($od,@d);
my $idx = '';
$idx .= <<END;
<li>$secttitle</li>
<ul>
$links
</ul>
END
make_page("$outdir/$od/index.html", $secttitle, $idx);
}
}
make_page("$outdir/index.html", "", $top);