chiark / gitweb /
Commit upstream pcre-8.39.tar.bz2
[pcre3.git] / CleanTxt
1 #! /usr/bin/perl -w
2
3 # Script to take the output of nroff -man and remove all the backspacing and
4 # the page footers and the screen commands etc so that it is more usefully
5 # readable online. In fact, in the latest nroff, intermediate footers don't
6 # seem to be generated any more.
7
8 $blankcount = 0;
9 $lastwascut = 0;
10 $firstheader = 1;
11
12 # Input on STDIN; output to STDOUT.
13
14 while (<STDIN>)
15   {
16   s/\x1b\[\d+m//g;   # Remove screen controls "ESC [ number m"
17   s/.\x8//g;         # Remove "char, backspace"
18
19   # Handle header lines. Retain only the first one we encounter, but remove
20   # the blank line that follows. Any others (e.g. at end of document) and the
21   # following blank line are dropped.
22
23   if (/^PCRE(\w*)\(([13])\)\s+PCRE\1\(\2\)$/)
24     {
25     if ($firstheader)
26       {
27       $firstheader = 0;
28       print;
29       $lastprinted = $_;
30       $lastwascut = 0;
31       }
32     $_=<STDIN>;       # Remove a blank that follows
33     next;
34     }
35
36   # Count runs of empty lines
37
38   if (/^\s*$/)
39     {
40     $blankcount++;
41     $lastwascut = 0;
42     next;
43     }
44
45   # If a chunk of lines has been cut out (page footer) and the next line
46   # has a different indentation, put back one blank line.
47
48   if ($lastwascut && $blankcount < 1 && defined($lastprinted))
49     {
50     ($a) = $lastprinted =~ /^(\s*)/;
51     ($b) = $_ =~ /^(\s*)/;
52     $blankcount++ if ($a ne $b);
53     }
54
55   # We get here only when we have a non-blank line in hand. If it was preceded
56   # by 3 or more blank lines, read the next 3 lines and see if they are blank.
57   # If so, remove all 7 lines, and remember that we have just done a cut.
58
59   if ($blankcount >= 3)
60     {
61     for ($i = 0; $i < 3; $i++)
62       {
63       $next[$i] = <STDIN>;
64       $next[$i] = "" if !defined $next[$i];
65       $next[$i] =~ s/\x1b\[\d+m//g;   # Remove screen controls "ESC [ number m"
66       $next[$i] =~ s/.\x8//g;         # Remove "char, backspace"
67       }
68
69     # Cut out chunks of the form <3 blanks><non-blank><3 blanks>
70
71     if ($next[0] =~ /^\s*$/ &&
72         $next[1] =~ /^\s*$/ &&
73         $next[2] =~ /^\s*$/)
74       {
75       $blankcount -= 3;
76       $lastwascut = 1;
77       }
78
79     # Otherwise output the saved blanks, the current, and the next three
80     # lines. Remember the last printed line.
81
82     else
83       {
84       for ($i = 0; $i < $blankcount; $i++) { print "\n"; }
85       print;
86       for ($i = 0; $i < 3; $i++)
87         {
88         $next[$i] =~ s/.\x8//g;
89         print $next[$i];
90         $lastprinted = $_;
91         }
92       $lastwascut = 0;
93       $blankcount = 0;
94       }
95     }
96
97   # This non-blank line is not preceded by 3 or more blank lines. Output
98   # any blanks there are, and the line. Remember it. Force two blank lines
99   # before headings.
100
101   else
102     {
103     $blankcount = 2 if /^\S/ && !/^Last updated/ && !/^Copyright/ &&
104       defined($lastprinted);
105     for ($i = 0; $i < $blankcount; $i++) { print "\n"; }
106     print;
107     $lastprinted = $_;
108     $lastwascut = 0;
109     $blankcount = 0;
110     }
111   }
112
113 # End