summaryrefslogtreecommitdiff
path: root/doc/doc-docbook/TidyHTML-filter
blob: 70bb8652078f2e9c757b9005a959ea7973cc7c25 (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
#! /usr/bin/perl

# $Cambridge: exim/doc/doc-docbook/TidyHTML-filter,v 1.3 2006/02/01 11:01:01 ph10 Exp $

# Script to tidy up the filter HTML file that is generated by xmlto. The
# following changes are made:
#
# 1. Split very long lines.
# 2. Create reverse links from chapter and section titles back to the TOC.
# 3. Turn <div class="literallayout"><p> into <div class="literallayout"> and
#    a matching </p></div> into </div> to get rid of unwanted vertical white
#    space.


$tocref = 1;
$thisdiv = 0;

# Read in the filter.html file.

open(IN, "filter.html") || die "Failed to open filter.html for reading: $!\n";
@text = <IN>;
close(IN);

# Insert a newline after every > in the toc, because the whole toc is generated
# as one humungous line that is hard to check. Indeed, the start of the first
# chapter is also on the line, so we have to split if off first. Having
# inserted newlines, we split the toc into separate items in the vector.

for ($i = 0; $i < scalar(@text); $i++)
  {
  if ($text[$i] =~ ?<title>Exim's interfaces to mail filtering</title>?)
    {
    splice @text, $i, 1, (split /(?=<div class="chapter")/, $text[$i]);
    $text[$i] =~ s/>\s*/>\n/g;
    splice @text, $i, 1, (split /(?<=\n)/, $text[$i]);
    last;
    }
  }

# We want to create reverse links from each chapter and section title back to
# the relevant place in the TOC. Scan the TOC for the relevant entries. Add
# an id to each entry, and create tables that remember the new link ids. We
# detect the start of the TOC by <div class="toc" and the end of the TOC by
# <div class="chapter".

# Skip to start of TOC

for ($i = 0; $i < scalar(@text); $i++)
  {
  last if $text[$i] =~ /^<div class="toc"/;
  }

# Scan the TOC

for (; $i < scalar(@text); $i++)
  {
  last if $text[$i] =~ /^<div class="chapter"/;
  if ($text[$i] =~ /^<a href="(#[^"]+)">/)
    {
    my($ss) = $1;
    my($id) = sprintf "%04d", $tocref++;
    $text[$i] =~ s/<a/<a id="toc$id"/;
    $backref{"$ss"} = "toc$id";
    }
  }

# Scan remainder of the document

for (; $i < scalar(@text); $i++)
  {
  while ($text[$i] =~
      /^(.*)<a( xmlns="[^"]+")? id="([^"]+)"><\/a>(.*?)<\/h(.*)/)
    {
    my($ref) = $backref{"#$2"};
    $text[$i] = "$1<a$2 href=\"#$ref\" id=\"$3\">$4</a></h$5";
    }

  if ($text[$i] =~ /^(.*)<div class="literallayout"><p>(?:<br \/>)?(.*)/)
    {
    my($j);
    $text[$i] = "$1<div class=\"literallayout\">$2";

    for ($j = $i + 1; $j < scalar(@text); $j++)
      {
      if ($text[$j] =~ /^<\/p><\/div>/)
        {
        $text[$j] =~ s/<\/p>//;
        last;
        }
      }
    }
  }

# Write out the revised file

open(OUT, ">filter.html") || die "Failed to open filter.html for writing: $!\n";
print OUT @text;
close(OUT);

# End