| # 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 class="container"> |
| <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; |