#!/usr/bin/perl
# Use -*- perl -*- mode.
#
# This is a simple HTML document contents list creator and chapter
# renumberer.
# Copyright © 1997 Jaakko Hyvätti
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# The author may be contacted at:
#
# Email: Jaakko.Hyvatti@iki.fi
# URL: http://www.iki.fi/hyvatti/
# Phone: +358 40 5011222
#
# Please send any suggestions, bug reports, success stories etc. to the
# Email address above.
# Muuttaa
-otsikoiden alussa (mahdollisesti) esiintyvän numeron
# vastaamaan järjestysnumeroa sisällysluettelossa.
#
# Lisää - -otsikkoihin ankkurin
#
# Lisää sisällysluetteloksi kaikki -otsikot, ja muut otsikot alaotsikoiksi
# Sisällysluettelo on ensimmäinen yksin rivillä, ja ulottuu seuraavaan
#
:ään.
#
# Artikkelin rakenne:
# - pääotsikko, tähän ei kosketa.
# - lukujen otsikot. Numeroidaan, numeroitu lista sis.luettelossa
# - alaotsikot, kerätään numeroimattomaan listaan
# sisällysluettelossa, hierarkisesti sisennettynä.
#
# Huom! otsikon tai alaotsikon ankkuria (A NAME=)voi muuttaa mieleisekseen,
# kunhan se alkaa ei-numerolla! Tällöin sitä käytetään numeroviitteen sijasta.
$before_ol = "";
$ol = "";
$got_ol = 0;
$wait_ol = 0;
$after_ol = "";
$next_num = 0;
$next_ref = 0;
$level = 2;
while (<>) {
chomp;
if (!$got_ol && !$wait_ol && //i) {
$before_ol .= $` . "\n" if $`;
$before_ol .= $& . "\n";
$_ = $';
$wait_ol = 1;
}
if ($wait_ol) {
if (m,
,i) {
$after_ol = $& . "\n";
$after_ol .= $' . "\n" if $';
$wait_ol = 0;
$got_ol = 1;
}
next;
}
if (m,^\s*\s*((]+)"?\s*>|<.*>)\s*)*([0-9]+\.\s+)?([^<>]+\S)(\s*<.*>)*\s*\s*$,i) {
$h_level = $1;
$name = $4;
$header = $6;
while ($h_level < $level) {
$ol .= " \n";
$level--;
}
while ($h_level > $level) {
$ol .= " \n";
$level++;
}
if (2 == $h_level) {
$next_num++;
$name = $next_num unless $name =~ /^[^0-9]/;
$_ = "";
$ol .= "- $header\n";
$next_ref = 0;
} else {
$next_ref++;
$name = $next_num . "-" . $next_ref unless $name =~ /^[^0-9]/;
$_ = "$header";
$ol .= "
- $header\n";
}
}
if ($got_ol) {
$after_ol .= $_ . "\n";
} else {
$before_ol .= $_ . "\n";
}
}
while (2 < $level) {
$ol .= "
\n";
$level--;
}
print $before_ol . $ol . $after_ol;