diff options
Diffstat (limited to 'doc/t2h.pm')
-rw-r--r-- | doc/t2h.pm | 339 |
1 files changed, 339 insertions, 0 deletions
diff --git a/doc/t2h.pm b/doc/t2h.pm new file mode 100644 index 0000000..5efb2da --- /dev/null +++ b/doc/t2h.pm @@ -0,0 +1,339 @@ +# makeinfo HTML output init file +# +# Copyright (c) 2011, 2012 Free Software Foundation, Inc. +# Copyright (c) 2014 Andreas Cadhalpun +# Copyright (c) 2014 Tiancheng "Timothy" Gu +# +# This file is part of FFmpeg. +# +# FFmpeg 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. +# +# FFmpeg 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 FFmpeg; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# no navigation elements +set_from_init_file('HEADERS', 0); + +sub ffmpeg_heading_command($$$$$) +{ + my $self = shift; + my $cmdname = shift; + my $command = shift; + my $args = shift; + my $content = shift; + + my $result = ''; + + # not clear that it may really happen + if ($self->in_string) { + $result .= $self->command_string($command) ."\n" if ($cmdname ne 'node'); + $result .= $content if (defined($content)); + return $result; + } + + my $element_id = $self->command_id($command); + $result .= "<a name=\"$element_id\"></a>\n" + if (defined($element_id) and $element_id ne ''); + + print STDERR "Process $command " + .Texinfo::Structuring::_print_root_command_texi($command)."\n" + if ($self->get_conf('DEBUG')); + my $element; + if ($Texinfo::Common::root_commands{$command->{'cmdname'}} + and $command->{'parent'} + and $command->{'parent'}->{'type'} + and $command->{'parent'}->{'type'} eq 'element') { + $element = $command->{'parent'}; + } + if ($element) { + $result .= &{$self->{'format_element_header'}}($self, $cmdname, + $command, $element); + } + + my $heading_level; + # node is used as heading if there is nothing else. + if ($cmdname eq 'node') { + if (!$element or (!$element->{'extra'}->{'section'} + and $element->{'extra'}->{'node'} + and $element->{'extra'}->{'node'} eq $command + # bogus node may not have been normalized + and defined($command->{'extra'}->{'normalized'}))) { + if ($command->{'extra'}->{'normalized'} eq 'Top') { + $heading_level = 0; + } else { + $heading_level = 3; + } + } + } else { + $heading_level = $command->{'level'}; + } + + my $heading = $self->command_text($command); + # $heading not defined may happen if the command is a @node, for example + # if there is an error in the node. + if (defined($heading) and $heading ne '' and defined($heading_level)) { + + if ($Texinfo::Common::root_commands{$cmdname} + and $Texinfo::Common::sectioning_commands{$cmdname}) { + my $content_href = $self->command_contents_href($command, 'contents', + $self->{'current_filename'}); + if ($content_href) { + my $this_href = $content_href =~ s/^\#toc-/\#/r; + $heading .= '<span class="pull-right">'. + '<a class="anchor hidden-xs" '. + "href=\"$this_href\" aria-hidden=\"true\">". + ($ENV{"FA_ICONS"} ? '<i class="fa fa-link"></i>' + : '#'). + '</a> '. + '<a class="anchor hidden-xs"'. + "href=\"$content_href\" aria-hidden=\"true\">". + ($ENV{"FA_ICONS"} ? '<i class="fa fa-navicon"></i>' + : 'TOC'). + '</a>'. + '</span>'; + } + } + + if ($self->in_preformatted()) { + $result .= $heading."\n"; + } else { + # if the level was changed, set the command name right + if ($cmdname ne 'node' + and $heading_level ne $Texinfo::Common::command_structuring_level{$cmdname}) { + $cmdname + = $Texinfo::Common::level_to_structuring_command{$cmdname}->[$heading_level]; + } + $result .= &{$self->{'format_heading_text'}}( + $self, $cmdname, $heading, + $heading_level + + $self->get_conf('CHAPTER_HEADER_LEVEL') - 1, $command); + } + } + $result .= $content if (defined($content)); + return $result; +} + +foreach my $command (keys(%Texinfo::Common::sectioning_commands), 'node') { + texinfo_register_command_formatting($command, \&ffmpeg_heading_command); +} + +# print the TOC where @contents is used +set_from_init_file('INLINE_CONTENTS', 1); + +# make chapters <h2> +set_from_init_file('CHAPTER_HEADER_LEVEL', 2); + +# Do not add <hr> +set_from_init_file('DEFAULT_RULE', ''); +set_from_init_file('BIG_RULE', ''); + +# Customized file beginning +sub ffmpeg_begin_file($$$) +{ + my $self = shift; + my $filename = shift; + my $element = shift; + + my $command; + if ($element and $self->get_conf('SPLIT')) { + $command = $self->element_command($element); + } + + my ($title, $description, $encoding, $date, $css_lines, + $doctype, $bodytext, $copying_comment, $after_body_open, + $extra_head, $program_and_version, $program_homepage, + $program, $generator) = $self->_file_header_informations($command); + + my $links = $self->_get_links ($filename, $element); + + my $head1 = $ENV{"FFMPEG_HEADER1"} || <<EOT; +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> +<html> +<!-- Created by $program_and_version, $program_homepage --> + <head> + <meta charset="utf-8"> + <title> +EOT + my $head_title = <<EOT; + $title +EOT + + my $head2 = $ENV{"FFMPEG_HEADER2"} || <<EOT; + </title> + <meta name="viewport" content="width=device-width,initial-scale=1.0"> + <link rel="stylesheet" type="text/css" href="bootstrap.min.css"> + <link rel="stylesheet" type="text/css" href="style.min.css"> + </head> + <body> + <div style="width: 95%; margin: auto"> + <h1> +EOT + + my $head3 = $ENV{"FFMPEG_HEADER3"} || <<EOT; + </h1> +EOT + + return $head1 . $head_title . $head2 . $head_title . $head3; +} +texinfo_register_formatting_function('begin_file', \&ffmpeg_begin_file); + +sub ffmpeg_program_string($) +{ + my $self = shift; + if (defined($self->get_conf('PROGRAM')) + and $self->get_conf('PROGRAM') ne '' + and defined($self->get_conf('PACKAGE_URL'))) { + return $self->convert_tree( + $self->gdt('This document was generated using @uref{{program_homepage}, @emph{{program}}}.', + { 'program_homepage' => $self->get_conf('PACKAGE_URL'), + 'program' => $self->get_conf('PROGRAM') })); + } else { + return $self->convert_tree( + $self->gdt('This document was generated automatically.')); + } +} +texinfo_register_formatting_function('program_string', \&ffmpeg_program_string); + +# Customized file ending +sub ffmpeg_end_file($) +{ + my $self = shift; + my $program_string = &{$self->{'format_program_string'}}($self); + my $program_text = <<EOT; + <p style="font-size: small;"> + $program_string + </p> +EOT + my $footer = $ENV{FFMPEG_FOOTER} || <<EOT; + </div> + </body> +</html> +EOT + return $program_text . $footer; +} +texinfo_register_formatting_function('end_file', \&ffmpeg_end_file); + +# Dummy title command +# Ignore title. Title is handled through ffmpeg_begin_file(). +set_from_init_file('USE_TITLEPAGE_FOR_TITLE', 1); +sub ffmpeg_title($$$$) +{ + return ''; +} + +texinfo_register_command_formatting('titlefont', + \&ffmpeg_title); + +# Customized float command. Part of code borrowed from GNU Texinfo. +sub ffmpeg_float($$$$$) +{ + my $self = shift; + my $cmdname = shift; + my $command = shift; + my $args = shift; + my $content = shift; + + my ($caption, $prepended) = Texinfo::Common::float_name_caption($self, + $command); + my $caption_text = ''; + my $prepended_text; + my $prepended_save = ''; + + if ($self->in_string()) { + if ($prepended) { + $prepended_text = $self->convert_tree_new_formatting_context( + $prepended, 'float prepended'); + } else { + $prepended_text = ''; + } + if ($caption) { + $caption_text = $self->convert_tree_new_formatting_context( + {'contents' => $caption->{'args'}->[0]->{'contents'}}, + 'float caption'); + } + return $prepended.$content.$caption_text; + } + + my $id = $self->command_id($command); + my $label; + if (defined($id) and $id ne '') { + $label = "<a name=\"$id\"></a>"; + } else { + $label = ''; + } + + if ($prepended) { + if ($caption) { + # prepend the prepended tree to the first paragraph + my @caption_original_contents = @{$caption->{'args'}->[0]->{'contents'}}; + my @caption_contents; + my $new_paragraph; + while (@caption_original_contents) { + my $content = shift @caption_original_contents; + if ($content->{'type'} and $content->{'type'} eq 'paragraph') { + %{$new_paragraph} = %{$content}; + $new_paragraph->{'contents'} = [@{$content->{'contents'}}]; + unshift (@{$new_paragraph->{'contents'}}, {'cmdname' => 'strong', + 'args' => [{'type' => 'brace_command_arg', + 'contents' => [$prepended]}]}); + push @caption_contents, $new_paragraph; + last; + } else { + push @caption_contents, $content; + } + } + push @caption_contents, @caption_original_contents; + if ($new_paragraph) { + $caption_text = $self->convert_tree_new_formatting_context( + {'contents' => \@caption_contents}, 'float caption'); + $prepended_text = ''; + } + } + if ($caption_text eq '') { + $prepended_text = $self->convert_tree_new_formatting_context( + $prepended, 'float prepended'); + if ($prepended_text ne '') { + $prepended_save = $prepended_text; + $prepended_text = '<p><strong>'.$prepended_text.'</strong></p>'; + } + } + } else { + $prepended_text = ''; + } + + if ($caption and $caption_text eq '') { + $caption_text = $self->convert_tree_new_formatting_context( + $caption->{'args'}->[0], 'float caption'); + } + if ($prepended_text.$caption_text ne '') { + $prepended_text = $self->_attribute_class('div','float-caption'). '>' + . $prepended_text; + $caption_text .= '</div>'; + } + my $html_class = ''; + if ($prepended_save =~ /NOTE/) { + $html_class = 'info'; + $prepended_text = ''; + $caption_text = ''; + } elsif ($prepended_save =~ /IMPORTANT/) { + $html_class = 'warning'; + $prepended_text = ''; + $caption_text = ''; + } + return $self->_attribute_class('div', $html_class). '>' . "\n" . + $prepended_text . $caption_text . $content . '</div>'; +} + +texinfo_register_command_formatting('float', + \&ffmpeg_float); + +1; |