annotate ffmpeg/doc/texi2pod.pl @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 #! /usr/bin/perl
yading@10 2
yading@10 3 # Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
yading@10 4
yading@10 5 # This file is part of GNU CC.
yading@10 6
yading@10 7 # GNU CC is free software; you can redistribute it and/or modify
yading@10 8 # it under the terms of the GNU General Public License as published by
yading@10 9 # the Free Software Foundation; either version 2, or (at your option)
yading@10 10 # any later version.
yading@10 11
yading@10 12 # GNU CC is distributed in the hope that it will be useful,
yading@10 13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
yading@10 15 # GNU General Public License for more details.
yading@10 16
yading@10 17 # You should have received a copy of the GNU General Public License
yading@10 18 # along with GNU CC; see the file COPYING. If not, write to
yading@10 19 # the Free Software Foundation, 51 Franklin Street, Fifth Floor,
yading@10 20 # Boston, MA 02110-1301 USA
yading@10 21
yading@10 22 # This does trivial (and I mean _trivial_) conversion of Texinfo
yading@10 23 # markup to Perl POD format. It's intended to be used to extract
yading@10 24 # something suitable for a manpage from a Texinfo document.
yading@10 25
yading@10 26 use warnings;
yading@10 27
yading@10 28 $output = 0;
yading@10 29 $skipping = 0;
yading@10 30 %chapters = ();
yading@10 31 @chapters_sequence = ();
yading@10 32 $chapter = "";
yading@10 33 @icstack = ();
yading@10 34 @endwstack = ();
yading@10 35 @skstack = ();
yading@10 36 @instack = ();
yading@10 37 $shift = "";
yading@10 38 %defs = ();
yading@10 39 $fnno = 1;
yading@10 40 $inf = "";
yading@10 41 @ibase = ();
yading@10 42
yading@10 43 while ($_ = shift) {
yading@10 44 if (/^-D(.*)$/) {
yading@10 45 if ($1 ne "") {
yading@10 46 $flag = $1;
yading@10 47 } else {
yading@10 48 $flag = shift;
yading@10 49 }
yading@10 50 $value = "";
yading@10 51 ($flag, $value) = ($flag =~ /^([^=]+)(?:=(.+))?/);
yading@10 52 die "no flag specified for -D\n"
yading@10 53 unless $flag ne "";
yading@10 54 die "flags may only contain letters, digits, hyphens, dashes and underscores\n"
yading@10 55 unless $flag =~ /^[a-zA-Z0-9_-]+$/;
yading@10 56 $defs{$flag} = $value;
yading@10 57 } elsif (/^-I(.*)$/) {
yading@10 58 push @ibase, $1 ne "" ? $1 : shift;
yading@10 59 } elsif (/^-/) {
yading@10 60 usage();
yading@10 61 } else {
yading@10 62 $in = $_, next unless defined $in;
yading@10 63 $out = $_, next unless defined $out;
yading@10 64 usage();
yading@10 65 }
yading@10 66 }
yading@10 67
yading@10 68 push @ibase, ".";
yading@10 69
yading@10 70 if (defined $in) {
yading@10 71 $inf = gensym();
yading@10 72 open($inf, "<$in") or die "opening \"$in\": $!\n";
yading@10 73 push @ibase, $1 if $in =~ m|^(.+)/[^/]+$|;
yading@10 74 } else {
yading@10 75 $inf = \*STDIN;
yading@10 76 }
yading@10 77
yading@10 78 if (defined $out) {
yading@10 79 open(STDOUT, ">$out") or die "opening \"$out\": $!\n";
yading@10 80 }
yading@10 81
yading@10 82 while(defined $inf) {
yading@10 83 INF: while(<$inf>) {
yading@10 84 # Certain commands are discarded without further processing.
yading@10 85 /^\@(?:
yading@10 86 [a-z]+index # @*index: useful only in complete manual
yading@10 87 |need # @need: useful only in printed manual
yading@10 88 |(?:end\s+)?group # @group .. @end group: ditto
yading@10 89 |page # @page: ditto
yading@10 90 |node # @node: useful only in .info file
yading@10 91 |(?:end\s+)?ifnottex # @ifnottex .. @end ifnottex: use contents
yading@10 92 )\b/x and next;
yading@10 93
yading@10 94 chomp;
yading@10 95
yading@10 96 # Look for filename and title markers.
yading@10 97 /^\@setfilename\s+([^.]+)/ and $fn = $1, next;
yading@10 98 /^\@settitle\s+([^.]+)/ and $tl = postprocess($1), next;
yading@10 99
yading@10 100 # Identify a man title but keep only the one we are interested in.
yading@10 101 /^\@c\s+man\s+title\s+([A-Za-z0-9-]+)\s+(.+)/ and do {
yading@10 102 if (exists $defs{$1}) {
yading@10 103 $fn = $1;
yading@10 104 $tl = postprocess($2);
yading@10 105 }
yading@10 106 next;
yading@10 107 };
yading@10 108
yading@10 109 /^\@include\s+(.+)$/ and do {
yading@10 110 push @instack, $inf;
yading@10 111 $inf = gensym();
yading@10 112
yading@10 113 for (@ibase) {
yading@10 114 open($inf, "<" . $_ . "/" . $1) and next INF;
yading@10 115 }
yading@10 116 die "cannot open $1: $!\n";
yading@10 117 };
yading@10 118
yading@10 119 /^\@chapter\s+([A-Za-z ]+)/ and do {
yading@10 120 # close old chapter
yading@10 121 $chapters{$chapter_name} .= postprocess($chapter) if ($chapter_name);
yading@10 122
yading@10 123 # start new chapter
yading@10 124 $chapter_name = $1, push (@chapters_sequence, $chapter_name) unless $skipping;
yading@10 125 $chapters{$chapter_name} = "" unless exists $chapters{$chapter_name};
yading@10 126 $chapter = "";
yading@10 127 $output = 1;
yading@10 128 next;
yading@10 129 };
yading@10 130
yading@10 131 /^\@bye/ and do {
yading@10 132 # close old chapter
yading@10 133 $chapters{$chapter_name} .= postprocess($chapter) if ($chapter_name);
yading@10 134 last INF;
yading@10 135 };
yading@10 136
yading@10 137 # handle variables
yading@10 138 /^\@set\s+([a-zA-Z0-9_-]+)\s*(.*)$/ and do {
yading@10 139 $defs{$1} = $2;
yading@10 140 next;
yading@10 141 };
yading@10 142 /^\@clear\s+([a-zA-Z0-9_-]+)/ and do {
yading@10 143 delete $defs{$1};
yading@10 144 next;
yading@10 145 };
yading@10 146
yading@10 147 next unless $output;
yading@10 148
yading@10 149 # Discard comments. (Can't do it above, because then we'd never see
yading@10 150 # @c man lines.)
yading@10 151 /^\@c\b/ and next;
yading@10 152
yading@10 153 # End-block handler goes up here because it needs to operate even
yading@10 154 # if we are skipping.
yading@10 155 /^\@end\s+([a-z]+)/ and do {
yading@10 156 # Ignore @end foo, where foo is not an operation which may
yading@10 157 # cause us to skip, if we are presently skipping.
yading@10 158 my $ended = $1;
yading@10 159 next if $skipping && $ended !~ /^(?:ifset|ifclear|ignore|menu|iftex|ifhtml|ifnothtml)$/;
yading@10 160
yading@10 161 die "\@end $ended without \@$ended at line $.\n" unless defined $endw;
yading@10 162 die "\@$endw ended by \@end $ended at line $.\n" unless $ended eq $endw;
yading@10 163
yading@10 164 $endw = pop @endwstack;
yading@10 165
yading@10 166 if ($ended =~ /^(?:ifset|ifclear|ignore|menu|iftex|ifhtml|ifnothtml)$/) {
yading@10 167 $skipping = pop @skstack;
yading@10 168 next;
yading@10 169 } elsif ($ended =~ /^(?:example|smallexample|display)$/) {
yading@10 170 $shift = "";
yading@10 171 $_ = ""; # need a paragraph break
yading@10 172 } elsif ($ended =~ /^(?:itemize|enumerate|(?:multi|[fv])?table)$/) {
yading@10 173 $_ = "\n=back\n";
yading@10 174 $ic = pop @icstack;
yading@10 175 } else {
yading@10 176 die "unknown command \@end $ended at line $.\n";
yading@10 177 }
yading@10 178 };
yading@10 179
yading@10 180 # We must handle commands which can cause skipping even while we
yading@10 181 # are skipping, otherwise we will not process nested conditionals
yading@10 182 # correctly.
yading@10 183 /^\@ifset\s+([a-zA-Z0-9_-]+)/ and do {
yading@10 184 push @endwstack, $endw;
yading@10 185 push @skstack, $skipping;
yading@10 186 $endw = "ifset";
yading@10 187 $skipping = 1 unless exists $defs{$1};
yading@10 188 next;
yading@10 189 };
yading@10 190
yading@10 191 /^\@ifclear\s+([a-zA-Z0-9_-]+)/ and do {
yading@10 192 push @endwstack, $endw;
yading@10 193 push @skstack, $skipping;
yading@10 194 $endw = "ifclear";
yading@10 195 $skipping = 1 if exists $defs{$1};
yading@10 196 next;
yading@10 197 };
yading@10 198
yading@10 199 /^\@(ignore|menu|iftex|ifhtml|ifnothtml)\b/ and do {
yading@10 200 push @endwstack, $endw;
yading@10 201 push @skstack, $skipping;
yading@10 202 $endw = $1;
yading@10 203 $skipping = $endw !~ /ifnothtml/;
yading@10 204 next;
yading@10 205 };
yading@10 206
yading@10 207 next if $skipping;
yading@10 208
yading@10 209 # Character entities. First the ones that can be replaced by raw text
yading@10 210 # or discarded outright:
yading@10 211 s/\@copyright\{\}/(c)/g;
yading@10 212 s/\@dots\{\}/.../g;
yading@10 213 s/\@enddots\{\}/..../g;
yading@10 214 s/\@([.!? ])/$1/g;
yading@10 215 s/\@[:-]//g;
yading@10 216 s/\@bullet(?:\{\})?/*/g;
yading@10 217 s/\@TeX\{\}/TeX/g;
yading@10 218 s/\@pounds\{\}/\#/g;
yading@10 219 s/\@minus(?:\{\})?/-/g;
yading@10 220
yading@10 221 # Now the ones that have to be replaced by special escapes
yading@10 222 # (which will be turned back into text by unmunge())
yading@10 223 s/&/&amp;/g;
yading@10 224 s/\@\{/&lbrace;/g;
yading@10 225 s/\@\}/&rbrace;/g;
yading@10 226 s/\@\@/&at;/g;
yading@10 227
yading@10 228 # Inside a verbatim block, handle @var specially.
yading@10 229 if ($shift ne "") {
yading@10 230 s/\@var\{([^\}]*)\}/<$1>/g;
yading@10 231 }
yading@10 232
yading@10 233 # POD doesn't interpret E<> inside a verbatim block.
yading@10 234 if ($shift eq "") {
yading@10 235 s/</&lt;/g;
yading@10 236 s/>/&gt;/g;
yading@10 237 } else {
yading@10 238 s/</&LT;/g;
yading@10 239 s/>/&GT;/g;
yading@10 240 }
yading@10 241
yading@10 242 # Single line command handlers.
yading@10 243
yading@10 244 /^\@(?:section|unnumbered|unnumberedsec|center|heading)\s+(.+)$/
yading@10 245 and $_ = "\n=head2 $1\n";
yading@10 246 /^\@(?:subsection|subheading)\s+(.+)$/
yading@10 247 and $_ = "\n=head3 $1\n";
yading@10 248 /^\@(?:subsubsection|subsubheading)\s+(.+)$/
yading@10 249 and $_ = "\n=head4 $1\n";
yading@10 250
yading@10 251 # Block command handlers:
yading@10 252 /^\@itemize\s*(\@[a-z]+|\*|-)?/ and do {
yading@10 253 push @endwstack, $endw;
yading@10 254 push @icstack, $ic;
yading@10 255 $ic = $1 ? $1 : "*";
yading@10 256 $_ = "\n=over 4\n";
yading@10 257 $endw = "itemize";
yading@10 258 };
yading@10 259
yading@10 260 /^\@enumerate(?:\s+([a-zA-Z0-9]+))?/ and do {
yading@10 261 push @endwstack, $endw;
yading@10 262 push @icstack, $ic;
yading@10 263 if (defined $1) {
yading@10 264 $ic = $1 . ".";
yading@10 265 } else {
yading@10 266 $ic = "1.";
yading@10 267 }
yading@10 268 $_ = "\n=over 4\n";
yading@10 269 $endw = "enumerate";
yading@10 270 };
yading@10 271
yading@10 272 /^\@((?:multi|[fv])?table)\s+(\@[a-z]+)/ and do {
yading@10 273 push @endwstack, $endw;
yading@10 274 push @icstack, $ic;
yading@10 275 $endw = $1;
yading@10 276 $ic = $2;
yading@10 277 $ic =~ s/\@(?:samp|strong|key|gcctabopt|option|env|command)/B/;
yading@10 278 $ic =~ s/\@(?:code|kbd)/C/;
yading@10 279 $ic =~ s/\@(?:dfn|var|emph|cite|i)/I/;
yading@10 280 $ic =~ s/\@(?:file)/F/;
yading@10 281 $ic =~ s/\@(?:columnfractions)//;
yading@10 282 $_ = "\n=over 4\n";
yading@10 283 };
yading@10 284
yading@10 285 /^\@((?:small)?example|display)/ and do {
yading@10 286 push @endwstack, $endw;
yading@10 287 $endw = $1;
yading@10 288 $shift = "\t";
yading@10 289 $_ = ""; # need a paragraph break
yading@10 290 };
yading@10 291
yading@10 292 /^\@item\s+(.*\S)\s*$/ and $endw eq "multitable" and do {
yading@10 293 my $columns = $1;
yading@10 294 $columns =~ s/\@tab/ : /;
yading@10 295
yading@10 296 $_ = "\n=item B&LT;". $columns ."&GT;\n";
yading@10 297 };
yading@10 298
yading@10 299 /^\@tab\s+(.*\S)\s*$/ and $endw eq "multitable" and do {
yading@10 300 my $columns = $1;
yading@10 301 $columns =~ s/\@tab/ : /;
yading@10 302
yading@10 303 $_ = " : ". $columns;
yading@10 304 $chapter =~ s/\n+\s+$//;
yading@10 305 };
yading@10 306
yading@10 307 /^\@itemx?\s*(.+)?$/ and do {
yading@10 308 if (defined $1) {
yading@10 309 # Entity escapes prevent munging by the <> processing below.
yading@10 310 $_ = "\n=item $ic\&LT;$1\&GT;\n";
yading@10 311 } else {
yading@10 312 $_ = "\n=item $ic\n";
yading@10 313 $ic =~ y/A-Ya-y/B-Zb-z/;
yading@10 314 $ic =~ s/(\d+)/$1 + 1/eg;
yading@10 315 }
yading@10 316 };
yading@10 317
yading@10 318 $chapter .= $shift.$_."\n";
yading@10 319 }
yading@10 320 # End of current file.
yading@10 321 close($inf);
yading@10 322 $inf = pop @instack;
yading@10 323 }
yading@10 324
yading@10 325 die "No filename or title\n" unless defined $fn && defined $tl;
yading@10 326
yading@10 327 $chapters{NAME} = "$fn \- $tl\n";
yading@10 328 $chapters{FOOTNOTES} .= "=back\n" if exists $chapters{FOOTNOTES};
yading@10 329
yading@10 330 unshift @chapters_sequence, "NAME";
yading@10 331 for $chapter (@chapters_sequence) {
yading@10 332 if (exists $chapters{$chapter}) {
yading@10 333 $head = uc($chapter);
yading@10 334 print "=head1 $head\n\n";
yading@10 335 print scalar unmunge ($chapters{$chapter});
yading@10 336 print "\n";
yading@10 337 }
yading@10 338 }
yading@10 339
yading@10 340 sub usage
yading@10 341 {
yading@10 342 die "usage: $0 [-D toggle...] [infile [outfile]]\n";
yading@10 343 }
yading@10 344
yading@10 345 sub postprocess
yading@10 346 {
yading@10 347 local $_ = $_[0];
yading@10 348
yading@10 349 # @value{foo} is replaced by whatever 'foo' is defined as.
yading@10 350 while (m/(\@value\{([a-zA-Z0-9_-]+)\})/g) {
yading@10 351 if (! exists $defs{$2}) {
yading@10 352 print STDERR "Option $2 not defined\n";
yading@10 353 s/\Q$1\E//;
yading@10 354 } else {
yading@10 355 $value = $defs{$2};
yading@10 356 s/\Q$1\E/$value/;
yading@10 357 }
yading@10 358 }
yading@10 359
yading@10 360 # Formatting commands.
yading@10 361 # Temporary escape for @r.
yading@10 362 s/\@r\{([^\}]*)\}/R<$1>/g;
yading@10 363 s/\@(?:dfn|var|emph|cite|i)\{([^\}]*)\}/I<$1>/g;
yading@10 364 s/\@(?:code|kbd)\{([^\}]*)\}/C<$1>/g;
yading@10 365 s/\@(?:gccoptlist|samp|strong|key|option|env|command|b)\{([^\}]*)\}/B<$1>/g;
yading@10 366 s/\@sc\{([^\}]*)\}/\U$1/g;
yading@10 367 s/\@file\{([^\}]*)\}/F<$1>/g;
yading@10 368 s/\@w\{([^\}]*)\}/S<$1>/g;
yading@10 369 s/\@(?:dmn|math)\{([^\}]*)\}/$1/g;
yading@10 370
yading@10 371 # Cross references are thrown away, as are @noindent and @refill.
yading@10 372 # (@noindent is impossible in .pod, and @refill is unnecessary.)
yading@10 373 # @* is also impossible in .pod; we discard it and any newline that
yading@10 374 # follows it. Similarly, our macro @gol must be discarded.
yading@10 375
yading@10 376 s/\@anchor{(?:[^\}]*)\}//g;
yading@10 377 s/\(?\@xref\{(?:[^\}]*)\}(?:[^.<]|(?:<[^<>]*>))*\.\)?//g;
yading@10 378 s/\s+\(\@pxref\{(?:[^\}]*)\}\)//g;
yading@10 379 s/;\s+\@pxref\{(?:[^\}]*)\}//g;
yading@10 380 s/\@ref\{(?:[^,\}]*,)(?:[^,\}]*,)([^,\}]*).*\}/$1/g;
yading@10 381 s/\@ref\{([^\}]*)\}/$1/g;
yading@10 382 s/\@noindent\s*//g;
yading@10 383 s/\@refill//g;
yading@10 384 s/\@gol//g;
yading@10 385 s/\@\*\s*\n?//g;
yading@10 386
yading@10 387 # @uref can take one, two, or three arguments, with different
yading@10 388 # semantics each time. @url and @email are just like @uref with
yading@10 389 # one argument, for our purposes.
yading@10 390 s/\@(?:uref|url|email)\{([^\},]*),?[^\}]*\}/&lt;B<$1>&gt;/g;
yading@10 391 s/\@uref\{([^\},]*),([^\},]*)\}/$2 (C<$1>)/g;
yading@10 392 s/\@uref\{([^\},]*),([^\},]*),([^\},]*)\}/$3/g;
yading@10 393
yading@10 394 # Turn B<blah I<blah> blah> into B<blah> I<blah> B<blah> to
yading@10 395 # match Texinfo semantics of @emph inside @samp. Also handle @r
yading@10 396 # inside bold.
yading@10 397 s/&LT;/</g;
yading@10 398 s/&GT;/>/g;
yading@10 399 1 while s/B<((?:[^<>]|I<[^<>]*>)*)R<([^>]*)>/B<$1>${2}B</g;
yading@10 400 1 while (s/B<([^<>]*)I<([^>]+)>/B<$1>I<$2>B</g);
yading@10 401 1 while (s/I<([^<>]*)B<([^>]+)>/I<$1>B<$2>I</g);
yading@10 402 s/[BI]<>//g;
yading@10 403 s/([BI])<(\s+)([^>]+)>/$2$1<$3>/g;
yading@10 404 s/([BI])<([^>]+?)(\s+)>/$1<$2>$3/g;
yading@10 405
yading@10 406 # Extract footnotes. This has to be done after all other
yading@10 407 # processing because otherwise the regexp will choke on formatting
yading@10 408 # inside @footnote.
yading@10 409 while (/\@footnote/g) {
yading@10 410 s/\@footnote\{([^\}]+)\}/[$fnno]/;
yading@10 411 add_footnote($1, $fnno);
yading@10 412 $fnno++;
yading@10 413 }
yading@10 414
yading@10 415 return $_;
yading@10 416 }
yading@10 417
yading@10 418 sub unmunge
yading@10 419 {
yading@10 420 # Replace escaped symbols with their equivalents.
yading@10 421 local $_ = $_[0];
yading@10 422
yading@10 423 s/&lt;/E<lt>/g;
yading@10 424 s/&gt;/E<gt>/g;
yading@10 425 s/&lbrace;/\{/g;
yading@10 426 s/&rbrace;/\}/g;
yading@10 427 s/&at;/\@/g;
yading@10 428 s/&amp;/&/g;
yading@10 429 return $_;
yading@10 430 }
yading@10 431
yading@10 432 sub add_footnote
yading@10 433 {
yading@10 434 unless (exists $chapters{FOOTNOTES}) {
yading@10 435 $chapters{FOOTNOTES} = "\n=over 4\n\n";
yading@10 436 }
yading@10 437
yading@10 438 $chapters{FOOTNOTES} .= "=item $fnno.\n\n"; $fnno++;
yading@10 439 $chapters{FOOTNOTES} .= $_[0];
yading@10 440 $chapters{FOOTNOTES} .= "\n\n";
yading@10 441 }
yading@10 442
yading@10 443 # stolen from Symbol.pm
yading@10 444 {
yading@10 445 my $genseq = 0;
yading@10 446 sub gensym
yading@10 447 {
yading@10 448 my $name = "GEN" . $genseq++;
yading@10 449 my $ref = \*{$name};
yading@10 450 delete $::{$name};
yading@10 451 return $ref;
yading@10 452 }
yading@10 453 }