#! /uns/bin/perl -w # htmlify-cystic-l-faq: turn text version of cystic-l faq into html # run like this: htmlify-cystic-l-faq < cystic-l-faq-all # Ron Trueworthy should put the date on the FAQ. use English; use Carp; use strict; my @section_name; my @appendix_name; my @section_toc; my @appendix_toc; my $new_tag = "[NEW]"; if (! -d "faq") { die "Can't find faq directory"; } # Initially undefined my $appendix; my $section; my $subsection; my $subsubsection; my $this_file_toc = ""; my %file_tocs; my @output_files = (); my $file_index = 0; my $output_file; my $line; while (defined($line = <>)) { ### Message headers if ($line =~ /^From /) { while ($line ne "\n") { $line = <>; } } if ($line =~ /^See PART ONE of this FAQ for/) { while (defined($line = <>) && ($line ne "\n")) { } next; } if ($line =~ /^\s*[-+]+$/) { next; } ### File headers if ($line =~ /^\s*CYSTIC-L Frequently Asked Questions - PART (.*)\n$/) { # print "part $1\n"; if ($1 ne "ONE") { next; } if ($output_file) { die "output_file shouldn't have been set yet: $output_file"; } $output_file = "faq/index.html"; open(OUTPUT, ">$output_file") || die "Couldn't open $output_file"; select OUTPUT; print " CYSTIC-L FAQ Table of Contents

CYSTIC-L Frequently Asked Questions

Knowledge Is Power

"; next; } if ($line =~ /^\s*~ Knowledge Is Power ~$/) { next; } ### Table of contents if ($line =~ /^\s*~ FAQ Table of Contents ~$/) { read_toc(); print "
Info-Zone CF-WEB\n"; close(OUTPUT); next; } if ($line =~ /^PART /) { next; } if ($line =~ s/^>?APPENDIX ([A-Z])\.\s*//) { if (!defined($appendix)) { if ($1 ne "A") { die "First appendix is $1"; } } elsif ($1 ne chr(ord($appendix)+1)) { die "Appendix $1 follows Appendix $appendix"; } file_end(); close(OUTPUT); $appendix = $1; $section = undef; $subsection = undef; $subsubsection = undef; $output_file = section_url_base(); open(OUTPUT, "> faq/$output_file") || die "Can't open faq/$output_file"; select OUTPUT; chomp($line); print "$line\n

$line

\n"; if (defined($file_tocs{$output_file}) && $file_tocs{$output_file}) { print "Contents: $file_tocs{$output_file}\n"; } next; } if (($line =~ /^>?([0-9]+)\.\s+/) && (!defined($section) || ($1 == $section+1))) { $line =~ s/^>?([0-9]+)\.\s+//; if (!defined($appendix)) { # should do some more here if (defined($section)) { file_end(); } close(OUTPUT); } $section = $1; $subsection = undef; $subsubsection = undef; $output_file = section_url_base(); if (!defined($appendix)) { open(OUTPUT, "> faq/$output_file") || die "Can't open faq/$output_file"; select OUTPUT; chomp($line); print "$line\n

$line

\n"; if (defined($file_tocs{$output_file}) && $file_tocs{$output_file}) { print "Contents: $file_tocs{$output_file}\n"; } next; } } if ($line =~ s/^>?o\s+//) { $line =~ s/^>//; # sometimes the > follows the itemization if (!defined($subsection)) { $subsection = 1; } else { $subsection++; } $subsubsection = undef; print "

", section_name($line), "

\n"; next; } if ($line =~ s/^>?-\s+//) { $line =~ s/^>//; # sometimes the > follows the itemization if (!defined($subsubsection)) { $subsubsection = 1; } else { $subsubsection++; } print "

", section_name($line), "

\n"; next; } ### A paragraph of ordinary text if ($line !~ /^\s*$/) { print "

$line"; while (defined($line = <>) && ($line ne "\n")) { print $line; } print "

\n"; } } file_end(); my $subsection_marker; my $new; sub read_toc () { # These variables are initially undefined if (defined($appendix) || defined($section) || defined($subsection) || defined($subsubsection)) { die "some value should have been undefined when calling read_toc: `$appendix' `$section' `$subsection' `$subsubsection'"; } while (defined($line = <>) && $line) { if ($line =~ /^\s*$/) { next; } if ($line =~ /^\s*\((Portions updated since.*)>\)\n/) { print "$1$new_tag

\n"; next; } if ($line =~ /^PART (.*)$/) # { if ($MATCH eq "ONE") # { print ... } { next; } if ($line eq "APPENDICES\n") { next; } if ($line =~ /^\s*INDEX/) { next; } if ($line =~ /^\s*[-+]+$/) { finish_appendices(); if (defined($appendix) || defined($section) || defined($subsection) || defined($subsubsection)) { die "some value should have been undefined when exiting read_toc: `$appendix' `$section' `$subsection' `$subsubsection'"; } return; } $new = ($line =~ s/>//); # # Not sure if this is the right place to do this. # if (($line !~ /^\s*([-o]|[0-9A-Z]+\.|APPENDIX [A-Z]\.)/) # && ($line !~ /[ .]*[0-9]+$/)) # { die "What line? $line"; } while (!($line =~ s/[ .]*[0-9]+$//)) { $line .= <>; } chomp($line); if ($line =~ s/^\s*APPENDIX ([A-Z])\.\s*//) { finish_sections(); if (!defined($appendix)) { if ($1 ne "A") { die "First appendix is $1"; } print "Appendices\n"; print "

    \n"; } elsif ($1 ne chr(ord($appendix)+1)) { die "Appendix $1 follows Appendix $appendix"; } $appendix = $1; $appendix_name[ord($appendix)-ord('A')+1] = $line; my $entry = toc_line($line); print $entry; push(@output_files,section_url_base()); next; } if ($line =~ s/^\s*([0-9]+)\.\s*//) { finish_subsections(); if (!defined($section)) { my $entry = "
      \n"; print $entry; if (defined($appendix)) { $this_file_toc .= $entry; } } elsif ($1 != $section+1) { die "Section $1 follows section $section"; } $section = $1; $section_name[$section] = $line; my $entry = " " . toc_line($line); print $entry; if (defined($appendix)) { $this_file_toc .= $entry; } else { push(@output_files,section_url_base()); } next; } if ($line =~ s/^\s*o\s+//) { if (!defined($subsection)) { $subsection = 1; my $entry = "
    \n"; $appendix = undef; } } sub section_url_base () { if (!defined($appendix) && !defined($section)) { die "undefined appendix and section"; } return (defined($appendix) ? "app-$appendix.html" : "sec-$section.html"); } sub section_url_name () { my $sans_subsubsection = (defined($appendix) ? (defined($section) ? "sec-$section" . (defined($subsection) ? "-$subsection" : "") : "") : (defined($subsection) ? "ssec-$subsection" : "")); if (defined($subsubsection)) { $sans_subsubsection . "-$subsubsection"; } else { $sans_subsubsection; } } sub section_url () { my $base = section_url_base(); my $name = section_url_name(); if ($name) { return $base . "\#" . $name; } else { return $base; } } sub section_href ($) { my ($text) = @_; return "$text"; } sub section_name ($) { my ($text) = @_; return "$text"; } sub toc_line ($) { return "
  1. " . section_href($line) . ($new ? " $new_tag" : "") . "\n"; } sub file_end () { print "\n\n
    \n" . (($file_index < $#output_files) ? "Next " : "") . (($file_index > 0) ? "Previous " : "") . "FAQ Info-Zone CF-WEB\n"; $file_index++; }