summaryrefslogtreecommitdiff
path: root/Master/tlpkg/bin/tl-update-docindex
blob: 102ba619227f8a531a66d345b6c9ad85ff063259 (plain)
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#!/usr/bin/env perl
# $Id$
# Make index file of all HTML and PDF documentation (printed on stdout).
# Originally written 2009, Manuel P\'egouri\'e-Gonnard. WTFPL v2.

BEGIN {
    $0 =~ m#(.*)/(.*)#; ($progdir, $progname) = ($1, $2);
    unshift @INC, "$progdir/..";
}

use warnings FATAL => 'all';
use Fatal qw(:void open close opendir closedir chdir mkdir);

use TeXLive::TLPDB;
use File::Basename;

exit(main());

sub main {
    my $tlpdb = TeXLive::TLPDB->new('root' => "$progdir/../..");
    die "$progname: unable to load TLPDB\n" unless defined $tlpdb;

    print <<END_HEADER;
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
 <title>TeX Live documentation</title>
 <style type="text/css"> ol { padding-left: 4em } </style>
</head>
<body>
<h1>TeX Live documentation</h1>

<p>This document lists links to all HTML and PDF files for packages and guides
contained in <a href="https://tug.org/texlive/">TeX Live</a>, sorted by
package name.</p>
END_HEADER

    print_all_pkg($tlpdb);

    # print footer
    chomp (my $date = `LC_ALL=C date`);
    print <<END_TRAILER;
<hr />
<small>Generated $date by $progname.</small>
</body></html>
END_TRAILER

    return 0;
}

# print the links for letters, then packages
sub print_all_pkg {
    my ($tlpdb) = @_;

    # @lines is the big list, @letters the list of initials of package names
    local (@lines, @letters, $current_letter, $n);
    $current_letter = "\0";

    # first build the output and the list of initials
    for my $tlpn (sort {lc $a cmp lc $b} $tlpdb->list_packages) {
        my $tlpkg = $tlpdb->get_package($tlpn);
        push_pkg_list($tlpkg);
    }
    push @lines, "\n</ol>\n\n";

    # then actually print them
    my $access = "\n<p>" . join(" - ", @letters) . "</p>\n";
    print $access;
    print @lines;
    print $access;
}

# push the content for a package to the list of lines
sub push_pkg_list {
    my ($tlpkg) = @_;
    my $name = $tlpkg->name;
    my @docfiles = $tlpkg->docfiles;

    # if no adequate documentation is found, print nothing
    @docfiles = grep { m/\.(html|pdf)/ } @docfiles;
    return if @docfiles == 0;
    $n++; # list counter

    # check initial
    my $init = uc substr $name, 0, 1;
    unless ($init eq $current_letter) {
        $current_letter = $init;
        # put header in the big list...
        push @lines, "\n</ol>\n" unless $n == 1;
        push @lines, qq#\n<h2 id="letter-$init">$init</h2>\n#;
        push @lines, qq#\n<ol start="$n">\n#;
        # ... and a reference in quick access list
        push @letters, qq!<a href="#letter-$init">$init</a>!;
    }

    # if there is an index.html file, drop the rest
    # currently (2009-10-07) catches: FAQ-en bosisio epspdf fontname jadetex
    # metapost ppower4 sttools tds tex4ht
    my @index = grep /\/index\.html/, @docfiles;
    if (@index == 1) {
        #warn "Using index.html for $name\n";
        @docfiles = @index;
    }

    # print package name with shortdesc
    my $dir = dirname($docfiles[0]);
    push @lines, qq#\n<li><b><a href="$dir">$name</a></b><small>\n#;
    push @lines, qq#(<a href="https://ctan.org/pkg/$name">CTAN</a>):\n#;
    my $shortdesc = $tlpkg->shortdesc;
    push @lines, "$shortdesc\n" if defined $shortdesc;
    #warn "$name\n" if not defined $shortdesc;

    # now the list of docfiles
    my $list;
    for my $file (@docfiles) {
        my $name = basename($file);
        $list .= qq#<a href="$file">$name</a>#;
        my $dflanguage = $tlpkg->{'docfiledata'}{$file}{'language'};
        $list .= "&nbsp;($dflanguage)&nbsp;"
                 if (defined $dflanguage && $dflanguage ne "en");
        $list .= "\n";
    }
    $list =~ s/(&nbsp;)?\n$/./;
    push @lines, "$list\n</small></li>\n";
}