# 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::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;