#!/usr/bin/perl
##
###########################################################################
##
##  Program:  slide-generator.pl
##
##  Purpose:  Generate a series of HTML slides based on a single formatted
##            HTML file.
##
##  Version:  1.1   06 Aug 1997
##
##  Author:   Peter Murray, Digital Media Services
##            Case Western Reserve University
##            http://www.cwru.edu/home/pem.html
##
##  Legalities:
##            Copyright 1997 by Case Western Reserve University.
##            All rights reserved.
##
##  Revision History:
##    13 Jan 1997  pem  Initial Release
##    06 Aug 1997  pem  Added "Logo" and "Title" HTML comments to set $logoHTML and $shortTitle
##
## DOCUMENTATION, in PERL POD format, is at the end of the program.
## Running the program `perldoc <programname>` should output the manual.
##
$slide=1; $fileOpen = 0;
$forwardGif = "next.gif";
$backGif = "previous.gif";
$indexGif = "index.gif";
$logoHTML = "<FONT SIZE=-1><B>Chemical Science Virtual Library Presentation</B><BR>Kent State University / IBM; August 7th, 1997</FONT><HR>";
$bodyAttrib = "BGCOLOR=\"white\" VLINK=\"blue\"";

while (<>) {
  if (/^<!-- Logo:\s+(.*) -->/) {
    $logoHTML = "$1";
    next;
  }
  if (/^<!-- Title:\s+(.*) -->/) {
    $shortTitle = "$1";
    next;
  }
  if (/^<!-- Style:\s+(.*) -->/) {
    $inlineStyle = $1;
    next;
  }
  if (/<h1>(.+)<\/h1>/i) {
    @slides[$slide] = "H1|$slide|$1|";
    $lastH1 = $slide;
    $contentSlide = $slide;
    $slide++;
    next;
  }
  if (/<h2>(.+)<\/h2/i) {
    @slides[$slide] = "H2|$slide|$1|";
    $lastH2 = $slide;
    $contentSlide = $slide;
    $slide++;
    next;
  }
  if (/<h3>(.+)<\/h3>/i) {
    $withinH3 = 1;
    @slides[$slide] = "H3|$slide|$1|";
    $contentSlide = $slide;
    $slide++;
    next;
  }
  @slides[$contentSlide] .= $_ if $contentSlide > 0;
}

foreach $line (@slides) {
  my($header, $slide, $title, @htmlFrag) = split(/\|/, $line);
  if ($header eq "H1") {
    if ($H1fileOpen > 0) {
      print H1OUTFILE "</UL>\n</TITLE>\n</HTML>\n";
      close H1OUTFILE;
    }
    my $nextSlide = $slide+1;
    my $prevSlide = $slide-1;
    open (H1OUTFILE, ">slide${slide}.htm") || die "Cannot open H1 slide${slide}.htm: $!\n";
    print H1OUTFILE "<HTML>\n<HEAD>\n<TITLE>$title</TITLE>\n$inlineStyle</HEAD>\n<BODY $bodyAttrib>\n";
    print H1OUTFILE "<A HREF=\"slide".$nextSlide.".htm\"><img ALIGN=right BORDER=none ALT=\"forward\" SRC=\"$forwardGif\"></A>\n";
    print H1OUTFILE "<A HREF=\"index.htm\"><img ALIGN=right BORDER=none ALT=\"index\" SRC=\"$indexGif\"></A>\n";
    print H1OUTFILE "<A HREF=\"slide".$prevSlide.".htm\"><img ALIGN=right BORDER=none ALT=\"back\" SRC=\"$backGif\"></A>\n"
      if ($slide < 1);
    print H1OUTFILE "$logoHTML\n";
    print H1OUTFILE "<H1>$title</H1>\n";
    print H1OUTFILE join '',@htmlFrag;
    print H1OUTFILE "<UL>\n";
    $H1fileOpen = $slide;
  } elsif ($header eq "H2") {
    print H1OUTFILE "<LI><A HREF=\"slide${slide}.htm\">$title</A>\n";
    if ($H2fileOpen > 0) {
      print H2OUTFILE "</UL>\n</TITLE>\n</HTML>\n";
      close H2OUTFILE;
    }
    my $nextSlide = $slide+1;
    my $prevSlide = $slide-1;
    open (H2OUTFILE, ">slide${slide}.htm") || die "Cannot open H2 slide${slide}.htm: $!\n";
    print H2OUTFILE "<HTML>\n<HEAD>\n<TITLE>$title</TITLE>\n$inlineStyle</HEAD>\n<BODY $bodyAttrib>\n";
    print H2OUTFILE "<A HREF=\"slide".$nextSlide.".htm\"><img ALIGN=right BORDER=none ALT=\"forward\" SRC=\"$forwardGif\"></A>\n";
    print H2OUTFILE "<A HREF=\"slide".$H1fileOpen.".htm\"><img ALIGN=right BORDER=none ALT=\"index\" SRC=\"$indexGif\"></A>\n";
    print H2OUTFILE "<A HREF=\"slide".$prevSlide.".htm\"><img ALIGN=right BORDER=none ALT=\"back\" SRC=\"$backGif\"></A>\n";
    print H2OUTFILE "$logoHTML\n";
    print H2OUTFILE "<H1>$title</H1>\n";
    print H2OUTFILE join '',@htmlFrag;
    print H2OUTFILE "<UL>\n";
    $H2fileOpen = $slide;
  } elsif ($header eq "H3") {
    print H2OUTFILE "<LI><A HREF=\"slide${slide}.htm\">$title</A>\n";
    my $nextSlide = $slide+1;
    my $prevSlide = $slide-1;
    open (H3OUTFILE, ">slide${slide}.htm") || die "Cannot open H3 slide${slide}.htm: $!\n";
    print H3OUTFILE "<HTML>\n<HEAD>\n<TITLE>$title</TITLE>\n$inlineStyle</HEAD>\n<BODY $bodyAttrib>\n";
    print H3OUTFILE "<A HREF=\"slide".$nextSlide.".htm\"><img ALIGN=right BORDER=none ALT=\"forward\" SRC=\"$forwardGif\"></A>\n";
    print H3OUTFILE "<A HREF=\"slide".$H2fileOpen.".htm\"><img ALIGN=right BORDER=none ALT=\"index\" SRC=\"$indexGif\"></A>\n";
    print H3OUTFILE "<A HREF=\"slide".$prevSlide.".htm\"><img ALIGN=right BORDER=none ALT=\"back\" SRC=\"$backGif\"></A>\n";
    print H3OUTFILE "$logoHTML\n";
    print H3OUTFILE "<H1>$title</H1>\n";
    print H3OUTFILE join '',@htmlFrag;
    print H3OUTFILE "<UL>\n";
    close H3OUTFILE;
  } else {
    warn "Unknown header $header at slide $slide";
  }
}

