From 5f516d09b5f33284c65b75b5c03d5144ed7c6418 Mon Sep 17 00:00:00 2001 From: P. J. McDermott Date: Fri, 10 Aug 2012 12:30:47 -0400 Subject: Factor format-specific code out of modules. --- diff --git a/scripts/MarkdownBook/Book.pm b/scripts/MarkdownBook/Book.pm index fd43041..547a4f0 100644 --- a/scripts/MarkdownBook/Book.pm +++ b/scripts/MarkdownBook/Book.pm @@ -16,22 +16,18 @@ use strict; use warnings; -use MarkdownBook::Document::Index; -use MarkdownBook::Document::Chapter; -use MarkdownBook::Document::Appendix; -use HTML::Template; - package MarkdownBook::Book; sub new { - my ($class, $dir) = @_; + my ($class, $format, $dir) = @_; my $self; my $control_fh; $class = ref($class) || $class; $self = {}; bless($self,$class); + $self->{'format'} = $format; $self->{'dir'} = $dir; $self->{'docs'} = []; @@ -68,6 +64,13 @@ sub title return $old; } +sub get_document_module +{ + my ($self, $mod) = @_; + + return 'MarkdownBook::Document::' . $self->{'format'} . '::' . $mod; +} + sub create_documents { my ($self) = @_; @@ -80,7 +83,7 @@ sub create_documents my @letters; $i = 0; - $doc = MarkdownBook::Document::Index->new($self); + $doc = $self->get_document_module('Index')->new($self); $doc_prev = $doc; push(@{$self->{'docs'}}, $doc); @@ -88,7 +91,7 @@ sub create_documents while (<$series_fh>) { chomp($_); ($file, $title) = split(/[ \t]+/, $_, 2); - $doc = MarkdownBook::Document::Chapter->new($self, $file, + $doc = $self->get_document_module('Chapter')->new($self, $file, ++$i, $title); $doc->prev($doc_prev); $doc_prev->next($doc) if defined $doc_prev; @@ -105,7 +108,7 @@ sub create_documents while (<$series_fh>) { chomp($_); ($file, $title) = split(/[ \t]+/, $_, 2); - $doc = MarkdownBook::Document::Appendix->new($self, $file, + $doc = $self->get_document_module('Appendix')->new($self, $file, $letters[++$i], $title); $doc->prev($doc_prev); $doc_prev->next($doc) if defined $doc_prev; @@ -129,65 +132,4 @@ sub list_documents } } -sub parse_documents -{ - my ($self) = @_; - my $doc; - - foreach $doc (@{$self->{'docs'}}) { - $doc->parse_html(); - } -} - -sub number_sections -{ - my ($self) = @_; - my $doc; - - foreach $doc (@{$self->{'docs'}}) { - $doc->number_sections(); - } -} - -sub write_templated_documents -{ - my ($self) = @_; - my $doc_tmpl; - my $doc; - my $doc_fh; - - $doc_tmpl = HTML::Template->new(filename => 'include/document.tmpl'); - - foreach $doc (@{$self->{'docs'}}) { - - $doc_tmpl->param( - IS_INDEX => (ref($doc) eq 'MarkdownBook::Document::Index')); - - $doc_tmpl->param(BOOK_TITLE => $self->{'title'}); - $doc_tmpl->param(TITLE => $doc->title()); - $doc_tmpl->param(CHAPT_TITLE => $doc->full_title()); - - if (defined($doc->prev())) { - $doc_tmpl->param(PREV_LINK => $doc->prev()->file() . '.html'); - $doc_tmpl->param(PREV_TITLE => $doc->prev()->title()); - } else { - $doc_tmpl->param(PREV_LINK => undef); - $doc_tmpl->param(PREV_TITLE => undef); - } - if (defined($doc->next())) { - $doc_tmpl->param(NEXT_LINK => $doc->next()->file() . '.html'); - $doc_tmpl->param(NEXT_TITLE => $doc->next()->title()); - } else { - $doc_tmpl->param(NEXT_LINK => undef); - $doc_tmpl->param(NEXT_TITLE => undef); - } - - $doc_tmpl->param(BODY => $doc->output()); - - open($doc_fh, '>', $doc->file_path() . '.html'); - $doc_tmpl->output(print_to => $doc_fh); - close($doc_fh); - } -} - 1; diff --git a/scripts/MarkdownBook/Book/HTML.pm b/scripts/MarkdownBook/Book/HTML.pm new file mode 100644 index 0000000..67acc34 --- /dev/null +++ b/scripts/MarkdownBook/Book/HTML.pm @@ -0,0 +1,103 @@ +# Copyright (C) 2012 Patrick "P. J." McDermott +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +use strict; +use warnings; + +use MarkdownBook::Document::HTML::Index; +use MarkdownBook::Document::HTML::Chapter; +use MarkdownBook::Document::HTML::Appendix; +use HTML::Template; + +package MarkdownBook::Book::HTML; + +use base qw(MarkdownBook::Book); + +sub new +{ + my ($class, @args) = @_; + my $self; + + $class = ref($class) || $class; + $self = {}; + bless($self,$class); + + $self = $self->SUPER::new('HTML', @args); + + return $self; +} + +sub parse_documents +{ + my ($self) = @_; + my $doc; + + foreach $doc (@{$self->{'docs'}}) { + $doc->parse_html(); + } +} + +sub number_sections +{ + my ($self) = @_; + my $doc; + + foreach $doc (@{$self->{'docs'}}) { + $doc->number_sections(); + } +} + +sub write_templated_documents +{ + my ($self) = @_; + my $doc_tmpl; + my $doc; + my $doc_fh; + + $doc_tmpl = HTML::Template->new(filename => 'include/document.tmpl'); + + foreach $doc (@{$self->{'docs'}}) { + + $doc_tmpl->param( + IS_INDEX => (ref($doc) eq $self->get_document_module('Index'))); + + $doc_tmpl->param(BOOK_TITLE => $self->{'title'}); + $doc_tmpl->param(TITLE => $doc->title()); + $doc_tmpl->param(CHAPT_TITLE => $doc->full_title()); + + if (defined($doc->prev())) { + $doc_tmpl->param(PREV_LINK => $doc->prev()->file() . '.html'); + $doc_tmpl->param(PREV_TITLE => $doc->prev()->title()); + } else { + $doc_tmpl->param(PREV_LINK => undef); + $doc_tmpl->param(PREV_TITLE => undef); + } + if (defined($doc->next())) { + $doc_tmpl->param(NEXT_LINK => $doc->next()->file() . '.html'); + $doc_tmpl->param(NEXT_TITLE => $doc->next()->title()); + } else { + $doc_tmpl->param(NEXT_LINK => undef); + $doc_tmpl->param(NEXT_TITLE => undef); + } + + $doc_tmpl->param(BODY => $doc->output()); + + open($doc_fh, '>', $doc->file_path() . '.html'); + $doc_tmpl->output(print_to => $doc_fh); + close($doc_fh); + } +} + +1; diff --git a/scripts/MarkdownBook/Document.pm b/scripts/MarkdownBook/Document.pm index f9b9a13..249cdf6 100644 --- a/scripts/MarkdownBook/Document.pm +++ b/scripts/MarkdownBook/Document.pm @@ -94,87 +94,4 @@ sub next return $old; } -sub parse_html -{ - my ($self) = @_; - my $file = $self->{'book'}->dir() . '/' . $self->{'file'} . '.html.in'; - - $self->{'tree'} = HTML::TreeBuilder->new(); - $self->{'tree'}->parse_file($file); -} - -sub number_sections -{ - my ($self) = @_; - - my @headers; - my $header; - my @secnums = (0, 0); - my $curlev = -1; - my $newlev; - my $secstr; - my @children; - my $sectitle; - my $secid; - - @{$self->{'tree_body'}} = MarkdownBook::HTMLTree::find_elements_by_tag_names( - $self->{'tree'}, ('body')); - @headers = MarkdownBook::HTMLTree::find_elements_by_tag_names( - @{$self->{'tree_body'}}[0], ('h1', 'h2')); - - foreach $header (@headers) { - - # Calculate section number. - $newlev = $header->tag(); - $newlev =~ s/^h(\d)$/$1/; - if ($newlev != $curlev) { - foreach (@secnums[$newlev .. $#secnums]) { - $_ = 0; - } - } - $curlev = $newlev; - ++$secnums[$newlev - 1]; - $secstr = join('.', @secnums); - $secstr =~ s/(\.0)*$//; - - MarkdownBook::HTMLTree::each_text(sub { - - # Prefix section title with section number. - my $sectitle = $_[1]; - $sectitle =~ s/^([^\[]+)[ ]*\[[^\]]+\]$/$_[2].$secstr $1/; - - # Set "id" attribute. - if ($_[1] =~ m/^[^\[\]]*\[([^\]]+)\][^\[\]]*$/) { - my $secid = $_[1]; - $secid =~ s/^[^\[\]]*\[([^\]]+)\][^\[\]]*$/$1/; - ${$_[0]}->attr('id', $secid); - } - - # Set section title. - $_[1] = $sectitle; - - }, $header, $self->{'id'}); - - } -} - -sub output -{ - my ($self) = @_; - - my $elem; - my %opt_end_tags; - my $out; - - # Don't omit any end tags. - %opt_end_tags = map([$_ => 0], %HTML::Element::optionalEndTag); - - foreach $elem (@{$self->{'tree_body'}}[0]->content_list()) { - # It's safe to assume (ref($elem) eq 'HTML::Element'). - $out .= $elem->as_HTML('<>&', '', \%opt_end_tags) . "\n"; - } - - return $out; -} - 1; diff --git a/scripts/MarkdownBook/Document/HTML.pm b/scripts/MarkdownBook/Document/HTML.pm new file mode 100644 index 0000000..ce19f45 --- /dev/null +++ b/scripts/MarkdownBook/Document/HTML.pm @@ -0,0 +1,108 @@ +# Copyright (C) 2012 Patrick "P. J." McDermott +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +use strict; +use warnings; + +use MarkdownBook::Document; + +package MarkdownBook::Document::HTML; + +our @ISA = qw(MarkdownBook::Document); + +sub parse_html +{ + my ($self) = @_; + my $file = $self->{'book'}->dir() . '/' . $self->{'file'} . '.html.in'; + + $self->{'tree'} = HTML::TreeBuilder->new(); + $self->{'tree'}->parse_file($file); +} + +sub number_sections +{ + my ($self) = @_; + + my @headers; + my $header; + my @secnums = (0, 0); + my $curlev = -1; + my $newlev; + my $secstr; + my @children; + my $sectitle; + my $secid; + + @{$self->{'tree_body'}} = MarkdownBook::HTMLTree::find_elements_by_tag_names( + $self->{'tree'}, ('body')); + @headers = MarkdownBook::HTMLTree::find_elements_by_tag_names( + @{$self->{'tree_body'}}[0], ('h1', 'h2')); + + foreach $header (@headers) { + + # Calculate section number. + $newlev = $header->tag(); + $newlev =~ s/^h(\d)$/$1/; + if ($newlev != $curlev) { + foreach (@secnums[$newlev .. $#secnums]) { + $_ = 0; + } + } + $curlev = $newlev; + ++$secnums[$newlev - 1]; + $secstr = join('.', @secnums); + $secstr =~ s/(\.0)*$//; + + MarkdownBook::HTMLTree::each_text(sub { + + # Prefix section title with section number. + my $sectitle = $_[1]; + $sectitle =~ s/^([^\[]+)[ ]*\[[^\]]+\]$/$_[2].$secstr $1/; + + # Set "id" attribute. + if ($_[1] =~ m/^[^\[\]]*\[([^\]]+)\][^\[\]]*$/) { + my $secid = $_[1]; + $secid =~ s/^[^\[\]]*\[([^\]]+)\][^\[\]]*$/$1/; + ${$_[0]}->attr('id', $secid); + } + + # Set section title. + $_[1] = $sectitle; + + }, $header, $self->{'id'}); + + } +} + +sub output +{ + my ($self) = @_; + + my $elem; + my %opt_end_tags; + my $out; + + # Don't omit any end tags. + %opt_end_tags = map([$_ => 0], %HTML::Element::optionalEndTag); + + foreach $elem (@{$self->{'tree_body'}}[0]->content_list()) { + # It's safe to assume (ref($elem) eq 'HTML::Element'). + $out .= $elem->as_HTML('<>&', '', \%opt_end_tags) . "\n"; + } + + return $out; +} + +1; diff --git a/scripts/MarkdownBook/Document/HTML/Appendix.pm b/scripts/MarkdownBook/Document/HTML/Appendix.pm new file mode 100644 index 0000000..506b7d2 --- /dev/null +++ b/scripts/MarkdownBook/Document/HTML/Appendix.pm @@ -0,0 +1,26 @@ +# Copyright (C) 2012 Patrick "P. J." McDermott +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +use strict; +use warnings; + +use MarkdownBook::Document::HTML; +use MarkdownBook::Document::Appendix; + +package MarkdownBook::Document::HTML::Appendix; + +our @ISA = qw(MarkdownBook::Document::Appendix MarkdownBook::Document::HTML); + +1; diff --git a/scripts/MarkdownBook/Document/HTML/Chapter.pm b/scripts/MarkdownBook/Document/HTML/Chapter.pm new file mode 100644 index 0000000..49d2511 --- /dev/null +++ b/scripts/MarkdownBook/Document/HTML/Chapter.pm @@ -0,0 +1,26 @@ +# Copyright (C) 2012 Patrick "P. J." McDermott +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +use strict; +use warnings; + +use MarkdownBook::Document::HTML; +use MarkdownBook::Document::Chapter; + +package MarkdownBook::Document::HTML::Chapter; + +our @ISA = qw(MarkdownBook::Document::Chapter MarkdownBook::Document::HTML); + +1; diff --git a/scripts/MarkdownBook/Document/HTML/Index.pm b/scripts/MarkdownBook/Document/HTML/Index.pm new file mode 100644 index 0000000..355f179 --- /dev/null +++ b/scripts/MarkdownBook/Document/HTML/Index.pm @@ -0,0 +1,26 @@ +# Copyright (C) 2012 Patrick "P. J." McDermott +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +use strict; +use warnings; + +use MarkdownBook::Document::HTML; +use MarkdownBook::Document::Index; + +package MarkdownBook::Document::HTML::Index; + +our @ISA = qw(MarkdownBook::Document::Index MarkdownBook::Document::HTML); + +1; diff --git a/scripts/postproc.pl b/scripts/postproc.pl index d45b022..e9bee91 100755 --- a/scripts/postproc.pl +++ b/scripts/postproc.pl @@ -18,14 +18,14 @@ use strict; use warnings; -use MarkdownBook::Book; +use MarkdownBook::Book::HTML; my $doc_dir; my $book; ($doc_dir) = @ARGV; -$book = MarkdownBook::Book->new($doc_dir); +$book = MarkdownBook::Book::HTML->new($doc_dir); $book->create_documents(); $book->parse_documents(); -- cgit v0.9.1