home *** CD-ROM | disk | FTP | other *** search
/ PC World 2004 November / PCWorld_2004-11_cd.bin / software / topware / activeperl / ActivePerl-5.8.4.810-MSWin32-x86.exe / ActivePerl-5.8.4.810 / Perl / bin / pod2latex.bat < prev    next >
DOS Batch File  |  2004-06-01  |  9KB  |  341 lines

  1. @rem = '--*-Perl-*--
  2. @echo off
  3. if "%OS%" == "Windows_NT" goto WinNT
  4. perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
  5. goto endofperl
  6. :WinNT
  7. perl -x -S %0 %*
  8. if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
  9. if %errorlevel% == 9009 echo You do not have Perl in your PATH.
  10. if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
  11. goto endofperl
  12. @rem ';
  13. #!perl
  14. #line 15
  15.     eval 'exec C:\TEMP\perl--------------------------------please-run-the-install-script--------------------------------\bin\perl.exe -S $0 ${1+"$@"}'
  16.     if $running_under_some_shell;
  17.  
  18. # pod2latex conversion program
  19.  
  20. use strict;
  21. use Pod::LaTeX;
  22. use Pod::Find qw/ pod_find /;
  23. use Pod::Usage;
  24. use Getopt::Long;
  25. use File::Basename;
  26.  
  27. my $VERSION = "1.00";
  28.  
  29. # Read command line arguments
  30.  
  31. my %options = (
  32.            "help"   => 0,
  33.            "man"    => 0,
  34.            "sections" => [],
  35.            "full"   => 0,
  36.            "out"    => undef,
  37.            "verbose" => 0,
  38.            "modify" => 0,
  39.            "h1level" => 1,  # section is equivalent to H1
  40.           );
  41.  
  42. GetOptions(\%options, 
  43.        "help",
  44.        "man",
  45.        "verbose",
  46.        "full",
  47.        "sections=s@",
  48.        "out=s",
  49.        "modify",
  50.        "h1level=i",
  51.       ) || pod2usage(2);
  52.  
  53. pod2usage(1)  if ($options{help});
  54. pod2usage(-verbose => 2)  if ($options{man});
  55.  
  56.  
  57. # Read all the files from the command line
  58. my @files = @ARGV;
  59.  
  60. # Now find which ones are real pods and convert 
  61. # directories to their contents.
  62.  
  63. # Extract the pods from each arg since some of them might
  64. # be directories
  65. # This is not as efficient as using pod_find to search through
  66. # everything at once but it allows us to preserve the order 
  67. # supplied by the user
  68.  
  69. my @pods;
  70. foreach my $arg (@files) {
  71.   my %pods = pod_find($arg);
  72.   push(@pods, sort keys %pods);
  73. }
  74.  
  75. # Abort if nothing to do
  76. if ($#pods == -1) {
  77.   warn "None of the supplied Pod files actually exist\n";
  78.   exit;
  79. }
  80.  
  81.  
  82.  
  83. # If $options{'out'} is set we are processing to a single output file
  84. my $multi_documents;
  85. if (exists $options{'out'} && defined $options{'out'}) {
  86.   $multi_documents = 0;
  87. } else {
  88.   $multi_documents = 1;
  89. }
  90.  
  91. # If the output file is not specified it is assumed that
  92. # a single output file is required per input file using
  93. # a .tex extension rather than any exisiting extension
  94.  
  95. if ($multi_documents) {
  96.  
  97.   # Case where we just generate one input per output
  98.  
  99.   foreach my $pod (@pods) {
  100.  
  101.     if (-f $pod) {
  102.  
  103.       my $output = $pod;
  104.       $output = basename($output, '.pm', '.pod','.pl') . '.tex';
  105.  
  106.       # Create a new parser object
  107.       my $parser = new Pod::LaTeX(
  108.                   AddPreamble => $options{'full'},
  109.                   AddPostamble => $options{'full'},
  110.                   MakeIndex => $options{'full'},
  111.                   TableOfContents => $options{'full'},
  112.                   ReplaceNAMEwithSection => $options{'modify'},
  113.                   UniqueLabels => $options{'modify'},
  114.                   Head1Level => $options{'h1level'},
  115.                   LevelNoNum => $options{'h1level'} + 1,
  116.                  );
  117.  
  118.       # Select sections if supplied
  119.       $parser->select(@{ $options{'sections'}})
  120.     if @{$options{'sections'}};
  121.  
  122.       # Derive the input file from the output file
  123.       $parser->parse_from_file($pod, $output);
  124.  
  125.       print "Written output to $output\n" if $options{'verbose'};
  126.  
  127.     } else {
  128.       warn "File $pod not found\n";
  129.     }
  130.  
  131.   }
  132. } else {
  133.   
  134.   # Case where we want everything to be in a single document
  135.  
  136.   # Need to open the output file ourselves
  137.   my $output = $options{'out'};
  138.   $output .= '.tex' unless $output =~ /\.tex$/;
  139.  
  140.   # Use auto-vivified file handle in perl 5.6
  141.   use Symbol;
  142.   my $outfh = gensym;
  143.   open ($outfh, ">$output") || die "Could not open output file: $!\n";
  144.  
  145.   # Flag to indicate whether we have converted at least one file
  146.   # indicates how many files have been converted
  147.   my $converted = 0;
  148.  
  149.   # Loop over the input files
  150.   foreach my $pod (@pods) {
  151.  
  152.     if (-f $pod) {
  153.  
  154.       warn "Converting $pod\n" if $options{'verbose'};
  155.  
  156.       # Open the file (need the handle)
  157.       # Use auto-vivified handle in perl 5.6
  158.       my $podfh = gensym;
  159.       open ($podfh, "<$pod") || die "Could not open pod file $pod: $!\n";
  160.  
  161.       # if this is the first file to be converted we may want to add
  162.       # a preamble (controlled by command line option)
  163.       my $preamble = 0;
  164.       $preamble = 1 if ($converted == 0 && $options{'full'});
  165.  
  166.       # if this is the last file to be converted may want to add
  167.       # a postamble (controlled by command line option)
  168.       # relies on a previous pass to check existence of all pods we
  169.       # are converting.
  170.       my $postamble = ( ($converted == $#pods && $options{'full'}) ? 1 : 0 );
  171.  
  172.       # Open parser object
  173.       # May want to start with a preamble for the first one and
  174.       # end with an index for the last
  175.       my $parser = new Pod::LaTeX(
  176.                   MakeIndex => $options{'full'},
  177.                   TableOfContents => $preamble,
  178.                   ReplaceNAMEwithSection => $options{'modify'},
  179.                   UniqueLabels => $options{'modify'},
  180.                   StartWithNewPage => $options{'full'},
  181.                   AddPreamble => $preamble,
  182.                   AddPostamble => $postamble,
  183.                   Head1Level => $options{'h1level'},
  184.                   LevelNoNum => $options{'h1level'} + 1,
  185.                  );
  186.  
  187.       # Store the file name for error messages
  188.       # This is a kluge that breaks the data hiding of the object
  189.       $parser->{_INFILE} = $pod;
  190.  
  191.       # Select sections if supplied
  192.       $parser->select(@{ $options{'sections'}})
  193.     if @{$options{'sections'}};
  194.  
  195.       # Parse it
  196.       $parser->parse_from_filehandle($podfh, $outfh);
  197.  
  198.       # We have converted at least one file
  199.       $converted++;
  200.  
  201.     } else {
  202.       warn "File $pod not found\n";
  203.     }
  204.  
  205.   }
  206.  
  207.   # Should unlink the file if we didn't convert anything!
  208.   # dont check for return status of unlink
  209.   # since there is not a lot to be done if the unlink failed
  210.   # and the program does not rely upon it.
  211.   unlink "$output" unless $converted;
  212.  
  213.   # If verbose
  214.   warn "Converted $converted files\n" if $options{'verbose'};
  215.  
  216. }
  217.  
  218. exit;
  219.  
  220. __END__
  221.  
  222. =head1 NAME
  223.  
  224. pod2latex - convert pod documentation to latex format
  225.  
  226. =head1 SYNOPSIS
  227.  
  228.   pod2latex *.pm
  229.  
  230.   pod2latex -out mytex.tex *.pod
  231.  
  232.   pod2latex -full -sections 'DESCRIPTION|NAME' SomeDir
  233.  
  234. =head1 DESCRIPTION
  235.  
  236. C<pod2latex> is a program to convert POD format documentation
  237. (L<perlpod>) into latex. It can process multiple input documents at a
  238. time and either generate a latex file per input document or a single
  239. combined output file.
  240.  
  241. =head1 OPTIONS AND ARGUMENTS
  242.  
  243. This section describes the supported command line options. Minimum
  244. matching is supported.
  245.  
  246. =over 4
  247.  
  248. =item B<-out>
  249.  
  250. Name of the output file to be used. If there are multiple input pods
  251. it is assumed that the intention is to write all translated output
  252. into a single file. C<.tex> is appended if not present.  If the
  253. argument is not supplied, a single document will be created for each
  254. input file.
  255.  
  256. =item B<-full>
  257.  
  258. Creates a complete C<latex> file that can be processed immediately
  259. (unless C<=for/=begin> directives are used that rely on extra packages).
  260. Table of contents and index generation commands are included in the
  261. wrapper C<latex> code.
  262.  
  263. =item B<-sections>
  264.  
  265. Specify pod sections to include (or remove if negated) in the
  266. translation.  See L<Pod::Select/"SECTION SPECIFICATIONS"> for the
  267. format to use for I<section-spec>. This option may be given multiple
  268. times on the command line.This is identical to the similar option in
  269. the C<podselect()> command.
  270.  
  271. =item B<-modify>
  272.  
  273. This option causes the output C<latex> to be slightly
  274. modified from the input pod such that when a C<=head1 NAME>
  275. is encountered a section is created containing the actual
  276. pod name (rather than B<NAME>) and all subsequent C<=head1>
  277. directives are treated as subsections. This has the advantage
  278. that the description of a module will be in its own section
  279. which is helpful for including module descriptions in documentation.
  280. Also forces C<latex> label and index entries to be prefixed by the
  281. name of the module.
  282.  
  283. =item B<-h1level>
  284.  
  285. Specifies the C<latex> section that is equivalent to a C<H1> pod
  286. directive. This is an integer between 0 and 5 with 0 equivalent to a
  287. C<latex> chapter, 1 equivalent to a C<latex> section etc. The default
  288. is 1 (C<H1> equivalent to a latex section).
  289.  
  290. =item B<-help>
  291.  
  292. Print a brief help message and exit.
  293.  
  294. =item B<-man>
  295.  
  296. Print the manual page and exit.
  297.  
  298. =item B<-verbose>
  299.  
  300. Print information messages as each document is processed.
  301.  
  302. =back
  303.  
  304. =head1 BUGS
  305.  
  306. Known bugs are:
  307.  
  308. =over 4
  309.  
  310. =item * 
  311.  
  312. Cross references between documents are not resolved when multiple
  313. pod documents are converted into a single output C<latex> file.
  314.  
  315. =item * 
  316.  
  317. Functions and variables are not automatically recognized 
  318. and they will therefore not be marked up in any special way
  319. unless instructed by an explicit pod command.
  320.  
  321. =back
  322.  
  323. =head1 SEE ALSO
  324.  
  325. L<Pod::LaTeX>
  326.  
  327. =head1 AUTHOR
  328.  
  329. Tim Jenness E<lt>t.jenness@jach.hawaii.eduE<gt>
  330.  
  331. This program is free software; you can redistribute it
  332. and/or modify it under the same terms as Perl itself.
  333.  
  334. Copyright (C) 2000, 2003 Tim Jenness. All Rights Reserved.
  335.  
  336. =cut
  337.  
  338.  
  339. __END__
  340. :endofperl
  341.