print H2OUTFILE "</UL>\n</BODY>\n</HTML>\n";
close H2OUTFILE;
print H1OUTFILE "</UL>\n</BODY>\n</HTML>\n";
close H1OUTFILE;

open (OUTFILE, ">index.htm") || die "Cannot open index.htm: $!\n";
print OUTFILE "<HTML>\n<HEAD>\n<TITLE>$shortTitle</TITLE>\n$inlineStyle</HEAD>\n<BODY $bodyAttrib>\n";
print OUTFILE "<A HREF=\"slide1.htm\"><img ALIGN=right BORDER=none ALT=\"forward\" SRC=\"$forwardGif\"></A>\n";
print OUTFILE "$logoHTML\n";
print OUTFILE "<H1>$1</H1>\n";
print OUTFILE "<UL>\n";
$firstOne = 1;
foreach $line (@slides) {
  my($header, $slide, $title) = split(/\|/, $line);
  if ($header eq "H1") {
    if ($firstOne != 1) {
      print OUTFILE "  </UL>\n";
    }
    print OUTFILE " <LI><A HREF=\"slide${slide}.htm\">$title</A>\n";
    print OUTFILE "  <UL>\n";
  } elsif ($header eq "H2") {
    print OUTFILE "   <LI><A HREF=\"slide${slide}.htm\">$title</A>\n";
  }
  $firstOne = 0;
}
print OUTFILE "</UL>\n</BODY>\n</HTML>\n";
close OUTFILE;
  
  
=head1 NAME

slide-generator.pl - Generate a series of HTML slides

=head1 SYNOPSIS

  slide-generator.pl  [ slide-file ]
 
=head1 DESCRIPTION

The slide generator script takes a specially-formatted HTML file an creates a series
of linked HTML "slides" complete with forward/backward navigation and slide index
pages. 

=head1 PARAMETERS

=over 4

=item [ slide-file ]

An HTML file formatted as specified below.  Alternatively, the HTML file can come from STDIN.

=back

=head1 SETUP

=over 4

=item 1.

Write your slides in one HTML document. 

=item 2.

Use an <H1>...</H1> tag for a main presentation point (such as "HTML, 
image, PDF browsers") as listed in the schedule. This will create a 
group of slides with their own index page. If you want to put a 
paragraph of text or other HTML code on the Main Presentation Point 
slide index page, include it before the first <H2>. 

=item 3.

Use an <H2>...</H2> tag to create a single slide within a presentation 
point. The title between the <H2>...</H2> becomes the title of the 
slide. 

=item 4.

Use any other legal HTML under the <H2> will be added as-is to the slide 
(including inline images and links to other places as you desire). 

=back

=head1 COPYRIGHT

Copyright 1997 by Case Western Reserve University.

=head1 AUTHOR

 Peter Murray
 Library Systems Manager
 Digital Media Services
 Case Western Reserve University
 pem@po.cwru.edu
 http://www.cwru.edu/home/pem.html

Updates available from http://www.cwru.edu/lit/homes/pem/projects/slide-generator.html

=cut


    

