[FFmpeg-devel] [PATCH] Use makeinfo to generate html doc for the new website

Timothy Gu timothygu99 at gmail.com
Mon Sep 1 04:39:35 CEST 2014


This is a new iteration of the patch that has been stalled for more than a
month. Finally got time to work on it.

Change since last patch:
- Fix compilation on machines with makeinfo < 5 that don't support HTML
  output.

---8<---
texi2html is deprecated by upstream in favor of makeinfo/texi2any. See:

- https://www.gnu.org/software/texinfo/manual/texinfo/html_node/texi2html.html
- https://wiki.debian.org/Texi2htmlTransition
- https://lists.debian.org/debian-devel/2013/05/msg01516.html

This is actually two separate changes. But as makeinfo and texi2html
adopt 2 (very) different init file syntaxes, it is easier to do the two
transitions at once.

Based on a patch by Andreas Cadhalpun <Andreas.Cadhalpun at googlemail.com>.

Fixes Trac ticket #3232.

Signed-off-by: Timothy Gu <timothygu99 at gmail.com>
---
 configure         |   9 ++-
 doc/Makefile      |   8 +-
 doc/platform.texi |   2 +-
 doc/t2h.init      | 123 ------------------------------
 doc/t2h.pm        | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 230 insertions(+), 132 deletions(-)
 delete mode 100644 doc/t2h.init
 create mode 100644 doc/t2h.pm

diff --git a/configure b/configure
index 8e5f49b..b2677b6 100755
--- a/configure
+++ b/configure
@@ -1802,10 +1802,10 @@ HAVE_LIST="
     libdc1394_1
     libdc1394_2
     makeinfo
+    makeinfo_html
     perl
     pod2man
     sdl
-    texi2html
     threads
     vdpau_x11
     xlib
@@ -2630,7 +2630,7 @@ ffserver_select="ffm_muxer rtp_protocol rtsp_demuxer"
 # documentation
 podpages_deps="perl"
 manpages_deps="perl pod2man"
-htmlpages_deps="perl texi2html"
+htmlpages_deps="perl makeinfo_html"
 txtpages_deps="perl makeinfo"
 doc_deps_any="manpages htmlpages podpages txtpages"
 
@@ -4915,8 +4915,9 @@ else
 fi
 enabled sdl && add_cflags $sdl_cflags && add_extralibs $sdl_libs
 
-texi2html --help 2> /dev/null | grep -q 'init-file' && enable texi2html || disable texi2html
 makeinfo --version > /dev/null 2>&1 && enable makeinfo  || disable makeinfo
+(makeinfo --version | grep -s 'makeinfo (GNU texinfo) 5' > /dev/null) \
+    && enable makeinfo_html || disable makeinfo_html
 perl -v            > /dev/null 2>&1 && enable perl      || disable perl
 pod2man --help     > /dev/null 2>&1 && enable pod2man   || disable pod2man
 rsync --help 2> /dev/null | grep -q 'contimeout' && enable rsync_contimeout || disable rsync_contimeout
@@ -5396,10 +5397,10 @@ echo "threading support         ${thread_type-no}"
 echo "safe bitstream reader     ${safe_bitstream_reader-no}"
 echo "SDL support               ${sdl-no}"
 echo "opencl enabled            ${opencl-no}"
-echo "texi2html enabled         ${texi2html-no}"
 echo "perl enabled              ${perl-no}"
 echo "pod2man enabled           ${pod2man-no}"
 echo "makeinfo enabled          ${makeinfo-no}"
+echo "makeinfo supports HTML    ${makeinfo_html-no}"
 test -n "$random_seed" &&
     echo "random seed               ${random_seed}"
 echo
diff --git a/doc/Makefile b/doc/Makefile
index 2fb9058..c6067c7 100644
--- a/doc/Makefile
+++ b/doc/Makefile
@@ -81,14 +81,14 @@ $(GENTEXI): doc/avoptions_%.texi: doc/print_options$(HOSTEXESUF)
 	$(M)doc/print_options $* > $@
 
 doc/%.html: TAG = HTML
-doc/%.html: doc/%.texi $(SRC_PATH)/doc/t2h.init $(GENTEXI)
+doc/%.html: doc/%.texi $(SRC_PATH)/doc/t2h.pm $(GENTEXI)
 	$(Q)$(TEXIDEP)
-	$(M)texi2html -I doc -monolithic --D=config-not-all --init-file $(SRC_PATH)/doc/t2h.init --output $@ $<
+	$(M)makeinfo --html -I doc --no-split -D config-not-all --init-file=$(SRC_PATH)/doc/t2h.pm --output $@ $<
 
 doc/%-all.html: TAG = HTML
-doc/%-all.html: doc/%.texi $(SRC_PATH)/doc/t2h.init $(GENTEXI)
+doc/%-all.html: doc/%.texi $(SRC_PATH)/doc/t2h.pm $(GENTEXI)
 	$(Q)$(TEXIDEP)
-	$(M)texi2html -I doc -monolithic --D=config-all --init-file $(SRC_PATH)/doc/t2h.init --output $@ $<
+	$(M)makeinfo --html -I doc --no-split -D config-all --init-file=$(SRC_PATH)/doc/t2h.pm --output $@ $<
 
 doc/%.pod: TAG = POD
 doc/%.pod: doc/%.texi $(SRC_PATH)/doc/texi2pod.pl $(GENTEXI)
