1 #!/usr/local/bin/perl -w
11 my ( $chap_title, $chap_abbrev ) ;
13 my $page_num = 0 ; # number as read in
14 my $slide_num = 0 ; # slide within a chapter
19 'book' => \&process_book,
20 'title' => \&process_title,
21 'chapter' => \&process_chapter,
22 'code' => \&process_code,
23 'code2' => \&process_code2,
24 '*' => \&process_bullet,
25 '**' => \&process_bullet2,
26 'haiku' => \&process_haiku,
27 'html' => \&process_html,
37 #print Dump \@slides ;
41 sub read_parse_pages {
43 local( $/ ) = "PAGE_END\n" ;
45 while ( my $page = <> ) {
49 next unless $page =~ /\S/ ;
51 push @slides, parse_page( $page ) ;
54 $book_values{'TOTAL_PAGES'} = $page_num ;
59 my ( $page_text ) = @_ ;
62 'PAGE_NUM' => ++$page_num,
63 'SLIDE_NUM' => ++$slide_num,
64 'CHAP_NUM' => $chap_num,
67 foreach my $part ( split( /(?=^(?:\w+|\*+|):)/m, $page_text ) ) {
69 next unless $part =~ /\S/ ;
71 my ( $part_type, $part_body ) = split /:/, $part, 2 ;
73 my $part_sub = $part2sub{ lc $part_type } or die
74 "unknown slide part '$part_type'\n$page_text" ;
76 $part_sub->( $slide, $part_body ) ;
85 my( $slide, $book_text ) = @_ ;
87 $book_values{'BOOK_NAME'} = $book_text ;
92 my( $slide, $chapter_text ) = @_ ;
94 ( $chap_title, $chap_abbrev ) = split( /\n/, $chapter_text ) ;
96 $chap_title =~ tr/\n / /s ;
97 $slide->{'CHAPTER'} = $chap_title ;
100 $chap_abbrev =~ tr/\n / /s ;
101 $slide->{'CHAP_ABBREV'} = $chap_abbrev ;
106 $slide->{'SLIDE_NUM'} = $slide_num ;
107 $slide->{'CHAP_NUM'} = $chap_num ;
112 my( $slide, $title_text ) = @_ ;
114 $title_text =~ tr/\n / /s ;
116 $slide->{'TITLE'} = $title_text ;
118 $slide->{'CHAPTER'} = $chap_title ;
119 $slide->{'CHAP_ABBREV'} = $chap_abbrev ;
124 my( $slide, $bullet_text ) = @_ ;
126 my ( $bullet, @paras ) = split /\n{2,}/, $bullet_text ;
127 # escape_entities( $_ ) for $bullet, @paras;
128 escape_entities( $_ ) for @paras;
130 push( @{$slide->{'html_parts'}},
131 apply_template( 'bullet', { 'TEXT' => $bullet } ),
132 map apply_template( 'para', { 'TEXT' => $_ } ), @paras ) ;
135 sub process_bullet2 {
137 my( $slide, $bullet_text ) = @_ ;
139 my ( $bullet, @paras ) = split /\n{2,}/, $bullet_text ;
140 # escape_entities( $_ ) for $bullet, @paras;
141 escape_entities( $_ ) for @paras;
143 push( @{$slide->{'html_parts'}}, "<UL>\n",
144 apply_template( 'bullet2', { 'TEXT' => $bullet } ),
145 map( apply_template( 'para', { 'TEXT' => $_ } ), @paras ),
152 my( $slide, $code_text ) = @_ ;
154 $code_text =~ s/^\n// ;
155 escape_entities( $code_text ) ;
157 $code_text =~ s/<blue>/<font color="#0000ff">/gi ;
159 push( @{$slide->{'html_parts'}},
160 apply_template( 'code', { 'TEXT' => $code_text } ) ) ;
163 # sub process_code2 {
165 # my( $slide, $code_text ) = @_ ;
167 # $code_text =~ s/^\n// ;
168 # escape_entities( $code_text ) ;
170 # push( @{$slide->{'html_parts'}},
171 # apply_template( 'code2', { 'TEXT' => $code_text } ) ) ;
174 sub escape_entities {
176 print caller() if $_[0] =~ /IMG/ ;
178 $_[0] =~ s/&/&/g ;
179 $_[0] =~ s/</</g ;
180 $_[0] =~ s/>/>/g ;
185 my( $slide, $haiku_text ) = @_ ;
187 $haiku_text =~ tr/\n / /s ;
189 my @lines = split m{:}, $haiku_text ;
191 push( @{$slide->{'html_parts'}},
194 { LINE1 => $lines[0],
203 my( $slide, $html_text ) = @_ ;
205 push( @{$slide->{'html_parts'}}, $html_text ) ;
210 foreach my $slide ( @slides ) {
212 my $page_num = $slide->{'PAGE_NUM'} ;
214 if ( $page_num > 1 ) {
216 my $prev_slide = $slides[$page_num - 2] ;
217 $slide->{'PREV_FILE'} = $prev_slide->{'slide_file'} ;
218 $slide->{'PREV_TITLE'} = $prev_slide->{'TITLE'} ;
221 if ( $page_num < $book_values{'TOTAL_PAGES'} ) {
223 my $next_slide = $slides[$page_num] ;
224 $slide->{'NEXT_FILE'} = $next_slide->{'slide_file'} ;
225 $slide->{'NEXT_TITLE'} = $next_slide->{'TITLE'} ;
229 my $header = apply_template( 'header', $slide ) ;
230 my $footer = apply_template( 'footer', $slide ) ;
232 my $slide_file = "slides/$slide->{'slide_file'}" ;
234 write_file( $slide_file,
237 @{$slide->{'html_parts'}},
246 my $name = $book_values{'BOOK_NAME'} || 'Empty' ;
248 my $index_html = <<HTML ;
249 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
252 <TITLE>Index of $name</TITLE>
254 <H2>Index of $name</H2>
256 <UL STYLE="list-style-type:none">
259 my $toc_html = <<HTML ;
260 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
263 <TITLE>Table of Contents for $name</TITLE>
265 <H2>Table of Contents for $name</H2>
267 <UL STYLE="list-style-type:none">
270 foreach my $slide ( @slides ) {
272 my $chap_num = $slide->{'CHAP_NUM'} ;
273 my $slide_num = $slide->{'SLIDE_NUM'} ;
275 my $slide_file = sprintf( "slide-%02d%02d.html",
279 $slide->{'slide_file'} = $slide_file ;
281 if ( $slide_num == 1 ) {
283 my $chapter = $slide->{'CHAPTER'} || '' ;
285 $index_html .= "</UL>\n" if $chap_num > 1 ;
287 $index_html .= <<HTML ;
288 <LI>$chap_num. <A href="$slide_file">$chapter</A>
289 <UL STYLE="list-style-type:none">
293 $toc_html .= <<HTML ;
294 <LI>$chap_num. <A href="$slide_file">$chapter</A>
299 $index_html .= <<HTML ;
300 <LI>$chap_num.$slide_num <A href="$slide_file">$slide->{'TITLE'}</A>
305 $index_html .= <<HTML ;
310 $toc_html .= <<HTML ;
316 write_file( 'slides/index.html', $index_html ) ;
317 $book_values{'INDEX'} = 'index.html' ;
319 write_file( 'slides/toc.html', $toc_html ) ;
320 $book_values{'TOC'} = 'toc.html' ;
327 my( $tmpl_name, $add_values ) = @_ ;
329 my $template = $templates{ $tmpl_name } ;
331 unless( $template ) {
333 $template = read_file( "templates/$tmpl_name.tmpl" ) ;
335 $templates{ $tmpl_name } = $template ;
338 my %tmpl_values = ( %book_values, %{$add_values} ) ;
340 $template =~ s/<%(\w+?)%>/$tmpl_values{$1} || ''/ge ;
342 $template =~ s[<A HREF="">(.+?)</A>][$1]i ;
349 my( $file_name ) = shift ;
355 open( FH, $file_name ) || croak "can't open $file_name $!" ;
357 return <FH> if wantarray ;
359 read( FH, $buf, -s FH ) ;
365 my( $file_name ) = shift ;
369 open( FH, ">$file_name" ) || croak "can't create $file_name $!" ;