import java.io.*; import java.text.*; import java.util.*; /** This program imitates the slide-making capability of the "classic" HTML Tidy. It creates slides from an HTML file, split along

boundaries. */ public class SlideMaker { public static void main(String[] args) { if (args.length == 0) usage(); try { BufferedReader in = new BufferedReader(new FileReader(args[0])); SlideMaker maker = new SlideMaker(in); maker.process(); } catch (IOException ex) { ex.printStackTrace(); } } public static void usage() { System.err.println("usage: SlideMaker htmlFile"); } public SlideMaker(BufferedReader in) { this.in = in; } public void process() throws IOException { htmlPrefix = readUntil(startOfBody); readUntil(startOfSlide); // skip

while (!isLast) { StringBuffer slide = readUntil(startOfSlide); emit(slide); } } private StringBuffer readUntil(String tag) throws IOException { StringBuffer buffer = new StringBuffer(); if (nextLine != null) { buffer.append(nextLine); buffer.append("\n"); } while ((nextLine = in.readLine()) != null) { if (nextLine.toLowerCase().indexOf(endOfBody) >= 0) { isLast = true; return buffer; } if (nextLine.toLowerCase().indexOf(tag) >= 0) return buffer; buffer.append(nextLine); buffer.append("\n"); } return buffer; } private void emit(StringBuffer slide) throws IOException { counter++; String fileName = fileNamePrefix + pad(counter) + fileNameSuffix; PrintWriter out = new PrintWriter(new FileWriter(fileName)); try { out.println(htmlPrefix); emitHeader(out); out.println(slide); emitFooter(out); out.println(htmlSuffix); } finally { out.close(); } } private void emitHeader(PrintWriter out) { if (counter == 1) out.println(MessageFormat.format(firstSlideHeader, new Object[] { fileNamePrefix, pad(2) })); else if (isLast) out.println(MessageFormat.format(lastSlideHeader, new Object[] { fileNamePrefix, pad(counter - 1), pad(1) })); else out.println(MessageFormat.format(slideHeader, new Object[] { fileNamePrefix, pad(counter - 1), pad(counter + 1), pad(1) })); } private void emitFooter(PrintWriter out) { if (counter == 1) out.println(MessageFormat.format(firstSlideFooter, new Object[] { fileNamePrefix, pad(2) })); else if (isLast) out.println(MessageFormat.format(lastSlideFooter, new Object[] { fileNamePrefix, pad(counter - 1), pad(1) })); else out.println(MessageFormat.format(slideFooter, new Object[] { fileNamePrefix, pad(counter - 1), pad(counter + 1), pad(1) })); } private String pad(int n) { String r = "" + n; while (r.length() < digits) r = "0" + r; return r; } private BufferedReader in; private String nextLine; private String fileNamePrefix = "slide"; private String fileNameSuffix = ".html"; private int digits = 3; private String firstSlideHeader = "\n" + "
\n" + "
" + "next
\n" + "
"; private String firstSlideFooter = "

\n" + "
" + "next
\n" + "
"; private String slideHeader = "\n" + "
\n" + "
previous | \n" + "start | \n" + "next
\n" + "
"; private String slideFooter = "

\n" + "
previous | \n" + "start | \n" + "next
\n" + "
"; private String lastSlideHeader = "\n" + "
previous | \n" + "start
\n" + "
"; private String lastSlideFooter = "
\n" + "
previous | \n" + "start
\n"; private int counter; private StringBuffer htmlPrefix; private String htmlSuffix = "\n"; private String startOfSlide = "

"; private String startOfBody = "" encountered }