diff --git a/doc/platform.texi b/doc/platform.texi
index fb08a1e..ca76492 100644
--- a/doc/platform.texi
+++ b/doc/platform.texi
@@ -278,7 +278,7 @@ llrint() in its C library.
 Install your Cygwin with all the "Base" packages, plus the
 following "Devel" ones:
 @example
-binutils, gcc4-core, make, git, mingw-runtime, texi2html
+binutils, gcc4-core, make, git, mingw-runtime, texinfo
 @end example
 
 In order to run FATE you will also need the following "Utils" packages:
diff --git a/doc/t2h.init b/doc/t2h.init
deleted file mode 100644
index 9dd8f91..0000000
--- a/doc/t2h.init
+++ /dev/null
@@ -1,123 +0,0 @@
-# no horiz rules between sections
-$end_section = \&FFmpeg_end_section;
-sub FFmpeg_end_section($$)
-{
-}
-
-my $TEMPLATE_HEADER1 = $ENV{"FFMPEG_HEADER1"} || <<EOT;
-<!DOCTYPE html>
-<html lang="en">
-  <head>
-    <meta charset="utf-8" />
-    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
-    <title>FFmpeg documentation</title>
-    <link rel="stylesheet" href="style.min.css" />
-EOT
-
-my $TEMPLATE_HEADER2 = $ENV{"FFMPEG_HEADER2"} || <<EOT;
-  </head>
-  <body>
-    <div style="width: 95%; margin: auto">
-EOT
-
-my $TEMPLATE_FOOTER = $ENV{"FFMPEG_FOOTER"} || <<EOT;
-    </div>
-  </body>
-</html>
-EOT
-
-$SMALL_RULE = '';
-$BODYTEXT = '';
-
-$print_page_foot = \&FFmpeg_print_page_foot;
-sub FFmpeg_print_page_foot($$)
-{
-    my $fh = shift;
-    my $program_string = defined &T2H_DEFAULT_program_string ?
-        T2H_DEFAULT_program_string() : program_string();
-    print $fh '<footer class="footer pagination-right">' . "\n";
-    print $fh '<span class="label label-info">' . $program_string;
-    print $fh "</span></footer></div></div></body>\n";
-}
-
-$float = \&FFmpeg_float;
-
-sub FFmpeg_float($$$$)
-{
-    my $text = shift;
-    my $float = shift;
-    my $caption = shift;
-    my $shortcaption = shift;
-
-    my $label = '';
-    if (exists($float->{'id'}))
-    {
-        $label = &$anchor($float->{'id'});
-    }
-    my $class = '';
-    my $subject = '';
-
-    if ($caption =~ /NOTE/)
-    {
-        $class = "alert alert-info";
-    }
-    elsif ($caption =~ /IMPORTANT/)
-    {
-        $class = "alert alert-warning";
-    }
-
-    return '<div class="float ' . $class . '">' . "$label\n" . $text . '</div>';
-}
-
-$print_page_head = \&FFmpeg_print_page_head;
-sub FFmpeg_print_page_head($$)
-{
-    my $fh = shift;
-    my $longtitle = "$Texi2HTML::THISDOC{'fulltitle_no_texi'}";
-    $longtitle .= ": $Texi2HTML::NO_TEXI{'This'}" if exists $Texi2HTML::NO_TEXI{'This'};
-    my $description = $DOCUMENT_DESCRIPTION;
-    $description = $longtitle if (!defined($description));
-    $description = "<meta name=\"description\" content=\"$description\">" if
-         ($description ne '');
-    $description = $Texi2HTML::THISDOC{'documentdescription'} if (defined($Texi2HTML::THISDOC{'documentdescription'}));
-    my $encoding = '';
-    $encoding = "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=$ENCODING\">" if (defined($ENCODING) and ($ENCODING ne ''));
-    $longtitle =~ s/Documentation.*//g;
-    $longtitle = "FFmpeg documentation : " . $longtitle;
-
-    print $fh <<EOT;
-$TEMPLATE_HEADER1
-$description
-<meta name="keywords" content="$longtitle">
-<meta name="Generator" content="$Texi2HTML::THISDOC{program}">
-$Texi2HTML::THISDOC{'copying'}<!-- Created on $Texi2HTML::THISDOC{today} by $Texi2HTML::THISDOC{program} -->
-<!--
-$Texi2HTML::THISDOC{program_authors}
--->
-$encoding
-$TEMPLATE_HEADER2
-EOT
-}
-
-$print_page_foot = \&FFmpeg_print_page_foot;
-sub FFmpeg_print_page_foot($$)
-{
-    my $fh = shift;
-    print $fh <<EOT;
-$TEMPLATE_FOOTER
-EOT
-}
-
-# declare encoding in header
-$IN_ENCODING = $ENCODING = "utf-8";
-
-# no navigation elements
-$SECTION_NAVIGATION = 0;
-# the same for texi2html 5.0
-$HEADERS = 0;
-
-# TOC and Chapter headings link
-$TOC_LINKS = 1;
-
-# print the TOC where @contents is used
-$INLINE_CONTENTS = 1;
diff --git a/doc/t2h.pm b/doc/t2h.pm
new file mode 100644
index 0000000..923e062
--- /dev/null
+++ b/doc/t2h.pm
@@ -0,0 +1,220 @@
+# 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser 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);
+
+# TOC and Chapter headings link
+set_from_init_file('TOC_LINKS', 1);
+
+# 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>
+    <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);
+
+# 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;
\ No newline at end of file
-- 
1.9.1



More information about the ffmpeg-devel mailing list