diff options
Diffstat (limited to 'manual/tools/htmltbl')
| -rwxr-xr-x | manual/tools/htmltbl | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/manual/tools/htmltbl b/manual/tools/htmltbl new file mode 100755 index 0000000000..4b7b41a7db --- /dev/null +++ b/manual/tools/htmltbl @@ -0,0 +1,134 @@ +#!/usr/local/bin/perl + +while (<>) { + if (m|^<tbl[> ]|) { + while (! m|</tbl>$|) { $_ .= <>; } + s/\n//g; + print "<pre>\n"; + do format_table($_); + print "</pre>\n"; + } else { + print $_; + } +} + +sub format_table { +# On input, $_ contains: +# <tbl [border]><th>Header 1<th>Header2<th>...<th>Header M<tr> +# <td>Data11<td>Data12<td>...<td>Data1M<tr> +# ... +# <td>DataN1<td>DataN2<td>...<td>DataNM<tr> +# </tbl> + +# Extract the entries and compute the number of lines and columns + + $numlines = 0; + $numcols = 0; + $border = 0; + $header = 0; + $x = 0; + $y = 0; + foreach $_ (split(/(<tbl[ a-zA-Z]*>|<th>|<td>|<tr>|<\/tbl>)/, $_)) { + if (/^$/) { next; } + elsif (/<tbl border>/) { $border = 1; } + elsif (/<tr>/i) { + if ($x > $numcols) { $numcols = $x; } + $x = 0; + $y++; + } + elsif (/<th>/) { $header = 1; } + elsif (!/(<tbl[ a-zA-Z]*>|<th>|<td>|<tr>|<\/tbl>)/) { + s|</?[a-zA-Z]*>||g; # Remove embedded tags + s/^\s*//; # and initial blanks + s/\s*$//; # and final blanks + s/\s\s\s*/ /g; # and extra blanks + s/</</g; # Unescape HTML specials + s/>/>/g; + s/&/&/g; + $entry{$x, $y} = $_; + $x++; + } + } + $numlines = $y; + +# Compute the max width of each column + + $totalwidth = 0; + + for ($x = 0; $x < $numcols; $x++) { + $max = 0; + for ($y = 0; $y < $numlines; $y++) { + $len = length($entry{$x, $y}); + if ($len > $max) { $max = $len; } + } + $width[$x] = $max; + $totalwidth += $max; + } + +# If it does not fit in one line, turn wide fields into multi-line fields + + if ($totalwidth >= 65) { + $totalwidth = 0; + $maxwidth = 65 / $numcols; + for ($x = 0; $x < $numcols; $x++) { + if ($width[$x] > $maxwidth) { + if ($x < $numcols - 1) { + $width[$x] = $maxwidth; + } else { + $width[$x] = 70 - $totalwidth; + } + } + $totalwidth += $width[$x]; + } + } + +# Compute the separators + + if ($border) { + $horsep = '+-'; + for ($x = 0; $x < $numcols; $x++) { + if ($x > 0) { $horsep .= '-+-'; } + $horsep .= '-' x $width[$x]; + } + $horsep .= '-+'; + $verleft = '| '; + $versep = ' | '; + $verright = ' |'; + } else { + $horsep = ''; + $verleft = ' '; + $versep = ' '; + $verright = ' '; + } + +# Print the table + print $horsep, "\n"; + for ($y = 0; $y < $numlines; $y++) { + do { + $overflow = 0; + print $verleft; + for ($x = 0; $x < $numcols; $x++) { + if ($x > 0) { print $versep; } + $_ = $entry{$x, $y}; + if (length($_) > $width[$x]) { + $pos = rindex($_, ' ', $width[$x]); + if ($pos < 0) { $pos = $width[$x]; } else { $pos++; } + $entry{$x, $y} = substr($_, $pos); + $_ = substr($_, 0, $pos - 1); + $overflow = 1; + } else { + $entry{$x, $y} = ''; + } + $len = length($_); + s/&/&/g; + s/</</g; + s/>/>/g; + print $_, ' ' x ($width[$x] - $len); + } + print $verright, "\n"; + } while($overflow); + if ($header && $y == 0) { print $horsep, "\n"; } + } + print $horsep, "\n"; +} + |
