diff options
Diffstat (limited to 'lib/Text/MarkdownBook/Document')
-rw-r--r-- | lib/Text/MarkdownBook/Document/html.pm | 154 | ||||
-rw-r--r-- | lib/Text/MarkdownBook/Document/txt.pm | 46 |
2 files changed, 200 insertions, 0 deletions
diff --git a/lib/Text/MarkdownBook/Document/html.pm b/lib/Text/MarkdownBook/Document/html.pm new file mode 100644 index 0000000..e074de0 --- /dev/null +++ b/lib/Text/MarkdownBook/Document/html.pm @@ -0,0 +1,154 @@ +# 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 Text::MarkdownBook::Document; +use Text::MarkdownBook::HTMLTree; +use Carp; +use Text::Markdown; +use HTML::TreeBuilder; +use HTML::Template; + +package Text::MarkdownBook::Document::html; + +our @ISA = qw(Text::MarkdownBook::Document); + +sub output +{ + my ($self) = @_; + my $text; + my $doc; + my $sec; + + # Substitute macros. + $text = $self->{'book'}->subst_macros( + $self->{'source_text'}); + + # Append link definitions. + $text .= "\n"; + foreach $doc (@{$self->{'book'}->documents()}) { + $text .= "\n"; + $text .= '['; + $text .= $doc->file(); + $text .= ']: '; + $text .= $doc->file(); + $text .= '.html'; + foreach $sec (@{$doc->sections()}) { + $text .= "\n"; + $text .= '['; + $text .= $sec->id(); + $text .= ']: '; + $text .= $doc->file(); + $text .= '.html#'; + $text .= $sec->id(); + } + } + + # Convert to HTML. + $text = Text::Markdown::Markdown($text); + + # Set "id" attributes of headings. + $self->_do_set_heading_id_attrs($text); + + # Output the templated HTML. + $self->_do_output_template(); + + # Clean up. + $self->{'tree'}->delete(); +} + +sub _do_set_heading_id_attrs +{ + my ($self, $text) = @_; + my @headings; + my $heading; + my $i = -1; + + # Parse HTML. + $self->{'tree'} = HTML::TreeBuilder->new(); + $self->{'tree'}->parse($text); + $self->{'tree'}->eof($text); + + # Find the "body" element. + @{$self->{'tree_body'}} = + Text::MarkdownBook::HTMLTree::find_elements_by_tag_names( + $self->{'tree'}, ('body')); + + # Don't modify headings of index documents. + return if $self->{'type'} eq 'index'; + + # Find all headings. + @headings = Text::MarkdownBook::HTMLTree::find_elements_by_tag_names( + @{$self->{'tree_body'}}[0], ('h1', 'h2')); + + # Set "id" attributes. + foreach $heading (@headings) { + $heading->attr('id', ${$self->{'sections'}}[++$i]->id()); + } +} + +sub _do_output_template +{ + my ($self) = @_; + + my $doc_tmpl; + my %opt_end_tags; + my $elem; + my $body; + my $doc_fh; + + $doc_tmpl = HTML::Template->new(filename => 'include/document.tmpl'); + + # Don't omit any end tags. + %opt_end_tags = map([$_ => 0], %HTML::Element::optionalEndTag); + + # Get HTML text of all children of the "body" element. + foreach $elem (@{$self->{'tree_body'}}[0]->content_list()) { + # It's safe to assume (ref($elem) eq 'HTML::Element'). + $body .= $elem->as_HTML('<>&', '', \%opt_end_tags) . "\n"; + } + + $doc_tmpl->param(IS_INDEX => ($self->{'type'} eq 'index')); + + $doc_tmpl->param(BOOK_TITLE => $self->{'book'}->title()); + $doc_tmpl->param(TITLE => $self->{'title'}); + $doc_tmpl->param(CHAPT_TITLE => $self->full_title()); + + if (defined($self->{'prev'})) { + $doc_tmpl->param(PREV_LINK => $self->{'prev'}->file() . '.html'); + $doc_tmpl->param(PREV_TITLE => $self->{'prev'}->title()); + } else { + $doc_tmpl->param(PREV_LINK => undef); + $doc_tmpl->param(PREV_TITLE => undef); + } + if (defined($self->{'next'})) { + $doc_tmpl->param(NEXT_LINK => $self->{'next'}->file() . '.html'); + $doc_tmpl->param(NEXT_TITLE => $self->{'next'}->title()); + } else { + $doc_tmpl->param(NEXT_LINK => undef); + $doc_tmpl->param(NEXT_TITLE => undef); + } + + $doc_tmpl->param(BODY => $body); + + open($doc_fh, '>', $self->file_path() . '.html') + or Carp::croak('Cannot open "' . $self->{'file'} . '" destination document'); + $doc_tmpl->output(print_to => $doc_fh); + close($doc_fh); +} + +1; diff --git a/lib/Text/MarkdownBook/Document/txt.pm b/lib/Text/MarkdownBook/Document/txt.pm new file mode 100644 index 0000000..f2a8a77 --- /dev/null +++ b/lib/Text/MarkdownBook/Document/txt.pm @@ -0,0 +1,46 @@ +# 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 Text::MarkdownBook::Document; +use Carp; + +package Text::MarkdownBook::Document::txt; + +our @ISA = qw(Text::MarkdownBook::Document); + +sub output +{ + my ($self) = @_; + my $out_fh; + + open($out_fh, '>', + $self->{'book'}->dir() . '/' . $self->{'file'} . '.txt') + or Carp::croak('Cannot open "' . $self->{'file'} . + '" destination document'); + + # Print document title. + print($out_fh $self->{'title'} . "\n" . + '*' x length($self->{'title'}) . "\n\n\n"); + + # Print document text with macro substitutions. + print($out_fh $self->{'book'}->subst_macros($self->{'source_text'})); + + close($out_fh); +} + +1; |