summaryrefslogtreecommitdiffstats
path: root/scripts/MarkdownBook/Book.pm
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/MarkdownBook/Book.pm')
-rw-r--r--scripts/MarkdownBook/Book.pm193
1 files changed, 193 insertions, 0 deletions
diff --git a/scripts/MarkdownBook/Book.pm b/scripts/MarkdownBook/Book.pm
new file mode 100644
index 0000000..f2d723a
--- /dev/null
+++ b/scripts/MarkdownBook/Book.pm
@@ -0,0 +1,193 @@
+# 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::Index;
+use MarkdownBook::Document::Chapter;
+use MarkdownBook::Document::Appendix;
+use HTML::Template;
+
+package MarkdownBook::Book;
+
+sub new
+{
+ my ($class, $dir) = @_;
+ my $self;
+ my $control_fh;
+
+ $class = ref($class) || $class;
+ $self = {};
+ bless($self,$class);
+ $self->{'dir'} = $dir;
+ $self->{'docs'} = [];
+
+ open($control_fh, '<', $dir . '/control');
+ while (<$control_fh>) {
+ chomp($_);
+ if (m/^Title: /) {
+ s/^Title: (.*)$/$1/;
+ $self->{'title'} = $_;
+ }
+ }
+ close($control_fh);
+
+ return $self;
+}
+
+sub dir
+{
+ my ($self, $dir) = @_;
+ my $old = $self->{'dir'};
+
+ $self->{'dir'} = $dir if defined($dir);
+
+ return $old;
+}
+
+sub title
+{
+ my ($self, $title) = @_;
+ my $old = $self->{'title'};
+
+ $self->{'title'} = $title if defined($title);
+
+ return $old;
+}
+
+sub create_documents
+{
+ my ($self) = @_;
+ my $series_fh;
+ my $file;
+ my $title;
+ my $i;
+ my $doc;
+ my $doc_prev;
+ my @letters;
+
+ $i = 0;
+ $doc = MarkdownBook::Document::Index->new($self);
+ $doc_prev = $doc;
+ push(@{$self->{'docs'}}, $doc);
+
+ open($series_fh, '<', $self->{'dir'} . '/chapters');
+ while (<$series_fh>) {
+ chomp($_);
+ ($file, $title) = split(/[ \t]+/, $_, 2);
+ $doc = MarkdownBook::Document::Chapter->new($self, $file,
+ ++$i, $title);
+ $doc->prev($doc_prev);
+ $doc_prev->next($doc) if defined $doc_prev;
+ $doc_prev = $doc;
+ push(@{$self->{'docs'}}, $doc);
+ }
+ close($series_fh);
+
+ $i = -1;
+ @letters = ('A' .. 'Z');
+
+ if (-e $self->{'dir'} . '/appendices') {
+ open($series_fh, '<', $self->{'dir'} . '/apendices');
+ while (<$series_fh>) {
+ chomp($_);
+ ($file, $title) = split(/[ \t]+/, $_, 2);
+ $doc = MarkdownBook::Document::Appendix->new($self, $file,
+ $letters[++$i], $title);
+ $doc->prev($doc_prev);
+ $doc_prev->next($doc) if defined $doc_prev;
+ $doc_prev = $doc;
+ push(@{$self->{'docs'}}, $doc);
+ }
+ close($series_fh);
+ }
+}
+
+sub list_documents
+{
+ my ($self) = @_;
+ my $doc;
+
+ foreach $doc (@{$self->{'docs'}}) {
+ printf("Document:\n File: %s\n Title: %s\n Full Title: %s\n",
+ $doc->file(), $doc->title(), $doc->full_title());
+ printf(" Prev: %s\n", $doc->prev()->file()) if defined $doc->prev();
+ printf(" Next: %s\n", $doc->next()->file()) if defined $doc->next();
+ }
+}
+
+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_tmpl) 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;