1# makeinfo HTML output init file 2# 3# Copyright (c) 2011, 2012 Free Software Foundation, Inc. 4# Copyright (c) 2014 Andreas Cadhalpun 5# Copyright (c) 2014 Tiancheng "Timothy" Gu 6# 7# This file is part of FFmpeg. 8# 9# FFmpeg is free software; you can redistribute it and/or modify 10# it under the terms of the GNU General Public License as published by 11# the Free Software Foundation; either version 3 of the License, or 12# (at your option) any later version. 13# 14# FFmpeg is distributed in the hope that it will be useful, 15# but WITHOUT ANY WARRANTY; without even the implied warranty of 16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17# General Public License for more details. 18# 19# You should have received a copy of the GNU General Public 20# License along with FFmpeg; if not, write to the Free Software 21# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22 23# no navigation elements 24set_from_init_file('HEADERS', 0); 25 26sub ffmpeg_heading_command($$$$$) 27{ 28 my $self = shift; 29 my $cmdname = shift; 30 my $command = shift; 31 my $args = shift; 32 my $content = shift; 33 34 my $result = ''; 35 36 # not clear that it may really happen 37 if ($self->in_string) { 38 $result .= $self->command_string($command) ."\n" if ($cmdname ne 'node'); 39 $result .= $content if (defined($content)); 40 return $result; 41 } 42 43 my $element_id = $self->command_id($command); 44 $result .= "<a name=\"$element_id\"></a>\n" 45 if (defined($element_id) and $element_id ne ''); 46 47 print STDERR "Process $command " 48 .Texinfo::Structuring::_print_root_command_texi($command)."\n" 49 if ($self->get_conf('DEBUG')); 50 my $element; 51 if ($Texinfo::Common::root_commands{$command->{'cmdname'}} 52 and $command->{'parent'} 53 and $command->{'parent'}->{'type'} 54 and $command->{'parent'}->{'type'} eq 'element') { 55 $element = $command->{'parent'}; 56 } 57 if ($element) { 58 $result .= &{$self->{'format_element_header'}}($self, $cmdname, 59 $command, $element); 60 } 61 62 my $heading_level; 63 # node is used as heading if there is nothing else. 64 if ($cmdname eq 'node') { 65 if (!$element or (!$element->{'extra'}->{'section'} 66 and $element->{'extra'}->{'node'} 67 and $element->{'extra'}->{'node'} eq $command 68 # bogus node may not have been normalized 69 and defined($command->{'extra'}->{'normalized'}))) { 70 if ($command->{'extra'}->{'normalized'} eq 'Top') { 71 $heading_level = 0; 72 } else { 73 $heading_level = 3; 74 } 75 } 76 } else { 77 $heading_level = $command->{'level'}; 78 } 79 80 my $heading = $self->command_text($command); 81 # $heading not defined may happen if the command is a @node, for example 82 # if there is an error in the node. 83 if (defined($heading) and $heading ne '' and defined($heading_level)) { 84 85 if ($Texinfo::Common::root_commands{$cmdname} 86 and $Texinfo::Common::sectioning_commands{$cmdname}) { 87 my $content_href = $self->command_contents_href($command, 'contents', 88 $self->{'current_filename'}); 89 if ($content_href) { 90 my $this_href = $content_href =~ s/^\#toc-/\#/r; 91 $heading .= '<span class="pull-right">'. 92 '<a class="anchor hidden-xs" '. 93 "href=\"$this_href\" aria-hidden=\"true\">". 94 ($ENV{"FA_ICONS"} ? '<i class="fa fa-link"></i>' 95 : '#'). 96 '</a> '. 97 '<a class="anchor hidden-xs"'. 98 "href=\"$content_href\" aria-hidden=\"true\">". 99 ($ENV{"FA_ICONS"} ? '<i class="fa fa-navicon"></i>' 100 : 'TOC'). 101 '</a>'. 102 '</span>'; 103 } 104 } 105 106 if ($self->in_preformatted()) { 107 $result .= $heading."\n"; 108 } else { 109 # if the level was changed, set the command name right 110 if ($cmdname ne 'node' 111 and $heading_level ne $Texinfo::Common::command_structuring_level{$cmdname}) { 112 $cmdname 113 = $Texinfo::Common::level_to_structuring_command{$cmdname}->[$heading_level]; 114 } 115 $result .= &{$self->{'format_heading_text'}}( 116 $self, $cmdname, $heading, 117 $heading_level + 118 $self->get_conf('CHAPTER_HEADER_LEVEL') - 1, $command); 119 } 120 } 121 $result .= $content if (defined($content)); 122 return $result; 123} 124 125foreach my $command (keys(%Texinfo::Common::sectioning_commands), 'node') { 126 texinfo_register_command_formatting($command, \&ffmpeg_heading_command); 127} 128 129# print the TOC where @contents is used 130set_from_init_file('INLINE_CONTENTS', 1); 131 132# make chapters <h2> 133set_from_init_file('CHAPTER_HEADER_LEVEL', 2); 134 135# Do not add <hr> 136set_from_init_file('DEFAULT_RULE', ''); 137set_from_init_file('BIG_RULE', ''); 138 139# Customized file beginning 140sub ffmpeg_begin_file($$$) 141{ 142 my $self = shift; 143 my $filename = shift; 144 my $element = shift; 145 146 my $command; 147 if ($element and $self->get_conf('SPLIT')) { 148 $command = $self->element_command($element); 149 } 150 151 my ($title, $description, $encoding, $date, $css_lines, 152 $doctype, $bodytext, $copying_comment, $after_body_open, 153 $extra_head, $program_and_version, $program_homepage, 154 $program, $generator) = $self->_file_header_informations($command); 155 156 my $links = $self->_get_links ($filename, $element); 157 158 my $head1 = $ENV{"FFMPEG_HEADER1"} || <<EOT; 159<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 160<html> 161<!-- Created by $program_and_version, $program_homepage --> 162 <head> 163 <meta charset="utf-8"> 164 <title> 165EOT 166 my $head_title = <<EOT; 167 $title 168EOT 169 170 my $head2 = $ENV{"FFMPEG_HEADER2"} || <<EOT; 171 </title> 172 <meta name="viewport" content="width=device-width,initial-scale=1.0"> 173 <link rel="stylesheet" type="text/css" href="bootstrap.min.css"> 174 <link rel="stylesheet" type="text/css" href="style.min.css"> 175 </head> 176 <body> 177 <div class="container"> 178 <h1> 179EOT 180 181 my $head3 = $ENV{"FFMPEG_HEADER3"} || <<EOT; 182 </h1> 183EOT 184 185 return $head1 . $head_title . $head2 . $head_title . $head3; 186} 187texinfo_register_formatting_function('begin_file', \&ffmpeg_begin_file); 188 189sub ffmpeg_program_string($) 190{ 191 my $self = shift; 192 if (defined($self->get_conf('PROGRAM')) 193 and $self->get_conf('PROGRAM') ne '' 194 and defined($self->get_conf('PACKAGE_URL'))) { 195 return $self->convert_tree( 196 $self->gdt('This document was generated using @uref{{program_homepage}, @emph{{program}}}.', 197 { 'program_homepage' => $self->get_conf('PACKAGE_URL'), 198 'program' => $self->get_conf('PROGRAM') })); 199 } else { 200 return $self->convert_tree( 201 $self->gdt('This document was generated automatically.')); 202 } 203} 204texinfo_register_formatting_function('program_string', \&ffmpeg_program_string); 205 206# Customized file ending 207sub ffmpeg_end_file($) 208{ 209 my $self = shift; 210 my $program_string = &{$self->{'format_program_string'}}($self); 211 my $program_text = <<EOT; 212 <p style="font-size: small;"> 213 $program_string 214 </p> 215EOT 216 my $footer = $ENV{FFMPEG_FOOTER} || <<EOT; 217 </div> 218 </body> 219</html> 220EOT 221 return $program_text . $footer; 222} 223texinfo_register_formatting_function('end_file', \&ffmpeg_end_file); 224 225# Dummy title command 226# Ignore title. Title is handled through ffmpeg_begin_file(). 227set_from_init_file('USE_TITLEPAGE_FOR_TITLE', 1); 228sub ffmpeg_title($$$$) 229{ 230 return ''; 231} 232 233texinfo_register_command_formatting('titlefont', 234 \&ffmpeg_title); 235 236# Customized float command. Part of code borrowed from GNU Texinfo. 237sub ffmpeg_float($$$$$) 238{ 239 my $self = shift; 240 my $cmdname = shift; 241 my $command = shift; 242 my $args = shift; 243 my $content = shift; 244 245 my ($caption, $prepended) = Texinfo::Common::float_name_caption($self, 246 $command); 247 my $caption_text = ''; 248 my $prepended_text; 249 my $prepended_save = ''; 250 251 if ($self->in_string()) { 252 if ($prepended) { 253 $prepended_text = $self->convert_tree_new_formatting_context( 254 $prepended, 'float prepended'); 255 } else { 256 $prepended_text = ''; 257 } 258 if ($caption) { 259 $caption_text = $self->convert_tree_new_formatting_context( 260 {'contents' => $caption->{'args'}->[0]->{'contents'}}, 261 'float caption'); 262 } 263 return $prepended.$content.$caption_text; 264 } 265 266 my $id = $self->command_id($command); 267 my $label; 268 if (defined($id) and $id ne '') { 269 $label = "<a name=\"$id\"></a>"; 270 } else { 271 $label = ''; 272 } 273 274 if ($prepended) { 275 if ($caption) { 276 # prepend the prepended tree to the first paragraph 277 my @caption_original_contents = @{$caption->{'args'}->[0]->{'contents'}}; 278 my @caption_contents; 279 my $new_paragraph; 280 while (@caption_original_contents) { 281 my $content = shift @caption_original_contents; 282 if ($content->{'type'} and $content->{'type'} eq 'paragraph') { 283 %{$new_paragraph} = %{$content}; 284 $new_paragraph->{'contents'} = [@{$content->{'contents'}}]; 285 unshift (@{$new_paragraph->{'contents'}}, {'cmdname' => 'strong', 286 'args' => [{'type' => 'brace_command_arg', 287 'contents' => [$prepended]}]}); 288 push @caption_contents, $new_paragraph; 289 last; 290 } else { 291 push @caption_contents, $content; 292 } 293 } 294 push @caption_contents, @caption_original_contents; 295 if ($new_paragraph) { 296 $caption_text = $self->convert_tree_new_formatting_context( 297 {'contents' => \@caption_contents}, 'float caption'); 298 $prepended_text = ''; 299 } 300 } 301 if ($caption_text eq '') { 302 $prepended_text = $self->convert_tree_new_formatting_context( 303 $prepended, 'float prepended'); 304 if ($prepended_text ne '') { 305 $prepended_save = $prepended_text; 306 $prepended_text = '<p><strong>'.$prepended_text.'</strong></p>'; 307 } 308 } 309 } else { 310 $prepended_text = ''; 311 } 312 313 if ($caption and $caption_text eq '') { 314 $caption_text = $self->convert_tree_new_formatting_context( 315 $caption->{'args'}->[0], 'float caption'); 316 } 317 if ($prepended_text.$caption_text ne '') { 318 $prepended_text = $self->_attribute_class('div','float-caption'). '>' 319 . $prepended_text; 320 $caption_text .= '</div>'; 321 } 322 my $html_class = ''; 323 if ($prepended_save =~ /NOTE/) { 324 $html_class = 'info'; 325 $prepended_text = ''; 326 $caption_text = ''; 327 } elsif ($prepended_save =~ /IMPORTANT/) { 328 $html_class = 'warning'; 329 $prepended_text = ''; 330 $caption_text = ''; 331 } 332 return $self->_attribute_class('div', $html_class). '>' . "\n" . 333 $prepended_text . $caption_text . $content . '</div>'; 334} 335 336texinfo_register_command_formatting('float', 337 \&ffmpeg_float); 338 3391; 340