#!/usr/bin/perl -w -I ./ #####!/usr/bin/perl -T -w -I ./ use IO::File; # stdin: html # stdout: html with toc # replace a line with "" with table of contents # generated from header elements:

etc. # surrounds each head element with element ##open (TOC, "+>DOC"); ##open (DOC, "+>TOC"); $toc = IO::File->new_tmpfile(); $doc = IO::File->new_tmpfile(); print ($toc "
Table of Contents
\n"); $level = 0; #@paranums; while ( ) { ###if( /\s*<[hH](\d+)>([^<]*)<\/[hH]\1>/ ) if( /\s*<([hHlL])(\d+)>([^<]*)<\/\1\2>/ ) { my $hdr = $1; my $lvl = $2; my $txt = $3; if( $lvl < 1 ) { $lvl = 1; } if( $lvl > $level ) { $paranums[$lvl-1] = 0; print ($toc "
\n"); }elsif( $lvl < $level ) { my $ndx; for( $ndx=0; $lvl+$ndx < $level; $ndx++ ) { print ($toc "
\n"); } } $level = $lvl; $paranums[$level-1] += 1; my $paraname = ""; my $dot = ""; for ( $ndx=0; $ndx<$level; $ndx++ ) { $paraname = $paraname . $dot . $paranums[$ndx]; $dot = "."; } if( "h" eq $hdr || "H" eq $hdr ) { print ($doc "
$paraname $txt\n"); print ($toc "
$paraname $txt
\n"); }else{ my @txtprt = split(/;/,$txt,2); if( @txtprt == 2 ) { print ($toc "
$paraname $txtprt[1]
\n"); }else{ print ($toc "
$paraname $txtprt[0]
\n"); } } }else{ s/
([^<]*)<\/header>/
$1<\/td><\/tr><\/table>/g; s/([^<]*)<\/cat>/$1<\/span>/g; s/([^<]*)<\/func>/$1<\/span>/g; s/([^<]*)<\/map>/$1<\/span>/g; s/([^<]*)<\/set>/$1<\/span>/g; s/([^<]*)<\/obj>/$1<\/span>/g; s/([^<]*)<\/CAT>/$1<\/span>/g; s/([^<]*)<\/FAM>/$1<\/span>/g; s/([^<]*)<\/FUNC>/$1<\/span>/g; s/&arrow;/→/g; s/&rarrow;/←/g; #reverse arrow s/&monic;/↦/g; #monic arrow s/&equalize;/↣/g; #equalizer arrow #s/&eqlz;/∥/g; #equalizer op double bar s/&eqlz;/≑/g; #equalizer op geometric equality #s/&cover;/↠/g; #cover arrow s/&cover;/−⊳/g; #cover arrow #s/&cover;/⇾/g; #cover arrow s/&isoarrow;/⥲/g; #isomorphism arrow s/&darrow;/⇒/g; #double arrow s/&implies;/⇒/g; #double arrow s/&rdarrow;/⇐/g; #reverse double arrow s/&impliedby;/⇐/g; #reverse double arrow s/⇔/⇔/g; #if and only if s/&box;/□/g; #source or target operator s/&opbox;/▣/g; #opposite source or target op s/&circle;/○/g; #circle s/&cring;/⊚/g; #circle ring s/&bullseye;/◎/g; #circle ring s/&role;/○/g; #role s/&roleop;/◎/g; #opposite role s/∀/∀/g; s/∃/∃/g; s/¬exist;/∄/g; s/¬equal;/≠/g; s/&isomorphic;/≃/g; s/&mul;/X<\/font>/g; s/&add;/+/g; s/∏/∏/g; # n-ary s/∐/∐/g; # n-ary s/∑/∑/g; # n-ary s/∅/∅/g; s/&incr;/∆/g; s/&nable;/∇/g; s/∈/∈/g; s/∉/∉/g; s/&smallisin;/∊/g; s/&contains;/∋/g; s/¬contains;/∌/g; s/&smallcontains;/∍/g; s/&QED;/∎/g; s/&slash;/∕/g; s/∖/∖/g; s/&asterisk;/∗/g; s/&compose;/∘/g; s/&dcomp;/ /g; s/•/∙/g; s/&infinity;/∞/g; s/&logicaland;/∧/g; s/&land;/∧/g; s/&logicalor;/∨/g; s/&lor;/∨/g; s/∩/∩/g; s/&intersection;/∩/g; s/∪/∪/g; s/&union;/∪/g; s/&bar;/∣/g; s/⊂/⊂/g; s/⊃/⊃/g; s/&direq;/⇉/g; #directed equality, venturi tube #s/&direq;/≔/g; # :=, directed equality, venturi tube s/&colonequal;/≕/g; # := s/&equalcolon;/≕/g; # =; s/°ree;/°/g; s/·/·/g; s/&inverse;/⁻¹/g; s/&nland;/⋀/g; s/&nlor;/⋁/g; s/&nintersection;/⋂/g; s/⩃/⋂/g; s/&nunion;/⋃/g; s/⩂/⋃/g; s/⋄/⋄/g; s/˙/⋅/g; s/♯/#<\/sup>/g; s/&wbullet;/◦/g; s/&whitebullet;/◦/g; s/Α/Α/g; s/Β/Β/g; s/Γ/Γ/g; s/Δ/Δ/g; s/Ε/Ε/g; s/Ζ/Ζ/g; s/Η/Η/g; s/Θ/Θ/g; s/Ι/Ι/g; s/Κ/Κ/g; s/Λ/Λ/g; s/Μ/Μ/g; s/Ν/Ν/g; s/Ξ/Ξ/g; s/Ο/Ο/g; s/Π/Π/g; s/Ρ/Ρ/g; s/&Stigma;/΢/g; s/Σ/Σ/g; s/Τ/Τ/g; s/Υ/Υ/g; s/Φ/Φ/g; s/Χ/Χ/g; s/Ψ/Ψ/g; s/Ω/Ω/g; s/α/α/g; s/β/β/g; s/γ/γ/g; s/δ/δ/g; s/ε/ε/g; s/ζ/ζ/g; s/η/η/g; s/θ/θ/g; s/ι/ι/g; s/κ/κ/g; s/λ/λ/g; s/μ/μ/g; s/ν/ν/g; s/ξ/ξ/g; s/ο/ο/g; s/π/π/g; s/ρ/ρ/g; s/&stigma;/ς/g; s/σ/σ/g; s/τ/τ/g; s/υ/υ/g; s/φ/φ/g; s/χ/χ/g; s/ψ/ψ/g; s/ω/ω/g; print $doc $_; } } print ($toc "\n"); seek ($toc,0,0); seek ($doc,0,0); while (<$doc>) { if( /<[Tt][Oo][Cc]\/?>/ ) { while ( <$toc> ) { print; } }else{ print; } } close $toc; close $doc; #unlink TOC, DOC;