summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorP. J. McDermott <pjm@nac.net>2012-08-10 12:30:47 (EDT)
committer P. J. McDermott <pjm@nac.net>2012-08-10 12:30:47 (EDT)
commit5f516d09b5f33284c65b75b5c03d5144ed7c6418 (patch)
tree2b6a9c12670876deef2207bbd4ecfdcc0b9f3e0e
parent06c3d1a57a2842a5360dc2feb00af3098142b4d7 (diff)
Factor format-specific code out of modules.
-rw-r--r--scripts/MarkdownBook/Book.pm82
-rw-r--r--scripts/MarkdownBook/Book/HTML.pm103
-rw-r--r--scripts/MarkdownBook/Document.pm83
-rw-r--r--scripts/MarkdownBook/Document/HTML.pm108
-rw-r--r--scripts/MarkdownBook/Document/HTML/Appendix.pm26
-rw-r--r--scripts/MarkdownBook/Document/HTML/Chapter.pm26
-rw-r--r--scripts/MarkdownBook/Document/HTML/Index.pm26
-rwxr-xr-xscripts/postproc.pl4
8 files changed, 303 insertions, 155 deletions
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 <http://www.gnu.org/licenses/>.
+
+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 <http://www.gnu.org/licenses/>.
+
+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 <http://www.gnu.org/licenses/>.
+
+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 <http://www.gnu.org/licenses/>.
+
+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 <http://www.gnu.org/licenses/>.
+
+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();