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