LaTeX-Driver-1.2.0/0000755000175000017500000000000013747065026015012 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/script/0000755000175000017500000000000013747065026016316 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/script/latex2ps0000755000175000017500000000271612704232647020011 0ustar ehuelsmannehuelsmann#!/usr/bin/perl -w #======================================================================== # # latex2ps # # DESCRIPTION # Script for processing and rendering a template document using the # Perl Template Toolkit. # # AUTHOR # Andrew Ford # # COPYRIGHT # Copyright (C) 2007 Andrew Ford. All Rights Reserved. # # This module is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. # #------------------------------------------------------------------------ # # $Id: latex2ps 59 2007-09-28 14:39:34Z andrew $ # #======================================================================== use strict; use warnings; use LaTeX::Driver::FilterProgram; LaTeX::Driver::FilterProgram->execute(format => 'dvi'); exit(0); __END__ =head1 NAME latex2ps - script to convert LaTeX file to PostScript =head1 SYNOPSIS latex2ps [OPTIONS] [-o output] [sourcefile] =head1 DESCRIPTION C is a simple script to invoke the C module to convert a LaTeX file to PostScript. TO BE EXPANDED =head1 AUTHOR Andrew Ford EA.Ford@ford-mason.co.ukE =head1 LICENSE AND COPYRIGHT Copyright (C) 2007 Andrew Ford. All Rights Reserved. This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =cut # Local Variables: # mode: perl # perl-indent-level: 4 # indent-tabs-mode: nil # End: # # vim: expandtab shiftwidth=4: LaTeX-Driver-1.2.0/script/README0000644000175000017500000000037112704232647017174 0ustar ehuelsmannehuelsmannThe scripts in this directory provide classic Unix-style filters for LaTeX source to dvi, PostScript and PDF output. The functionality of the three scripts is virtually identical so it is abstracted out into a module: LaTeX::Driver::FilterProgram. LaTeX-Driver-1.2.0/script/latex2pdf0000644000175000017500000000270312704232647020131 0ustar ehuelsmannehuelsmann#!/usr/bin/perl -w #======================================================================== # # latex2pdf # # DESCRIPTION # Script for processing and rendering a template document using the # Perl Template Toolkit. # # AUTHOR # Andrew Ford # # COPYRIGHT # Copyright (C) 2007 Andrew Ford. All Rights Reserved. # # This module is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. # #------------------------------------------------------------------------ # # $Id: latex2pdf 59 2007-09-28 14:39:34Z andrew $ # #======================================================================== use strict; use warnings; use LaTeX::Driver::FilterProgram; LaTeX::Driver::FilterProgram->execute(format => 'pdf'); exit(0); __END__ =head1 NAME latex2pdf - script to convert LaTeX file to PDF =head1 SYNOPSIS latex2pdf [OPTIONS] [-o output] [sourcefile] =head1 DESCRIPTION C is a simple script to invoke the C module to convert a LaTeX file to PDF. TO BE EXPANDED =head1 AUTHOR Andrew Ford EA.Ford@ford-mason.co.ukE =head1 LICENSE AND COPYRIGHT Copyright (C) 2007 Andrew Ford. All Rights Reserved. This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =cut # Local Variables: # mode: perl # perl-indent-level: 4 # indent-tabs-mode: nil # End: # # vim: expandtab shiftwidth=4: LaTeX-Driver-1.2.0/script/latex2dvi0000755000175000017500000000501112704232647020140 0ustar ehuelsmannehuelsmann#!/usr/bin/perl -w #======================================================================== # # latex2dvi # # DESCRIPTION # Script for processing and rendering a template document using the # Perl Template Toolkit. # # AUTHOR # Andrew Ford # # COPYRIGHT # Copyright (C) 2007 Andrew Ford. All Rights Reserved. # # This module is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. # #------------------------------------------------------------------------ # # $Id: latex2dvi 73 2007-10-12 23:11:27Z andrew $ # #======================================================================== use strict; use warnings; use LaTeX::Driver::FilterProgram; LaTeX::Driver::FilterProgram->execute(format => 'dvi'); exit 0; __END__ =head1 NAME latex2dvi - script to convert LaTeX file to DVI =head1 USAGE latex2dvi [OPTIONS] [-o output] [sourcefile] =head1 DESCRIPTION C is a simple script to invoke the C module to convert a LaTeX file to DVI (TeX's device independent output format). TO BE EXPANDED =head1 REQUIRED ARGUMENTS =head1 OPTIONS =over 4 =item C<-output=FILE> specifies that the formatted file should be written to C. If this option is not specified, or is specified as "C<->" then the file will be written to standard output, otherwise if an input file is specified then the it will be formatted in place and the output file will have the same name as the input file, but with the original extension replaced with C<.dvi>. =item C<-tt2> specifies that the source document should be taken to be a Template Toolkit template and processed through that before being fed to the C module for latex formatting. =item C<-define=I=I> defines the template variable I to have the value I. Multiple template variables may be defined and these are passed to the Template Toolkit processing stage (they are ignored if the C<-tt2> option is not specified). =back =head1 DIAGNOSTICS =head1 EXIT STATUS =head1 CONFIGURATION =head1 DEPENDENCIES =head1 INCOMPATIBILITIES =head1 BUGS AND LIMITATIONS =head1 AUTHOR Andrew Ford EA.Ford@ford-mason.co.ukE =head1 LICENSE AND COPYRIGHT Copyright (C) 2007 Andrew Ford. All Rights Reserved. This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO =cut # Local Variables: # mode: perl # perl-indent-level: 4 # indent-tabs-mode: nil # End: # # vim: expandtab shiftwidth=4: LaTeX-Driver-1.2.0/MANIFEST.SKIP0000644000175000017500000000027413710327630016703 0ustar ehuelsmannehuelsmann~$ #defaults ^Makefile$ ^blib/ .hg/ ^pm_to_blib ^blibdirs .git/ .gitignore LaTeX-Driver-[0-9]+\.[0-9]+\.tar.* MYMETA.yml MYMETA.json MANIFEST.bak Makefile.old AssertOS CheckOS .travis.yml LaTeX-Driver-1.2.0/INSTALL0000644000175000017500000000324112704232647016040 0ustar ehuelsmannehuelsmann LaTeX::Driver Version 0.07 13 October 2007 Copyright (C) 2007 Andrew Ford. All Rights Reserved This is free software; you can redistribute it and/or modify it under the same terms as Perl itself. $Id: INSTALL 68 2007-10-12 22:59:52Z andrew $ QUICK INSTALL ------------- The latest version of the LaTeX::Driver module can be retrieved from: http://www.cpan.org/modules/by-module/LaTeX-Driver/ To install the module tar zxf LaTeX-Driver-0.06.tar.gz cd LaTeX-Driver-0.06 perl Makefile.PL make make test make install The Makefile.PL will prompt for the location of the LaTeX binaries. If it can locate the binaries then the paths will be given as defaults. If neither the latex nor the pdflatex binary can be found and no paths are given for these programs then Makefile.PL will ask whether you want to continue with the installation (as the module depends on there being a functional tex installation present on the system). For further details, see the sections below on CONFIGURATION, BUILDING AND TESTING, and INSTALLATION. PREREQUISITES ------------- The LaTeX::Driver module is written entirely in Perl and should run on any platform on which Perl is available (currently only Linux has been tested). It requires Perl 5.006 or later. The following CPAN modules are used: Class::Accessor Cwd from PathTools Exception::Class File::Slurp File::Spec from PathTools IO::File from IO There are no known dependencies on particular versions of these modules. LaTeX-Driver-1.2.0/README0000644000175000017500000004177713747065026015712 0ustar ehuelsmannehuelsmannNAME LaTeX::Driver - Latex driver VERSION 1.2.0 SYNOPSIS use LaTeX::Driver; $drv = LaTeX::Driver->new( source => \$doc_text, output => $filename, format => 'pdf', %other_params ); $ok = $drv->run; $stats = $drv->stats; DESCRIPTION The LaTeX::Driver module encapsulates the details of invoking the Latex programs to format a LaTeX document. Formatting with LaTeX is complicated; there are potentially many programs to run and the output of those programs must be monitored to determine whether further processing is required. This module runs the required commands in the directory specified, either explicitly with the "dirname" option or implicitly by the directory part of "basename", or in the current directory. As a result of the processing up to a dozen or more intermediate files are created. These will be removed upon object destruction, given the "cleanup" argument to "new". SOURCE Source code can be found at Feel free to fork and add your stuff! SUBROUTINES/METHODS "new(%params)" This is the constructor method. It creates a driver object on which the "run" method is used to format the document specified. The main arguments are "source" and "output"; the "source" argument is required to specify the input document; "output" is only mandatory if "source" is a scalar reference. The full list of arguments is as follows: "source" This parameter is mandatory; it can either specify the name of the document to be formatted or be a reference to a scalar containing the document source. "output" specifies the output for the formatted document; this may either be a file name or be a scalar reference. In the latter case the contents of the formatted document file is copied into the scalar variable referenced. "format" the format of output required: one of "dvi" (TeX Device Independent format), "ps" (PostScript) or "pdf" (Adobe Portable Document Format). The follow special values are also accepted: "pdf(ps)" (generates PDF via PostScript, using "dvips" and "ps2pdf"), "pdf(dvi)" (generates PDF via dvi, using "dvipdfm"). If not specified then the format is determined from the name of the output document if specified, or defaults to PDF. The following list of formats is supported * dvi * ps * postscript * pdf * pdf(pdflatex) * pdf(xelatex) * pdf(lualatex) * pdf(dvi) * pdf(ps) * ps(pdf) * ps(pdflatex) * ps(xelatex) * ps(lualatex) "tmpdir" Specifies whether the formatting should be done in a temporary directory in which case the source document is copied into the directory before formatting. This option can either take the value 1, in which case a temporary directory is automatically generated, or it is taken as the name of a subdirectory of the system temporary directory. A temporary directory is always created if the source document is specified as a scalar reference. "paths" Specifies a mapping of program names to full pathname as a hash reference. These paths override the paths determined at installation time. "maxruns" The maximum number of runs of the formatter program (defaults to 10). "extraruns" The number of additional runs of the formatter program after the document has stabilized. "timeout" Specifies a timeout in seconds within which any commands spawned should finish. "cleanup" Specifies whether temporary files and directories should be automatically removed when the object destructor is called. Accepted values are "none" (do no cleanup), "logfiles" (remove log files) and "tempfiles" (remove log and temporary files). By default the destructor will remove the entire contents of any automatically generated temporary directory, but will leave all other files intact. "indexstyle" The name of a "makeindex" index style file that should be passed to "makeindex". "indexoptions" Specifies additional options that should be passed to "makeindex". Useful options are: "-c" to compress intermediate blanks in index keys, "-l" to specify letter ordering rather than word ordering, "-r" to disable implicit range formation. Refer to makeindex(1) for full details. "texinputs" Specifies one or more directories to be searched for LaTeX files. "DEBUG" Enables debug statements if set to a non-zero value. "DEBUGPREFIX" Sets the debug prefix, which is prepended to debug output if debug statements. By default there is no prefix. The constructor performs sanity checking on the options and will die if the following conditions are detected: * no source is specified * an invalid format is specified The constructor method returns a driver object. "run()" Format the document. "stderr" Holds the error output from subcommands, if the "-capture_stderr" option was passed to "new()". "stats()" Returns a reference to a hash containing stats about the processing that was performed, containing the following items: "pages" number of pages in the formatted document "bytes" number of bytes in the formatted document "runs" hash of the number of times each of the programs was run Note: the return value will probably become an object in a future version of the module. "program_path($program_name, $opt_value)" Get or set the path to the named program. Can be used as a class method to set the default path or as an object method to set the path for that instance of the driver object. There are a number of other methods that are used internally by the driver. Calling these methods directly may lead to unpredictable results. "run_latex" Runs the formatter ("latex" or "pdflatex"). "need_to_run_latex" Determines whether the formatter needs to be run. "reset_latex_required" Reset the flags that indicate whether latex needs to be re-run (invoked prior to each iteration of running any necessary commands). "run_bibtex" Runs bibtex to generate the bibliography. "need_to_run_bibtex" Determines whether bibtex needs to be run. "run_makeindex" Runs makeindex to generate the index. "need_to_run_makeindex" Determines whether makeindex needs to be run. "run_dvips" Runs dvips to generate postscript output from an intermediate ".dvi" file. "run_ps2pdf" Runs ps2pdf to generate PDF output from an intermediate PostScript file. "run_pdf2ps" Runs pdf2ps to generate PostScript output from an intermediate PDF file. "run_command" Run a command in a controlled environment, allowing for operating system differences. "copy_to_output" Copy the output to its final destination. "throw" Throw an exception. "debug" Print a debug message - the caller should test $DEBUG to determine whether to invoke this function. DIAGNOSTICS The following errors may be detected by the constructor method. not available on XXX The module is not supported on MacOS, OS/2 or VMS (or on a host of other operating systems but these are the only ones that are explicitly tested for). no source specified The "source" parameter should be specified as the name of a LaTeX source file or it should be a reference to a scalar variable holding the LaTeX source document. source is an invalid reference "source" is a reference, but not a reference to a scalar variable source file XXX.tex does not exist The source file specified does not exist output directory DIR does not exist An "output" parameter was specified as a scalar value, which was taken as the name of the output file, but the directory part of the path does not exist. invalid output format XXX An output format was specified, either explicitly or implicitly as the extension of the output file, but the output format specified is not supported. cannot create temporary directory The module could not create the temporary directory, which is used if the source is not specified as a filename, and the output is not to be left in the same directory as the source, or if a temporary directory name is specified explicitly. cannot create temporary latex file The module has determined that it needs to create a temporary file containing the source document but it cannot. cannot copy XXX.ext to temporary directory The module was trying to copy the specified source file to the temporary directory but couldn't. Perhaps you specified the temporary directory name explicitly but the directory does not exist or is not writeable. The following errors may be detected when the driver's "run()" method is called: file XXX.tex does not exist The source file does not exist; it may have been removed between the time the constructor was called and the time that the driver was run. PROGRAM exited with errors: ERRORS The named program ("latex" or "pdflatex") exited with the errors listed. You may have errors in your source file. bibtex FILE failed (EXITCODE) The "bibtex" program exited with errors. These are not fully parsed yet. failed to open BASEPATH.cit The driver generates its own temporary file listing the citations for a document, so that it can determine whether the citations have changed. This error indicates that it was unable to create the file. makeindex FILE failed (EXITCODE) The "makeindex" program exited with errors. These are not fully parsed yet. dvips FILE failed (EXITCODE) The "dvips" program exited with errors. These are not fully parsed yet. ps2pdf FILE failed (EXITCODE) The "ps2pdf" program exited with errors. These are not fully parsed yet. PROGNAME cannot be found, please specify its location The pathname for the specified program was not found in the modules configuration. The program may not have been found and the pathname not been explicitly specified when the module was installed. failed to copy FILE to OUTPUT The driver failed to copy the formatted file to the specified output location. CONFIGURATION AND ENVIRONMENT When the using application configures Log::Any, this module will use it to log "debug" and "trace" level messages to the "LaTeX::Driver" category. Please note that the $DEBUG variable does not need to be set to enable this type of logging. When this type of logging is enabled, the value of $DEBUG is ignored. DEPENDENCIES "LaTeX::Driver" depends on latex and friends being installed. INCOMPATIBILITIES None known. BUGS AND LIMITATIONS If you have any comments about this software I would be very grateful to hear them; please file your comments as issues at . Among the things I am aware of are: * I haven't worked out how I am going to deal with tex-related environment variables. FUTURE DIRECTIONS * Look at how path variables could be specified to the filter ("TEXINPUTS", "TEXINPUTS_latex", "TEXINPUTS_pdflatex", "BIBINPUTS", etc), and how these should interact with the system paths. * Investigate pre- and post-processors and other auxiliary programs. BACKGROUND This module has its origins in the original "latex" filter that was part of Template Toolkit prior to version 2.16. That code was fairly simplistic; it created a temporary directory, copied the source text to a file in that directory, and ran either "latex" or "pdflatex" on the file once; if postscript output was requested then it would run "dvips" after running "latex". This did not cope with documents that contained forward references, a table of contents, lists of figures or tables, bibliographies, or indexes. The current module does not create a temporary directory for formatting the document; it is given the name and location of an existing LaTeX document and runs the latex programs in the directory specified (the Template Toolkit plugin will be modified to set up a temporary directory, copy the source text in, then run this module, extract the output and remove the temporary directory). INTERNALS This section is aimed at a technical audience. It documents the internal methods and subroutines as a reference for the module's developers, maintainers and anyone interesting in understanding how it works. You don't need to know anything about them to use the module and can safely skip this section. Formatting with LaTeX or PDFLaTeX LaTeX documents can be formatted with "latex" or "pdflatex"; the former generates a ".dvi" file (device independent - TeX's native output format), which can be converted to PostScript or PDF; the latter program generates PDF directly. finds inputs in "TEXINPUTS", "TEXINPUTS_latex", "TEXINPUTS_pdflatex", etc Generating indexes The standard program for generating indexes is "makeindex", is a general purpose hierarchical index generator. "makeindex" accepts one or more input files (".idx"), sorts the entries, and produces an output (".ind") file which can be formatted. The style of the generated index is specified by a style file (".ist"), which is found in the path specified by the "INDEXSTYLE" environment variable. An alternative to "makeindex" is "xindy", but that program is not widespread yet. Generating bibliographies with BiBTeX BiBTeX generates a bibliography for a LaTeX document. It reads the top-level auxiliary file (".aux") output during the running of latex and creates a bibliography file (".bbl") that will be incorporated into the document on subsequent runs of latex. It looks up the entries specified by \cite and \nocite commands in the bibliographic database files (.bib) specified by the \bibliography commands. The entries are formatted according to instructions in a bibliography style file (".bst"), specified by the \bibliographystyle command. Bibliography style files are searched for in the path specified by the "BSTINPUTS" environment variable; for bibliography files it uses the "BIBINPUTS" environment variable. System defaults are used if these environment variables are not set. Running Dvips The "dvips" program takes a DVI file produced by TeX and converts it to PostScript. Running ps2pdf The "ps2pdf" program invokes Ghostscript to converts a PostScript file to PDF. Running on Windows Commands are executed with "cmd.exe". The syntax is: cmd /c "cd $dir && $program $args" This changes to the specified directory and executes the program there, without affecting the working directory of the the Perl process. Need more information on how to set environment variables for the invoked programs. Miscellaneous Information This is a placeholder for information not yet incorporated into the rest of the document. May want to mention the kpathsea library, the "kpsewhich" program, the web2c TeX distribution, TeX live, tetex, TeX on Windows, etc. AUTHOR Erik Huelsmann (current maintainer) LICENSE AND COPYRIGHT Copyright (C) 2020 Erik Huelsmann. Copyright (C) 2014 Chris Travers. Copyright (C) 2009-2013 Ford & Mason Ltd. Copyright (C) 2006-2007 Andrew Ford. Portions Copyright (C) 1996-2006 Andy Wardley. This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. SEE ALSO Template::Plugin::Latex, latex(1), makeindex(1), bibtex(1), dvips(1), The dvips manual There are a number of books and other documents that cover LaTeX: * The LaTeX Companion * Web2c manual LaTeX-Driver-1.2.0/META.yml0000644000175000017500000000154713747065026016272 0ustar ehuelsmannehuelsmann--- abstract: 'Latex driver' author: - 'Erik Huelsmann (current maintainer)' build_requires: ExtUtils::MakeMaker: 6.59 Test::More: '0.88' configure_requires: ExtUtils::MakeMaker: 6.59 distribution_type: module dynamic_config: 1 generated_by: 'Module::Install version 1.19' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 module_name: LaTeX::Driver name: LaTeX-Driver no_index: directory: - inc - t requires: Capture::Tiny: 0 Class::Accessor: 0 Cwd: 0 Exception::Class: 0 File::Slurp: 0 File::Spec: 0 File::Temp: '0.23' File::pushd: 0 Getopt::Long: 0 IO::File: 0 Log::Any: 0 Readonly: 0 parent: 0 perl: 5.8.5 resources: license: http://dev.perl.org/licenses/ repository: https://github.com/Template-Toolkit-Latex/LaTeX-Driver.git version: 1.2.0 LaTeX-Driver-1.2.0/t/0000755000175000017500000000000013747065026015255 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/t/40-pkg-longtable.t0000755000175000017500000000476012704232647020420 0ustar ehuelsmannehuelsmann#!/usr/bin/perl # $Id: 20-complexdoc.t 62 2007-10-03 14:20:44Z andrew $ # TODO: 1. test the output document content # 2. Skip tests when longtable not installed use strict; use blib; use FindBin qw($Bin); use File::Spec; use lib ("$Bin/../lib", "$Bin/lib"); use Data::Dumper; use Test::More tests => 9; use Test::LaTeX::Driver; use LaTeX::Driver; tidy_directory($basedir, $docname, $debug); my $drv = LaTeX::Driver->new( source => $docpath, format => 'dvi', TEXINPUTS => [ "$Bin/testdata/00-common"], @DEBUGOPTS ); diag("Checking the formatting of a LaTeX document that uses 'longtable'"); isa_ok($drv, 'LaTeX::Driver'); #is($drv->basedir, $basedir, "checking basedir"); is($drv->basename, $docname, "checking basename"); #is($drv->basepath, File::Spec->catpath('', $basedir, $docname), "checking basepath"); is($drv->formatter, 'latex', "formatter"); ok($drv->run, "formatting $docname"); is($drv->stats->{pages}, 3, "should have 3 pages of output"); cmp_ok($drv->stats->{runs}{latex}, '>=', 2, "should have run latex at least two times"); cmp_ok($drv->stats->{runs}{latex}, '<=', 4, "should have run latex not more than four times"); ok(!$drv->stats->{runs}{bibtex}, "should not have run bibtex"); ok(!$drv->stats->{runs}{makeindex}, "should not have run makeindex"); if (0) { test_dvifile($drv, [ "Complex Test Document $testno", # title 'A.N. Other', # author '20 September 2007', # date '^Contents$', # table of contents header 'This is a test document with all features.', 'The document has 12 pages.', 'Forward Reference', # section title 'Here is a reference to page 9.', 'File Inclusion', 'Here we include another file.', 'Included File', # section title 'This is text from an included file.', 'Bibliographic Citations', 'We reference the Badger book\\[', '^WCC03$', '\\] and the Camel book\\[', '^Wal03$', 'Index Term', 'Here is the definition of the index term .xyzzy.', '^References$', # bibliography section heading '^\\s*\\[WCC03\\]$', # the bibiographic key 'Andy Wardley, Darren Chamberlain, and Dave Cross.', '^Index$', # Index section heading '\\bxyzzy, 8$', # the index term '\\bxyzzy2, 12$', # index term from the colophon '11$', # page number 11 'Colophon$' ] ); } tidy_directory($basedir, $docname, $debug) unless $no_cleanup; exit(0); LaTeX-Driver-1.2.0/t/91-pod.t0000755000175000017500000000043112704232647016451 0ustar ehuelsmannehuelsmann#!/usr/bin/perl use strict; use Test::More; BEGIN { plan( skip_all => 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.' ) unless $ENV{TEST_AUTHOR}; } eval "use Test::Pod"; plan skip_all => "Test::Pod required for testing POD" if $@; all_pod_files_ok(); LaTeX-Driver-1.2.0/t/README0000644000175000017500000000154212704232647016134 0ustar ehuelsmannehuelsmannThis directory contains unit test scripts for the LaTeX::Driver module. The test scripts invoke the module to format documents in subdirectories of the testdata directory. Each subdirectory corresponds to a single test script (so 14-makeindex.t uses the files in testdata/14-makeindex.t, with the main LaTeX file being 14-makeindex.tex). The subdirectory should be cleaned out at the start of the test script and again at the end of the script. The test documents are structured so that they each test an aspect of LaTeX formatting and the test scripts look for a series of patterns in the generated dvi files. The function test_dvifile uses the dvitype program if found to extract the strings from a DVI file. TODO ==== write test scripts to cover * included graphics * documents with errors (in progress) * test generation of PDF and PostScript files LaTeX-Driver-1.2.0/t/00-basic.t0000644000175000017500000000021712704232647016735 0ustar ehuelsmannehuelsmann#!/usr/bin/perl # $Id: 00-basic.t 4 2007-09-21 14:51:24Z andrew $ use strict; use blib; use Test::More tests => 1; use_ok("LaTeX::Driver"); LaTeX-Driver-1.2.0/t/02-brokendocs.t0000755000175000017500000000253712704232647020021 0ustar ehuelsmannehuelsmann#!/usr/bin/perl # $Id: 02-brokendocs.t 62 2007-10-03 14:20:44Z andrew $ use strict; use blib; use FindBin qw($Bin); use File::Spec; use lib ("$Bin/../lib", "$Bin/lib"); use Data::Dumper; use Test::More; BEGIN { eval "use Test::Exception"; plan skip_all => "Test::Exception needed" if $@; } use Test::LaTeX::Driver; use LaTeX::Driver; plan tests => 8; tidy_directory($basedir, $docname, $debug); my $drv = LaTeX::Driver->new( source => $docpath, format => 'dvi', DEBUG => $debug, DEBUGPREFIX => '# [latex]: ' ); diag("Checking the formatting of a simple LaTeX document"); isa_ok($drv, 'LaTeX::Driver'); #is($drv->basedir, $basedir, "checking basedir"); is($drv->basename, $docname, "checking basename"); #is($drv->basepath, File::Spec->catpath('', $basedir, $docname), "checking basepath"); is($drv->formatter, 'latex', "formatter"); throws_ok( sub { $drv->run }, 'LaTeX::Driver::Exception', "formatting broken document $docname"); is($drv->stats->{runs}{latex}, 1, "should have run latex once"); is($drv->stats->{runs}{bibtex}, undef, "should not have run bibtex"); is($drv->stats->{runs}{makeindex}, undef, "should not have run makeindex"); test_dvifile($drv, [ 'This is a test document with a broken LaTeX command.' ] ); tidy_directory($basedir, $docname, $debug) unless $no_cleanup; exit(0); LaTeX-Driver-1.2.0/t/14-makeindex.t0000755000175000017500000000576713747062546017657 0ustar ehuelsmannehuelsmann#!/usr/bin/perl # $Id: 14-makeindex.t 62 2007-10-03 14:20:44Z andrew $ # # Test out invocation of makeindex: # * Tests the default invocation of makeindex # * Tests alternate style (replaces comma after index term with colon) # * Tests index options (uses -l for letter ordering of index entries use strict; use warnings; use vars qw($debug $dont_tidy_up $drv); use blib; use FindBin qw($Bin); use File::Spec; use lib ("$Bin/../lib", "$Bin/lib"); use Data::Dumper; use Test::More; use Test::LaTeX::Driver; use LaTeX::Driver; system('makeindex', '--help'); if ($? == -1) { plan skip_all => q{Can't execute "makeindex"}; } else { plan tests => 14; } tidy_directory($basedir, $docname, $debug); $drv = LaTeX::Driver->new( source => $docpath, format => 'dvi', @DEBUGOPTS ); diag("Checking the formatting of a LaTeX document with an index"); isa_ok($drv, 'LaTeX::Driver'); #is($drv->basedir, $basedir, "checking basedir"); is($drv->basename, $docname, "checking basename"); #is($drv->basepath, File::Spec->catpath('', $basedir, $docname), "checking basepath"); is($drv->formatter, 'latex', "formatter"); ok($drv->run, "formatting $docname"); is($drv->stats->{runs}{latex}, 2, "should have run latex twice"); is($drv->stats->{runs}{bibtex}, undef, "should not have run bibtex"); is($drv->stats->{runs}{makeindex}, 1, "should have run makeindex once"); test_dvifile($drv, [ "Simple Test Document $testno", # title 'A.N. Other', # author '20 September 2007', # date "This is a test document that defines the index terms `seal' and `sea lion'.", "These are the example terms used in the makeindex man page.", '^ 1$', # page number 1 '^Index$', # Index section heading # word ordering of index entries 'sea lion, 1$', # two-word index term 'seal, 1$', # one-word index term '^ 2$' ] ); # page number 2 tidy_directory($basedir, $docname, $debug); diag("run again with an explicit index style option"); $drv = LaTeX::Driver->new( source => $docpath, format => 'dvi', indexstyle => 'testind', @DEBUGOPTS ); isa_ok($drv, 'LaTeX::Driver'); ok($drv->run, "formatting $docname"); test_dvifile($drv, [ '^Index$', # Index section heading # word ordering of index entries 'sea lion: 1$', # two-word index term 'seal: 1$', # one-word index term '^ 2$' ] ); # page number 2 tidy_directory($basedir, $docname, $debug); diag("run again with -l (letter ordering) option"); $drv = LaTeX::Driver->new( source => $docpath, format => 'dvi', indexoptions => '-l', @DEBUGOPTS ); isa_ok($drv, 'LaTeX::Driver'); ok($drv->run, "formatting $docname"); test_dvifile($drv, [ '^Index$', # Index section heading # letter ordering of index entries 'seal, 1$', # one-word index term 'sea lion, 1$', # two-word index term '^ 2$' ] ); # page number 2 tidy_directory($basedir, $docname, $debug) unless $no_cleanup; exit(0); LaTeX-Driver-1.2.0/t/90-kwalitee.t0000755000175000017500000000044712704232647017502 0ustar ehuelsmannehuelsmann#!/usr/bin/perl use strict; use Test::More; plan( skip_all => 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.' ) unless $ENV{TEST_AUTHOR}; eval { require Test::Kwalitee; Test::Kwalitee->import() }; plan( skip_all => 'Test::Kwalitee not installed; skipping' ) if $@; LaTeX-Driver-1.2.0/t/31-input-from-variable.t0000755000175000017500000000352613747062546021563 0ustar ehuelsmannehuelsmann#!/usr/bin/perl # $Id: 31-input-from-variable.t 81 2011-09-18 09:19:03Z andrew $ use strict; use blib; use FindBin qw($Bin); use File::Spec; use lib ("$Bin/../lib", "$Bin/lib"); use Data::Dumper; use Test::More; use Test::LaTeX::Driver; use LaTeX::Driver; use File::Slurp; plan skip_all => 'dvips not installed' if system('dvips -v'); plan tests => 11; tidy_directory($basedir, $docname, $debug); my $source = read_file($docpath) or die "cannot read the source data"; my $output; my $drv = LaTeX::Driver->new( source => \$source, format => 'ps', output => \$output, @DEBUGOPTS ); my $systmpdir = $ENV{TMPDIR} || '/tmp'; diag("Checking the formatting of a simple LaTeX document read from a variable"); isa_ok($drv, 'LaTeX::Driver'); my $tmpbasedir = File::Spec->catdir($systmpdir, $LaTeX::Driver::DEFAULT_TMPDIR); #like($drv->basedir, qr{^$tmpbasedir\w+$}, "checking basedir"); is($drv->basename, $LaTeX::Driver::DEFAULT_DOCNAME, "checking basename"); #is($drv->basepath, File::Spec->catpath('', $drv->basedir, $LaTeX::Driver::DEFAULT_DOCNAME), "checking basepath"); is($drv->formatter, 'latex', "formatter"); ok($drv->run, "formatting $docname"); is($drv->stats->{runs}{latex}, 1, "should have run latex once"); is($drv->stats->{runs}{bibtex}, undef, "should not have run bibtex"); is($drv->stats->{runs}{makeindex}, undef, "should not have run makeindex"); is($drv->stats->{runs}{dvips}, 1, "should have run dvips once"); like($output, qr/^%!PS/, "got postscript in output string"); my $tmpdir = $drv->basedir; ok(-d $tmpdir, "temporary directory exists before undeffing driver"); undef $drv; ok(!-d $tmpdir, "temporary directory deleted after undeffing driver"); tidy_directory($basedir, $docname, $debug) unless $no_cleanup; exit(0); LaTeX-Driver-1.2.0/t/93-perl-critic.t0000755000175000017500000000105112704232647020105 0ustar ehuelsmannehuelsmann#!/usr/bin/perl use strict; use warnings; use FindBin qw($Bin); use File::Spec; use Test::More; use English qw(-no_match_vars); if ( not $ENV{TEST_AUTHOR} ) { my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.'; plan( skip_all => $msg ); } eval { require Test::Perl::Critic; }; if ( $EVAL_ERROR ) { my $msg = 'Test::Perl::Critic required to criticise code'; plan( skip_all => $msg ); } my $rcfile = File::Spec->catfile( $Bin, 'perlcriticrc' ); Test::Perl::Critic->import( -profile => $rcfile ); all_critic_ok(); LaTeX-Driver-1.2.0/t/92-pod-coverage.t0000755000175000017500000000047012704232647020246 0ustar ehuelsmannehuelsmann#!/usr/bin/perl use strict; use Test::More; BEGIN { plan( skip_all => 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.' ) unless $ENV{TEST_AUTHOR}; } eval "use Test::Pod::Coverage"; plan skip_all => "Test::Pod::Coverage required for testing POD coverage" if $@; all_pod_coverage_ok(); LaTeX-Driver-1.2.0/t/13-tableofcontents.t0000755000175000017500000000357412704232647021066 0ustar ehuelsmannehuelsmann#!/usr/bin/perl # $Id: 13-tableofcontents.t 62 2007-10-03 14:20:44Z andrew $ use strict; use blib; use FindBin qw($Bin); use File::Spec; use lib ("$Bin/../lib", "$Bin/lib"); use Data::Dumper; use Test::More tests => 8; use Test::LaTeX::Driver; use LaTeX::Driver; tidy_directory($basedir, $docname, $debug); my $drv = LaTeX::Driver->new( source => $docpath, format => 'dvi', @DEBUGOPTS ); diag("Checking the formatting of a LaTeX document with a table of contents"); isa_ok($drv, 'LaTeX::Driver'); #is($drv->basedir, $basedir, "checking basedir"); is($drv->basename, $docname, "checking basename"); #is($drv->basepath, File::Spec->catpath('', $basedir, $docname), "checking basepath"); is($drv->formatter, 'latex', "formatter"); ok($drv->run, "formatting $docname"); is($drv->stats->{runs}{latex}, 2, "should have run latex twice"); is($drv->stats->{runs}{bibtex}, undef, "should not have run bibtex"); is($drv->stats->{runs}{makeindex}, undef, "should not have run makeindex"); test_dvifile($drv, [ "Simple Test Document $testno", # title 'A.N. Other', # author '20 September 2007', # date '^Contents$', # table of contents header '1$', # section 1 - section number 'Introduction', # section 1 - section title '2$', # section 1 - page number '2$', # section 2 - section number 'Section the second', # section 2 - section title '3$', # section 2 - page number '1$', # page number 1 '1$', # section 1 - number 'Introduction', # section 1 - title 'This is a test document with a table of contents.', '2$', # page number 2 '2$', # section 2 - number 'Section the second', # section 2 - title '3$' ] ); # page number 3 tidy_directory($basedir, $docname, $debug) unless $no_cleanup; exit(0); LaTeX-Driver-1.2.0/t/20-complexdoc.t0000755000175000017500000000616013661537540020024 0ustar ehuelsmannehuelsmann#!/usr/bin/perl # $Id: 20-complexdoc.t 79 2009-01-19 13:42:09Z andrew $ use strict; use blib; use FindBin qw($Bin); use File::Spec; use lib ("$Bin/../lib", "$Bin/lib"); use Data::Dumper; use Test::More; use Test::LaTeX::Driver; use LaTeX::Driver; plan skip_all => 'BIBTEX_TESTS not set. Requires lastpage.sty.' unless $ENV{BIBTEX_TESTS}; plan tests => 10; tidy_directory($basedir, $docname, $debug); my $drv = LaTeX::Driver->new( source => $docpath, format => 'dvi', TEXINPUTS => [ "$Bin/testdata/00-common"], @DEBUGOPTS ); diag("Checking the formatting of a complex LaTeX document with references, a bibliography, an index, etc"); isa_ok($drv, 'LaTeX::Driver'); #is($drv->basedir, $basedir, "checking basedir"); is($drv->basename, $docname, "checking basename"); #is($drv->basepath, File::Spec->catpath('', $basedir, $docname), "checking basepath"); is($drv->formatter, 'latex', "formatter"); ok($drv->run, "formatting $docname"); is($drv->stats->{pages}, 12, "should have 12 pages of output"); cmp_ok($drv->stats->{runs}{latex}, '>=', 5, "should have run latex at least five times"); cmp_ok($drv->stats->{runs}{latex}, '<=', 8, "should have run latex not more than eight times"); is($drv->stats->{runs}{bibtex}, 1, "should have run bibtex once"); is($drv->stats->{runs}{makeindex}, 2, "should have run makeindex twice"); test_dvifile($drv, [ "Complex Test Document $testno", # title 'A.N. Other', # author '20 September 2007', # date '^Contents$', # table of contents header 'This is a test document with all features.', 'The document has 12 pages.', 'Forward Reference', # section title 'Here is a reference to page 9.', 'File Inclusion', 'Here we include another file.', 'Included File', # section title 'This is text from an included file.', 'Bibliographic Citations', 'We reference the Badger book\\[', '^WCC03$', '\\] and the Camel book\\[', '^Wal03$', 'Index Term', 'Here is the definition of the index term .xyzzy.', '^References$', # bibliography section heading '^\\s*\\[WCC03\\]$', # the bibiographic key 'Andy Wardley, Darren Chamberlain, and Dave Cross.', '^Index$', # Index section heading '\\bxyzzy, 8$', # the index term '\\bxyzzy2, 12$', # index term from the colophon '11$', # page number 11 'Colophon$' ] ); tidy_directory($basedir, $docname, $debug) unless $no_cleanup; exit(0); LaTeX-Driver-1.2.0/t/01-errors.t0000755000175000017500000000311713661537540017201 0ustar ehuelsmannehuelsmann#!/usr/bin/perl # Script to test LaTeX::Driver's error handling # $Id: 01-errors.t 50 2007-09-28 10:51:47Z andrew $ use strict; use blib; use vars qw($testno $basedir $docname $drv $debug $debugprefix $dont_tidy_up); use FindBin qw($Bin); use File::Spec; use lib ("$Bin/../lib", "$Bin/lib"); use Data::Dumper; use Test::More; BEGIN { eval "use Test::Exception"; plan skip_all => "Test::Exception needed" if $@; } use Test::LaTeX::Driver; use LaTeX::Driver; plan tests => 5; # For some of our tests we need a directory that does not exist, we # had better make sure that someone hasn't created it. my $nonexistent_dir = "$basedir/this-directory-should-not-exist"; die "hey, someone created our non-existent directory" if -d $nonexistent_dir; diag("testing constructor error handling"); dies_ok { LaTeX::Driver->new( DEBUG => $debug, DEBUGPREFIX => $debugprefix ) } 'no source specified'; like($@, qr{no source specified}, 'constructor fails without a source'); dies_ok { LaTeX::Driver->new( source => $docpath, format => 'tiff', DEBUG => $debug, DEBUGPREFIX => $debugprefix ) } 'unsupported output type'; like($@, qr{invalid output format}, "'tiff' is not a supported output type"); diag("execution error handling"); $LaTeX::Driver::program_path{'xelatex'} = 'abcdefghijklmnopqrstuvwxyz0123456789'; my $drv = LaTeX::Driver->new( source => 't/testdata/01-errors/01-errors' ); dies_ok { $drv->run_latex; } 'Failure to start abcdefghijklm'; exit(0); LaTeX-Driver-1.2.0/t/30-output-to-variable.t0000755000175000017500000000250712704232647021431 0ustar ehuelsmannehuelsmann#!/usr/bin/perl # $Id: 30-output-to-variable.t 62 2007-10-03 14:20:44Z andrew $ use strict; use blib; use FindBin qw($Bin); use File::Spec; use lib ("$Bin/../lib", "$Bin/lib"); use Data::Dumper; use Test::More; use Test::LaTeX::Driver; use LaTeX::Driver; plan skip_all => 'dvips not installed' if system('dvips -v'); plan tests => 9; tidy_directory($basedir, $docname, $debug); my $output; my $drv = LaTeX::Driver->new( source => $docpath, format => 'ps', output => \$output, @DEBUGOPTS ); diag("Checking the formatting of a simple LaTeX document into a variable"); isa_ok($drv, 'LaTeX::Driver'); #is($drv->basedir, $basedir, "checking basedir"); is($drv->basename, $docname, "checking basename"); #is($drv->basepath, File::Spec->catpath('', $basedir, $docname), "checking basepath"); is($drv->formatter, 'latex', "formatter"); ok($drv->run, "formatting $docname"); is($drv->stats->{runs}{latex}, 1, "should have run latex once"); is($drv->stats->{runs}{bibtex}, undef, "should not have run bibtex"); is($drv->stats->{runs}{makeindex}, undef, "should not have run makeindex"); is($drv->stats->{runs}{dvips}, 1, "should have run dvips once"); like($output, qr/^%!PS/, "got postscript in output string"); tidy_directory($basedir, $docname, $debug) unless $no_cleanup; exit(0); LaTeX-Driver-1.2.0/t/perlcriticrc0000644000175000017500000000042012704232647017656 0ustar ehuelsmannehuelsmann# perlcriticrc file for our Test::Perl::Critic tests severity = 3 only = 1 force = 0 verbose = 4 top = 50 theme = (pbp || security) && bugs include = NamingConventions ClassHierarchies exclude = Variables Modules::RequirePackage #color = 0 LaTeX-Driver-1.2.0/t/10-simpledoc.t0000755000175000017500000000570512704232647017646 0ustar ehuelsmannehuelsmann#!/usr/bin/perl # $Id: 10-simpledoc.t 85 2012-08-31 19:08:22Z andrew $ use strict; use blib; use FindBin qw($Bin); use File::Spec; use lib ("$Bin/../lib", "$Bin/lib"); use Data::Dumper; use Test::More; use Test::LaTeX::Driver; use LaTeX::Driver; tidy_directory($basedir, $docname, $debug); my $drv = LaTeX::Driver->new( source => $docpath, format => 'dvi', @DEBUGOPTS ); plan skip_all => 'FORMATTER_TESTING not set' unless $ENV{FORMATTER_TESTING}; plan tests => 24; diag("Checking the formatting of a simple LaTeX document"); isa_ok($drv, 'LaTeX::Driver'); #is($drv->basedir, $basedir, "checking basedir"); is($drv->basename, $docname, "checking basename"); #is($drv->basepath, File::Spec->catpath('', $basedir, $docname), "checking basepath"); is($drv->formatter, 'latex', "formatter"); ok($drv->run, "formatting $docname"); is($drv->stats->{runs}{latex}, 1, "should have run latex once"); is($drv->stats->{runs}{bibtex}, undef, "should not have run bibtex"); is($drv->stats->{runs}{makeindex}, undef, "should not have run makeindex"); test_dvifile($drv, [ "Simple Test Document $testno", # title 'A.N. Other', # author '20 September 2007', # date 'This is a test document with a single line of text.' ] ); tidy_directory($basedir, $docname, $debug); diag("Checking the generation of PDF"); $drv = LaTeX::Driver->new( source => $docpath, format => 'pdf', @DEBUGOPTS ); ok($drv->run, "formatting $docname"); ok(-f ($drv->basepath . '.pdf'), "PDF file exists"); ok(! -f ($drv->basepath . '.dvi'), "but DVI file doesn't"); ok(! -f ($drv->basepath . '.ps'), "but PS file doesn't"); tidy_directory($basedir, $docname, $debug); diag("Checking the generation of PostScript"); $drv = LaTeX::Driver->new( source => $docpath, format => 'ps', @DEBUGOPTS ); ok($drv->run, "formatting $docname to PostScript"); ok(-f ($drv->basepath . '.ps'), "PostScript file exists"); ok(-f ($drv->basepath . '.dvi'), "as does DVI file"); ok(! -f ($drv->basepath . '.pdf'), "but PS file doesn't"); tidy_directory($basedir, $docname, $debug); diag("Checking the generation of PDF, via PostScript"); $drv = LaTeX::Driver->new( source => $docpath, format => 'pdf(ps)', @DEBUGOPTS ); ok($drv->run, "formatting $docname to PDF, via PostScript"); ok(-f ($drv->basepath . '.pdf'), "PDF file exists"); ok(-f ($drv->basepath . '.ps'), "PostScript file exists"); ok(-f ($drv->basepath . '.dvi'), "DVI file exists"); tidy_directory($basedir, $docname, $debug); diag("Checking the generation of PostScript, via PDF"); $drv = LaTeX::Driver->new( source => $docpath, format => 'ps(pdf)', @DEBUGOPTS ); ok($drv->run, "formatting $docname to PostScript, via PDF"); ok(-f ($drv->basepath . '.pdf'), "PDF file exists"); ok(-f ($drv->basepath . '.ps'), "PostScript file exists"); ok(! -f ($drv->basepath . '.dvi'), "DVI file does not exists"); tidy_directory($basedir, $docname, $debug) unless $no_cleanup; exit(0); LaTeX-Driver-1.2.0/t/lib/0000755000175000017500000000000013747065026016023 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/t/lib/Test/0000755000175000017500000000000013747065026016742 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/t/lib/Test/LaTeX/0000755000175000017500000000000013747065026017717 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/t/lib/Test/LaTeX/Driver.pm0000644000175000017500000001423112704232647021506 0ustar ehuelsmannehuelsmann#======================================================================== # # Test::LaTeX::Driver # # DESCRIPTION # Module for testing the LaTeX::Driver module # # AUTHOR # Andrew Ford # # COPYRIGHT # Copyright (C) 2007 Andrew Ford. All Rights Reserved. # # This module is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. # # HISTORY # * New file - but portions extracted from the Template::Latex # module (AF, 2007-09-19) # # $Id: Driver.pm 49 2007-09-28 10:50:09Z andrew $ # # TODO # * finish off commenting and documentation # # * integrate with Test::More # #======================================================================== package Test::LaTeX::Driver; use strict; use warnings; use Config; use FindBin qw($Bin); use Getopt::Long; use Test::More; require Exporter; our @ISA = qw(Exporter); our @EXPORT = qw(get_test_params test_dvifile tidy_directory find_program dvitype $testno $basedir $docname $docpath $debug $debug_prefix @DEBUGOPTS $no_cleanup); our $WIN32 = ($^O eq 'MSWin32'); our $level = 0; our $debug = 0; our $no_cleanup = 0; our $debug_prefix = '# [latex]: '; my $dvitype = find_program($ENV{PATH}, "dvitype"); GetOptions("debug" => \$debug, "level=i" => \$level, "no_cleanup" => \$no_cleanup); $debug = $level if $level; our @DEBUGOPTS = ( DEBUG => $debug, DEBUGPREFIX => $debug_prefix); our ($testno, $basedir, $docname, $docpath) = get_test_params(); sub get_test_params { my $slash = $WIN32 ? "[\\\\/]" : "/"; # both can happen on win32 my $basename = $0; $basename =~ s{ ^ .* $slash }{}x; $basename =~ s/\.t$//; my ($testno) = $basename =~ m/^(\d+)/; die "cannot determine test no from script name $0" unless $testno; my $basedir = "$Bin/testdata/$basename"; my $docpath = "$basedir/${basename}.tex"; return ($testno, $basedir, $basename, $docpath); } sub dvitype { return $dvitype; } #------------------------------------------------------------------------ # find_program($path, $prog) # # Find a program, $prog, by traversing the given directory path, $path. # Returns full path if the program is found. # # Written by Craig Barratt, Richard Tietjen add fixes for Win32. # # abw changed name from studly caps findProgram() to find_program() :-) #------------------------------------------------------------------------ sub find_program { my($path, $prog) = @_; foreach my $dir ( split($Config{path_sep}, $path) ) { my $file = File::Spec->catfile($dir, $prog); if ( !$WIN32 ) { return $file if ( -x $file ); } else { # Windows executables end in .xxx, exe precedes .bat and .cmd foreach my $dx ( qw/exe bat cmd/ ) { return "$file.$dx" if ( -x "$file.$dx" ); } } } } #------------------------------------------------------------------------ # tidy_directory($dir, $docname, $debug) # # Cleans up the temporary files for the document $docname in the # directory $dir. The temporary files are: # # .aux LaTeX auxilliary file # .toc LaTeX table of contents # .lof LaTeX list of figures # .lot LaTeX list of tables # .log LaTeX log file # .idx raw index file # .ibk .idx backup file (generated by LaTeX::Driver) # .ind formatted index # .ilg makeindex log file # .cit citation file (generated by LaTeX::Driver) # .cit backup citation file (generated by LaTeX::Driver) # .bbl # .dvi # .ps # .pdf #------------------------------------------------------------------------ sub tidy_directory { my ($dir, $docname, $debug) = @_; # Suppress undefined value warnings $debug = 0 unless defined($debug); diag("tidying directory '$dir'") if $debug > 1; die "directory $dir does not exist" unless -d $dir; die "filename $docname contains a directory part" if $docname =~ m!/!; foreach my $ext (qw(aux toc lof lot log ind idx ilg ibk bbl blg cit cbk dvi ps pdf)) { my $file = File::Spec->catfile($dir, "${docname}.$ext"); if (-e $file) { diag("removing file '$file'") if $debug > 1; my $rc = unlink($file); diag("unlink returned $rc") if $debug > 2; diag("couldn't remove file '$file'") if $debug > 1 and -e $file; } else { diag("file '$file' does not exist") if $debug > 3; } } } #------------------------------------------------------------------------ # test_dvifile($drv, $pattern_seq) # # Examines the TeX DVI file generated an looks for the sequence of # patterns specified #------------------------------------------------------------------------ sub test_dvifile { my $drv = shift; my @patterns = ref $_[0] ? @{$_[0]} : @_; my $file = $drv->basepath . ".dvi"; if (! -f $file) { fail("dvifile $file does not exist"); return; } SKIP: { skip "cannot find dvitype", 1 unless $dvitype; my $dvioutput = `"$dvitype" "$file"`; my $total = @patterns; my $found = 0; my $pattern = shift @patterns; foreach (split(/\n/, $dvioutput)) { next unless /^\[(.*)\]$/; my $string = $1; if ($string =~ /$pattern/) { if (@patterns) { $pattern = shift @patterns; $found++; } else { pass($drv->basename . ".dvi contains the $total patterns specified"); return 1; } } } fail("pattern '$pattern' not found in " . $drv->basename . ".dvi (found $found of $total patterns)"); } return; } 1; =head1 NAME Test::LaTeX::Driver =head1 SYNOPSIS =head1 DESCRIPTION =head1 AUTHOR Andrew Ford Ea.ford@ford-mason.co.ukE =head1 COPYRIGHT Copyright (C) 2007 Andrew Ford. All Rights Reserved. This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut # Local Variables: # mode: perl # perl-indent-level: 4 # indent-tabs-mode: nil # End: # # vim: expandtab shiftwidth=4: LaTeX-Driver-1.2.0/t/11-references.t0000755000175000017500000000270512704232647020006 0ustar ehuelsmannehuelsmann#!/usr/bin/perl # $Id: 11-references.t 62 2007-10-03 14:20:44Z andrew $ use strict; use blib; use FindBin qw($Bin); use File::Spec; use lib ("$Bin/../lib", "$Bin/lib"); use Data::Dumper; use Test::More tests => 8; use Test::LaTeX::Driver; use LaTeX::Driver; tidy_directory($basedir, $docname, $debug); my $drv = LaTeX::Driver->new( source => $docpath, format => 'dvi', @DEBUGOPTS ); diag("Checking the formatting of a LaTeX document with forward references"); isa_ok($drv, 'LaTeX::Driver'); #is($drv->basedir, $basedir, "checking basedir"); is($drv->basename, $docname, "checking basename"); #is($drv->basepath, File::Spec->catpath('', $basedir, $docname), "checking basepath"); is($drv->formatter, 'latex', "formatter"); ok($drv->run, "formatting $docname"); is($drv->stats->{runs}{latex}, 2, "should have run latex twice"); is($drv->stats->{runs}{bibtex}, undef, "should not have run bibtex"); is($drv->stats->{runs}{makeindex}, undef, "should not have run makeindex"); test_dvifile($drv, [ "Simple Test Document $testno", # title 'A.N. Other', # author '20 September 2007', # date 'This is a test document containing a forward reference.', 'See page 2.', # second para with page ref '^ 1$', # page number 1 'This is the second page.', # text on second page '^ 2$' ] ); # page number 2 tidy_directory($basedir, $docname, $debug) unless $no_cleanup; exit(0); LaTeX-Driver-1.2.0/t/12-includes.t0000755000175000017500000000257212704232647017476 0ustar ehuelsmannehuelsmann#!/usr/bin/perl # $Id: 12-includes.t 62 2007-10-03 14:20:44Z andrew $ use strict; use blib; use FindBin qw($Bin); use File::Spec; use lib ("$Bin/../lib", "$Bin/lib"); use Data::Dumper; use Test::More tests => 8; use Test::LaTeX::Driver; use LaTeX::Driver; tidy_directory($basedir, $docname, $debug); my $drv = LaTeX::Driver->new( source => $docpath, format => 'dvi', @DEBUGOPTS ); diag("Checking the formatting of a LaTeX document that includes other files"); isa_ok($drv, 'LaTeX::Driver'); #is($drv->basedir, $basedir, "checking basedir"); is($drv->basename, $docname, "checking basename"); #is($drv->basepath, File::Spec->catpath('', $basedir, $docname), "checking basepath"); is($drv->formatter, 'latex', "formatter"); ok($drv->run, "formatting $docname"); is($drv->stats->{runs}{latex}, 1, "should have run latex once"); is($drv->stats->{runs}{bibtex}, undef, "should not have run bibtex"); is($drv->stats->{runs}{makeindex}, undef, "should not have run makeindex"); test_dvifile($drv, [ "Simple Test Document $testno", # title 'A.N. Other', # author '20 September 2007', # date 'This is a test document that includes another file.', '^ 1$', # page number 1 'This is text from an included file.', '^ 2$' ] ); # page number 2 tidy_directory($basedir, $docname, $debug) unless $no_cleanup; exit(0); LaTeX-Driver-1.2.0/t/testdata/0000755000175000017500000000000013747065026017066 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/t/testdata/14-makeindex/0000755000175000017500000000000013747065026021255 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/t/testdata/14-makeindex/14-makeindex.tex0000644000175000017500000000106412704232647024164 0ustar ehuelsmannehuelsmann% $Id: 14-makeindex.tex 22 2007-09-23 20:35:35Z andrew $ % Test input file for checking index generation. % Do not make gratuitous changes here as the text is checked by the % test script 14-makeindex.t. \documentclass{article} \usepackage{makeidx} \makeindex \date{20 September 2007} \author{A.N. Other} \title{Simple Test Document 14} \begin{document} \maketitle This is a test document that def{}ines the index terms `seal' and `sea lion'. These are the example terms used in the makeindex man page. \index{seal} \index{sea lion} \printindex \end{document} LaTeX-Driver-1.2.0/t/testdata/14-makeindex/testind.ist0000644000175000017500000000011512704232647023442 0ustar ehuelsmannehuelsmann%% This is a test index file delim_0 ": " %% %% End of file `testind.ist'. LaTeX-Driver-1.2.0/t/testdata/30-output-to-variable/0000755000175000017500000000000013747065026023051 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/t/testdata/30-output-to-variable/30-output-to-variable.tex0000644000175000017500000000053512704232647027556 0ustar ehuelsmannehuelsmann% Test input file for checking of simple formatting. % Do not make gratuitous changes here as the text is checked by the % test script 10-simpledoc.t. \documentclass{article} \date{20 September 2007} \author{A.N. Other} \title{Simple Test Document 03} \begin{document} \maketitle This is a test document with a single line of text. \end{document} LaTeX-Driver-1.2.0/t/testdata/12-includes/0000755000175000017500000000000013747065026021114 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/t/testdata/12-includes/testinc.aux0000644000175000017500000000064613710327642023305 0ustar ehuelsmannehuelsmann\relax \@setckpt{testinc}{ \setcounter{page}{3} \setcounter{equation}{0} \setcounter{enumi}{0} \setcounter{enumii}{0} \setcounter{enumiii}{0} \setcounter{enumiv}{0} \setcounter{footnote}{0} \setcounter{mpfootnote}{0} \setcounter{part}{0} \setcounter{section}{0} \setcounter{subsection}{0} \setcounter{subsubsection}{0} \setcounter{paragraph}{0} \setcounter{subparagraph}{0} \setcounter{figure}{0} \setcounter{table}{0} } LaTeX-Driver-1.2.0/t/testdata/12-includes/testinc.tex0000644000175000017500000000045312704232647023306 0ustar ehuelsmannehuelsmann% Test input file for checking inclusion of other files. % Do not make gratuitous changes here as the text is checked by the % test script 12-include.t. % Note: the word file on the next line is spellt "f{}ile" to prevent % LaTeX using a ligature. This is text from an included f{}ile. \endinput LaTeX-Driver-1.2.0/t/testdata/12-includes/12-includes.tex0000644000175000017500000000077612704232647023673 0ustar ehuelsmannehuelsmann% Test input file for checking inclusion of other files. % Do not make gratuitous changes here as the text is checked by the % test script 12-include.t. \documentclass{article} \date{20 September 2007} \author{A.N. Other} \title{Simple Test Document 12} \begin{document} \maketitle % Note: the word file on the next line is spellt "f{}ile" to prevent % LaTeX using a ligature. This is a test document that includes another f{}ile. \include{testinc} %\input{deeply/nested/directory/testinc2} \end{document} LaTeX-Driver-1.2.0/t/testdata/11-references/0000755000175000017500000000000013747065026021426 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/t/testdata/11-references/11-references.tex0000644000175000017500000000066412704232647024513 0ustar ehuelsmannehuelsmann% Test input file for checking forward references. % Do not make gratuitous changes here as the text is checked by the % test script 14-makeindex.t. \documentclass{article} \date{20 September 2007} \author{A.N. Other} \title{Simple Test Document 11} \begin{document} \maketitle This is a test document containing a forward reference. See page~\pageref{pagetwo}. \par \pagebreak This is the second page\label{pagetwo}. \end{document} LaTeX-Driver-1.2.0/t/testdata/README0000644000175000017500000000021612704232647017742 0ustar ehuelsmannehuelsmannThis directory hierachy contains testdata for the LaTeX::Driver unit tests. Each of the subdirectories corresponds with a specific unit test.LaTeX-Driver-1.2.0/t/testdata/00-common/0000755000175000017500000000000013747065026020573 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/t/testdata/00-common/testinc2.tex0000644000175000017500000000054312704232647023047 0ustar ehuelsmannehuelsmann% Test input file for checking inclusion of other files from a % directory other than the document directory. % Do not make gratuitous changes here as the text is checked by % various test scripts. % Note: the word file on the next line is spellt "f{}ile" to prevent % LaTeX using a ligature. This is text from an included f{}ile (testinc2). \endinput LaTeX-Driver-1.2.0/t/testdata/20-complexdoc/0000755000175000017500000000000013747065026021442 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/t/testdata/20-complexdoc/testinc.aux0000644000175000017500000000076112706223615023630 0ustar ehuelsmannehuelsmann\relax \@writefile{toc}{\contentsline {section}{\numberline {4}Included File}{5}} \@setckpt{testinc}{ \setcounter{page}{6} \setcounter{equation}{0} \setcounter{enumi}{0} \setcounter{enumii}{0} \setcounter{enumiii}{0} \setcounter{enumiv}{0} \setcounter{footnote}{0} \setcounter{mpfootnote}{0} \setcounter{part}{0} \setcounter{section}{4} \setcounter{subsection}{0} \setcounter{subsubsection}{0} \setcounter{paragraph}{0} \setcounter{subparagraph}{0} \setcounter{figure}{0} \setcounter{table}{0} } LaTeX-Driver-1.2.0/t/testdata/20-complexdoc/testinc.tex0000644000175000017500000000050412704232647023631 0ustar ehuelsmannehuelsmann% Test input file for checking inclusion of other files. % Do not make gratuitous changes here as the text is checked by the % test script 12-include.t. % Note: the word file on the next line is spellt "f{}ile" to prevent % LaTeX using a ligature. \section{Included File} This is text from an included f{}ile. \endinput LaTeX-Driver-1.2.0/t/testdata/20-complexdoc/20-complexdoc.tex0000644000175000017500000000254012704232647024536 0ustar ehuelsmannehuelsmann% $Id: 20-complexdoc.tex 37 2007-09-25 20:02:31Z andrew $ % Test input file for checking complete document with references, table of contents, % included file, bibliography and index % Do not make gratuitous changes here as the text is checked by the % test script 20-complexdoc.t. \documentclass{article} \usepackage{makeidx} \usepackage{lastpage} \bibliographystyle{alpha} \date{20 September 2007} \author{A.N. Other} \title{Complex Test Document 20} \makeindex \begin{document} \maketitle \tableofcontents \pagebreak \section{Introduction} This is a test document with all features. The document has \pageref{LastPage} pages. \pagebreak \section{Forward Reference} Here is a reference to page~\pageref{otherpage}. \pagebreak \section{File Inclusion} Here we include another f{}ile. It will start on the next page. \include{testinc} \input{testinc2} \pagebreak \section{Bibliographic Citations} We reference the Badger book\cite{wardley-ptt-2003} and the Camel book\cite{wall-perl-2000}. \pagebreak \section{Index Term} Here is the def{}inition of the index term `xyzzy'. \index{xyzzy} \pagebreak \section{Label definition} This is the other page\label{otherpage} referenced elsewhere. \pagebreak \bibliography{testbib} \pagebreak \printindex \section{Colophon} This is evil -- we are def{}ining index terms after the index. \index{xyzzy2} \end{document} LaTeX-Driver-1.2.0/t/testdata/20-complexdoc/testbib.bib0000644000175000017500000000147212704232647023555 0ustar ehuelsmannehuelsmann%% This is a test bibliography merely intended for testing Template::Latex @Book{wardley-ptt-2003, title = "Perl Template Toolkit", author = "Andy Wardley and Darren Chamberlain and Dave Cross", publisher = "O'Reilly Media", year = "2003", } @Book{wall-perl-2000, title = "The Perl Programming Language", author = "Larry Wall", publisher = "O'Reilly Media", year = "2003", } @Book{butcher-81, title = "Copy-editing", author = "Judith Butcher", publisher = "Cambridge University Press", year = "1981", edition = "2nd", } @Book{chicago-82, title = "The {C}hicago Manual of Style", author = "`Chicago'", year = "1982", publisher = "University of Chicago Press", edition = "13th", } LaTeX-Driver-1.2.0/t/testdata/31-input-from-variable/0000755000175000017500000000000013747065026023172 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/t/testdata/31-input-from-variable/31-input-from-variable.tex0000644000175000017500000000053512704232647030020 0ustar ehuelsmannehuelsmann% Test input file for checking of simple formatting. % Do not make gratuitous changes here as the text is checked by the % test script 10-simpledoc.t. \documentclass{article} \date{20 September 2007} \author{A.N. Other} \title{Simple Test Document 03} \begin{document} \maketitle This is a test document with a single line of text. \end{document} LaTeX-Driver-1.2.0/t/testdata/10-simpledoc/0000755000175000017500000000000013747065026021263 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/t/testdata/10-simpledoc/10-simpledoc.tex0000644000175000017500000000053512704232647024202 0ustar ehuelsmannehuelsmann% Test input file for checking of simple formatting. % Do not make gratuitous changes here as the text is checked by the % test script 10-simpledoc.t. \documentclass{article} \date{20 September 2007} \author{A.N. Other} \title{Simple Test Document 10} \begin{document} \maketitle This is a test document with a single line of text. \end{document} LaTeX-Driver-1.2.0/t/testdata/02-brokendocs/0000755000175000017500000000000013747065026021436 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/t/testdata/02-brokendocs/02-brokendocs.tex0000644000175000017500000000054112704232647024525 0ustar ehuelsmannehuelsmann% Test input file for checking of simple formatting. % Do not make gratuitous changes here as the text is checked by the % test script 10-simpledoc.t. \documentclass{article} \date{20 September 2007} \author{A.N. Other} \title{Simple Test Document 10} \begin{document} \maketitleXXX This is a test document with a broken LaTeX command. \end{document} LaTeX-Driver-1.2.0/t/testdata/13-tableofcontents/0000755000175000017500000000000013747065026022501 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/t/testdata/13-tableofcontents/13-tableofcontents.tex0000644000175000017500000000100712704232647026631 0ustar ehuelsmannehuelsmann% $Id: 13-tableofcontents.tex 20 2007-09-23 16:05:54Z andrew $ % Test input file for checking table of contents generation. % Do not make gratuitous changes here as the text is checked by the % test script 13-tableofcontents.t. \documentclass{article} \date{20 September 2007} \author{A.N. Other} \title{Simple Test Document 13} \begin{document} \maketitle \tableofcontents \pagebreak \section{Introduction} This is a test document with a table of contents. \pagebreak \section{Section the second} \end{document} LaTeX-Driver-1.2.0/t/testdata/40-pkg-longtable/0000755000175000017500000000000013747065026022035 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/t/testdata/40-pkg-longtable/40-pkg-longtable.tex0000644000175000017500000001075612704232647025534 0ustar ehuelsmannehuelsmann% $Id: 20-complexdoc.tex 37 2007-09-25 20:02:31Z andrew $ % Test input file for checking complete document with references, table of contents, % included file, bibliography and index % Do not make gratuitous changes here as the text is checked by the % test script 21-pkg-longtable.t. \documentclass{article} \usepackage{longtable} \date{18 January 2009} \author{A.N. Other} \title{Complex Test Document 21 -- using \textbf{longtable}} \begin{document} \maketitle \pagebreak \section{Introduction} This is a test document that uses the \textbf{longtable} package. \begin{center} \begin{longtable}{|l|l|l|} \caption[Sample longtable]{Sample longtable}\\ \hline \multicolumn{1}{|c|}{\textbf{Column A}} & \multicolumn{1}{c|}{\textbf{Column B}} & \multicolumn{1}{c|}{\textbf{Column C}} \\ \hline \endfirsthead \multicolumn{3}{c}% {{\bfseries \tablename\ \thetable{} -- continued from previous page}} \\ \hline \multicolumn{1}{|c|}{\textbf{Column A}} & \multicolumn{1}{c|}{\textbf{Column B}} & \multicolumn{1}{c|}{\textbf{Column C}} \\ \hline \endhead \hline \multicolumn{3}{|r|}{{Continued on next page}} \\ \hline \endfoot \hline \hline \endlastfoot 0 & (1, 11, 13725) & (1, 12, 10980), (1, 13, 8235), (2, 2, 0), (3, 1, 0) \\ 2745 & (1, 12, 10980) & (1, 13, 8235), (2, 2, 0), (2, 3, 0), (3, 1, 0) \\ 5490 & (1, 12, 13725) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 8235 & (1, 12, 16470) & (1, 13, 13725), (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 10980 & (1, 12, 16470) & (1, 13, 13725), (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 13725 & (1, 12, 16470) & (1, 13, 13725), (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 16470 & (1, 13, 16470) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 19215 & (1, 12, 16470) & (1, 13, 13725), (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 21960 & (1, 12, 16470) & (1, 13, 13725), (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 24705 & (1, 12, 16470) & (1, 13, 13725), (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 27450 & (1, 12, 16470) & (1, 13, 13725), (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 30195 & (2, 2, 2745) & (2, 3, 0), (3, 1, 0) \\ 32940 & (1, 13, 16470) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 35685 & (1, 13, 13725) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 38430 & (1, 13, 10980) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 41175 & (1, 12, 13725) & (1, 13, 10980), (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 43920 & (1, 13, 10980) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 46665 & (2, 2, 2745) & (2, 3, 0), (3, 1, 0) \\ 49410 & (2, 2, 2745) & (2, 3, 0), (3, 1, 0) \\ 52155 & (1, 12, 16470) & (1, 13, 13725), (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 54900 & (1, 13, 13725) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 57645 & (1, 13, 13725) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 60390 & (1, 12, 13725) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 63135 & (1, 13, 16470) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 65880 & (1, 13, 16470) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 68625 & (2, 2, 2745) & (2, 3, 0), (3, 1, 0) \\ 71370 & (1, 13, 13725) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 74115 & (1, 12, 13725) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 76860 & (1, 13, 13725) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 79605 & (1, 13, 13725) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 82350 & (1, 12, 13725) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 85095 & (1, 12, 13725) & (1, 13, 10980), (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 87840 & (1, 13, 16470) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 90585 & (1, 13, 16470) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 93330 & (1, 13, 13725) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 96075 & (1, 13, 16470) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 98820 & (1, 13, 16470) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 101565 & (1, 13, 13725) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 104310 & (1, 13, 16470) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 107055 & (1, 13, 13725) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 109800 & (1, 13, 13725) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 112545 & (1, 12, 16470) & (1, 13, 13725), (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 115290 & (1, 13, 16470) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 118035 & (1, 13, 13725) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 120780 & (1, 13, 16470) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 123525 & (1, 13, 13725) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 126270 & (1, 12, 16470) & (1, 13, 13725), (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 129015 & (2, 2, 2745) & (2, 3, 0), (3, 1, 0) \\ 131760 & (2, 2, 2745) & (2, 3, 0), (3, 1, 0) \\ 134505 & (1, 13, 16470) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 137250 & (1, 13, 13725) & (2, 2, 2745), (2, 3, 0), (3, 1, 0) \\ 139995 & (2, 2, 2745) & (2, 3, 0), (3, 1, \end{longtable} \end{center} \end{document} LaTeX-Driver-1.2.0/t/testdata/01-errors/0000755000175000017500000000000013747065026020620 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/t/testdata/01-errors/01-errors.tex0000644000175000017500000000012412704232647023066 0ustar ehuelsmannehuelsmannThis file just exists to satisfy the LaTeX::Driver new method's file existence test.LaTeX-Driver-1.2.0/t/testdata/15-bibtex/0000755000175000017500000000000013747065026020566 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/t/testdata/15-bibtex/testbib.bib0000644000175000017500000000147212704232647022701 0ustar ehuelsmannehuelsmann%% This is a test bibliography merely intended for testing Template::Latex @Book{wardley-ptt-2003, title = "Perl Template Toolkit", author = "Andy Wardley and Darren Chamberlain and Dave Cross", publisher = "O'Reilly Media", year = "2003", } @Book{wall-perl-2000, title = "The Perl Programming Language", author = "Larry Wall", publisher = "O'Reilly Media", year = "2003", } @Book{butcher-81, title = "Copy-editing", author = "Judith Butcher", publisher = "Cambridge University Press", year = "1981", edition = "2nd", } @Book{chicago-82, title = "The {C}hicago Manual of Style", author = "`Chicago'", year = "1982", publisher = "University of Chicago Press", edition = "13th", } LaTeX-Driver-1.2.0/t/testdata/15-bibtex/15-bibtex.tex0000644000175000017500000000103312704232647023002 0ustar ehuelsmannehuelsmann% $Id: 15-bibtex.tex 20 2007-09-23 16:05:54Z andrew $ % Test input file for checking bibliography generation % Do not make gratuitous changes here as the text is checked by the % test script 15-bibtex.t. \documentclass{article} \bibliographystyle{alpha} \date{20 September 2007} \author{A.N. Other} \title{Simple Test Document 15} \begin{document} \maketitle This is a test document with a bibliography. We reference the Badger book\cite{wardley-ptt-2003} and the Camel book\cite{wall-perl-2000}. \bibliography{testbib} \end{document} LaTeX-Driver-1.2.0/t/15-bibtex.t0000755000175000017500000000315712704232647017150 0ustar ehuelsmannehuelsmann#!/usr/bin/perl # $Id: 15-bibtex.t 62 2007-10-03 14:20:44Z andrew $ use strict; use blib; use FindBin qw($Bin); use File::Spec; use lib ("$Bin/../lib", "$Bin/lib"); use Data::Dumper; use Test::More; use Test::LaTeX::Driver; use LaTeX::Driver; plan skip_all => 'BIBTEX_TESTS not set. Requires lastpage.sty.' unless $ENV{BIBTEX_TESTS}; plan tests => 8; tidy_directory($basedir, $docname, $debug); my $drv = LaTeX::Driver->new( source => $docpath, format => 'dvi', @DEBUGOPTS ); diag("Checking the formatting of a LaTeX document with a bibliography"); isa_ok($drv, 'LaTeX::Driver'); #is($drv->basedir, $basedir, "checking basedir"); is($drv->basename, $docname, "checking basename"); #is($drv->basepath, File::Spec->catpath('', $basedir, $docname), "checking basepath"); is($drv->formatter, 'latex', "formatter"); ok($drv->run, "formatting $docname"); is($drv->stats->{runs}{latex}, 3, "should have run latex three times"); is($drv->stats->{runs}{bibtex}, 1, "should have run bibtex once"); is($drv->stats->{runs}{makeindex}, undef, "should not have run makeindex"); test_dvifile($drv, [ "Simple Test Document $testno", # title 'A.N. Other', # author '20 September 2007', # date 'This is a test document with a bibliography.', 'We reference the Badger book\\[', 'WCC03', '^References$', # bibliography section heading '^\\s*\\[WCC03\\]$', # the bibiographic key 'Andy Wardley, Darren Chamberlain, and Dave Cross.', '^ 1$' ] ); # page number 1 tidy_directory($basedir, $docname, $debug) unless $no_cleanup; exit(0); LaTeX-Driver-1.2.0/Changes0000644000175000017500000001164013747064400016302 0ustar ehuelsmannehuelsmannRevision history for the LaTeX::Driver module -*- indented-text -*- 1.2.0 2020-10-29 - Add Log::Any logging - Use File::Temp to manage deletion of the temp directory - Eliminate manipulation of global state in method invocation - Update documentation and feedback channel 1.1.1 2020-07-29 - Fix version number presented in the POD VERSION section - Remove duplication in listed formats 1.1.0 2020-07-29 - Fix RT #133061: typo in @PROCESSORS ('lulaatex') - Add documentation of the supported processor/format combinations - Add LuaLaTeX as a processor/format combination 1.0.0 2020-05-21 - Improve error reported when invoked external program is missing - Fix RT #127951: failing tests on some installations 0.300.2 2016-04-21 - Added ps support via pdflatex 0.300.1 2016-04-17 - Added ps support for xelatex 0.300.0 2016-04-16 - Fix 0.20 refactoring made stdout 'bleed' into caller's stdout - Add more formats for explicit processor (pdf|xe)latex selection - Win32 fixes 0.200.4 2014-04-12 - Disabled bibtex tests by default due to frequently not found LaTex sty not found. - Disabled t/30 and t/31 unless dvips is found 0.200.3 2014-04-11 - xelatex tests now optional because they add too many external dependencies 0.200.1 2014-04-10 - Fixed stale dependency (unused) in Test::LaTeX::Driver 0.20 2014-04-09 - Removed IPC::ShellCmd dependency since newer versions not on CPAN - Fixed Win32 support 0.20_03 2013-10-31 - switched Makefile.PL to Module::Install 0.20_02 2013-10-29 - added -timeout option (requires IPC::ShellCmd 0.003) - added -capture_stderr option and stderr() method to retrieve captured stderr 0.20_01 2013-10-18 - Now maintained on github - reformatted Changes file - removed MYMETA.{json,yml} from MANIFEST and added to MANIFEST.SKIP (RT89155) - use IPC::ShellCmd to run commands - remove LaTeX::Driver::Paths - paths determined at runtime 0.12 2012-08-31 - fixed typo in settings of ps2pdf/pdf2ps (RT79233) - add missing dependency on Readonly (RT79330) 0.11 2012-08-30 - rewrote loop in run_latex() and need_to_run_bibtex() to use a lexical variable to avoid subtle errors with Template::Plugin::Latex (RT50684) 0.10 2011-09-18 - use system tmp directory rather than hardcoded /tmp - Makefile.PL exits if latex binary is not found (rather than dieing 0.09 2011-08-18 - Tidied up for perlcritic 0.08 2009-01-19 - Added two elements to the stats hash - 'pages' and 'bytes' - Added check for rerun required by use of the longtable package (patch submitted by Yitzchack Scott-Thoennes - cpan id: YSTM), also added test script - also check for generic /rerun to get .* right/ warning - expand documentation for Pod::Coverage 0.07 2007-10-12 - Updated documentation - specifically the diagnostics section for LaTeX::Driver and just expanded LaTeX::Driver::FilterProgram - fixed Makefile.PL, which was using LaTeX::Driver to get the module version, but this broke horribly if the prerequisite modules were not installed. - added missing test and test data files to MANIFEST 0.06 2007-09-27 - rationalized the constructor arguments - now the source and output are controlled just by three arguments: "source" and optionally "output" and "format". - the "source" and "output" parameters can be scalar references, in which case the LaTeX source and formatted output is taken from or output to the variables referenced respectively. This facilitates the creation of Unix filter type scripts. - added the Unix-style filter programs latex2dvi, latex2pdf and latex2ps (these use the common module LaTeX::Driver::FilterProgram) 0.05 2007-09-25 - default output type is now 'pdf' (that is probably what most people are going to want to generate) - added texinputs option - added the following methods: latex_path, pdflatex_path, bibtex_path, makeindex_path, dvips_path, dvipdfm_path, ps2pdf_path and program_path - the program path defaults are now stored in a package-level hash 0.04 2007-09-24 - Expanded documentation a bit more - added option parsing to test library so that test scripts can be run with -d to switch on debug messages - added basic Exception::Class based exceptions (still need to differentiate between exception types. 0.03 2007-09-24 - Expanded documentation - Reorganized testdata so that the directories/files match the names of the test scripts that use them - Added tests for constructor errors, running the module on broken LaTeX files, specifying options to makeindex, and quality metrics 0.02 2007-09-21 - First public release. 0.01 2007-09-20 - Initial version. Code extracted from the Template-Latex distribution. New maintainer: Andrew Ford. LaTeX-Driver-1.2.0/README.md0000644000175000017500000000062513710327433016265 0ustar ehuelsmannehuelsmannLaTeX-Driver ============ [![Travis Status](https://travis-ci.com/Template-Toolkit-Latex/LaTeX-Driver.svg?branch=master)](https://travis-ci.org/Template-Toolkit-Latex/LaTeX-Driver) [![Coverage Status](https://coveralls.io/repos/github/Template-Toolkit-Latex/LaTeX-Driver/badge.svg?branch=master)](https://coveralls.io/github/Template-Toolkit-Latex/LaTeX-Driver?branch=master) Perl module to drive LaTeX LaTeX-Driver-1.2.0/inc/0000755000175000017500000000000013747065026015563 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/inc/Module/0000755000175000017500000000000013747065026017010 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/inc/Module/Install/0000755000175000017500000000000013747065026020416 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/inc/Module/Install/Metadata.pm0000644000175000017500000004330213747065026022476 0ustar ehuelsmannehuelsmann#line 1 package Module::Install::Metadata; use strict 'vars'; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.19'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } my @boolean_keys = qw{ sign }; my @scalar_keys = qw{ name module_name abstract version distribution_type tests installdirs }; my @tuple_keys = qw{ configure_requires build_requires requires recommends bundles resources }; my @resource_keys = qw{ homepage bugtracker repository }; my @array_keys = qw{ keywords author }; *authors = \&author; sub Meta { shift } sub Meta_BooleanKeys { @boolean_keys } sub Meta_ScalarKeys { @scalar_keys } sub Meta_TupleKeys { @tuple_keys } sub Meta_ResourceKeys { @resource_keys } sub Meta_ArrayKeys { @array_keys } foreach my $key ( @boolean_keys ) { *$key = sub { my $self = shift; if ( defined wantarray and not @_ ) { return $self->{values}->{$key}; } $self->{values}->{$key} = ( @_ ? $_[0] : 1 ); return $self; }; } foreach my $key ( @scalar_keys ) { *$key = sub { my $self = shift; return $self->{values}->{$key} if defined wantarray and !@_; $self->{values}->{$key} = shift; return $self; }; } foreach my $key ( @array_keys ) { *$key = sub { my $self = shift; return $self->{values}->{$key} if defined wantarray and !@_; $self->{values}->{$key} ||= []; push @{$self->{values}->{$key}}, @_; return $self; }; } foreach my $key ( @resource_keys ) { *$key = sub { my $self = shift; unless ( @_ ) { return () unless $self->{values}->{resources}; return map { $_->[1] } grep { $_->[0] eq $key } @{ $self->{values}->{resources} }; } return $self->{values}->{resources}->{$key} unless @_; my $uri = shift or die( "Did not provide a value to $key()" ); $self->resources( $key => $uri ); return 1; }; } foreach my $key ( grep { $_ ne "resources" } @tuple_keys) { *$key = sub { my $self = shift; return $self->{values}->{$key} unless @_; my @added; while ( @_ ) { my $module = shift or last; my $version = shift || 0; push @added, [ $module, $version ]; } push @{ $self->{values}->{$key} }, @added; return map {@$_} @added; }; } # Resource handling my %lc_resource = map { $_ => 1 } qw{ homepage license bugtracker repository }; sub resources { my $self = shift; while ( @_ ) { my $name = shift or last; my $value = shift or next; if ( $name eq lc $name and ! $lc_resource{$name} ) { die("Unsupported reserved lowercase resource '$name'"); } $self->{values}->{resources} ||= []; push @{ $self->{values}->{resources} }, [ $name, $value ]; } $self->{values}->{resources}; } # Aliases for build_requires that will have alternative # meanings in some future version of META.yml. sub test_requires { shift->build_requires(@_) } sub install_requires { shift->build_requires(@_) } # Aliases for installdirs options sub install_as_core { $_[0]->installdirs('perl') } sub install_as_cpan { $_[0]->installdirs('site') } sub install_as_site { $_[0]->installdirs('site') } sub install_as_vendor { $_[0]->installdirs('vendor') } sub dynamic_config { my $self = shift; my $value = @_ ? shift : 1; if ( $self->{values}->{dynamic_config} ) { # Once dynamic we never change to static, for safety return 0; } $self->{values}->{dynamic_config} = $value ? 1 : 0; return 1; } # Convenience command sub static_config { shift->dynamic_config(0); } sub perl_version { my $self = shift; return $self->{values}->{perl_version} unless @_; my $version = shift or die( "Did not provide a value to perl_version()" ); # Normalize the version $version = $self->_perl_version($version); # We don't support the really old versions unless ( $version >= 5.005 ) { die "Module::Install only supports 5.005 or newer (use ExtUtils::MakeMaker)\n"; } $self->{values}->{perl_version} = $version; } sub all_from { my ( $self, $file ) = @_; unless ( defined($file) ) { my $name = $self->name or die( "all_from called with no args without setting name() first" ); $file = join('/', 'lib', split(/-/, $name)) . '.pm'; $file =~ s{.*/}{} unless -e $file; unless ( -e $file ) { die("all_from cannot find $file from $name"); } } unless ( -f $file ) { die("The path '$file' does not exist, or is not a file"); } $self->{values}{all_from} = $file; # Some methods pull from POD instead of code. # If there is a matching .pod, use that instead my $pod = $file; $pod =~ s/\.pm$/.pod/i; $pod = $file unless -e $pod; # Pull the different values $self->name_from($file) unless $self->name; $self->version_from($file) unless $self->version; $self->perl_version_from($file) unless $self->perl_version; $self->author_from($pod) unless @{$self->author || []}; $self->license_from($pod) unless $self->license; $self->abstract_from($pod) unless $self->abstract; return 1; } sub provides { my $self = shift; my $provides = ( $self->{values}->{provides} ||= {} ); %$provides = (%$provides, @_) if @_; return $provides; } sub auto_provides { my $self = shift; return $self unless $self->is_admin; unless (-e 'MANIFEST') { warn "Cannot deduce auto_provides without a MANIFEST, skipping\n"; return $self; } # Avoid spurious warnings as we are not checking manifest here. local $SIG{__WARN__} = sub {1}; require ExtUtils::Manifest; local *ExtUtils::Manifest::manicheck = sub { return }; require Module::Build; my $build = Module::Build->new( dist_name => $self->name, dist_version => $self->version, license => $self->license, ); $self->provides( %{ $build->find_dist_packages || {} } ); } sub feature { my $self = shift; my $name = shift; my $features = ( $self->{values}->{features} ||= [] ); my $mods; if ( @_ == 1 and ref( $_[0] ) ) { # The user used ->feature like ->features by passing in the second # argument as a reference. Accomodate for that. $mods = $_[0]; } else { $mods = \@_; } my $count = 0; push @$features, ( $name => [ map { ref($_) ? ( ref($_) eq 'HASH' ) ? %$_ : @$_ : $_ } @$mods ] ); return @$features; } sub features { my $self = shift; while ( my ( $name, $mods ) = splice( @_, 0, 2 ) ) { $self->feature( $name, @$mods ); } return $self->{values}->{features} ? @{ $self->{values}->{features} } : (); } sub no_index { my $self = shift; my $type = shift; push @{ $self->{values}->{no_index}->{$type} }, @_ if $type; return $self->{values}->{no_index}; } sub read { my $self = shift; $self->include_deps( 'YAML::Tiny', 0 ); require YAML::Tiny; my $data = YAML::Tiny::LoadFile('META.yml'); # Call methods explicitly in case user has already set some values. while ( my ( $key, $value ) = each %$data ) { next unless $self->can($key); if ( ref $value eq 'HASH' ) { while ( my ( $module, $version ) = each %$value ) { $self->can($key)->($self, $module => $version ); } } else { $self->can($key)->($self, $value); } } return $self; } sub write { my $self = shift; return $self unless $self->is_admin; $self->admin->write_meta; return $self; } sub version_from { require ExtUtils::MM_Unix; my ( $self, $file ) = @_; $self->version( ExtUtils::MM_Unix->parse_version($file) ); # for version integrity check $self->makemaker_args( VERSION_FROM => $file ); } sub abstract_from { require ExtUtils::MM_Unix; my ( $self, $file ) = @_; $self->abstract( bless( { DISTNAME => $self->name }, 'ExtUtils::MM_Unix' )->parse_abstract($file) ); } # Add both distribution and module name sub name_from { my ($self, $file) = @_; if ( Module::Install::_read($file) =~ m/ ^ \s* package \s* ([\w:]+) [\s|;]* /ixms ) { my ($name, $module_name) = ($1, $1); $name =~ s{::}{-}g; $self->name($name); unless ( $self->module_name ) { $self->module_name($module_name); } } else { die("Cannot determine name from $file\n"); } } sub _extract_perl_version { if ( $_[0] =~ m/ ^\s* (?:use|require) \s* v? ([\d_\.]+) \s* ; /ixms ) { my $perl_version = $1; $perl_version =~ s{_}{}g; return $perl_version; } else { return; } } sub perl_version_from { my $self = shift; my $perl_version=_extract_perl_version(Module::Install::_read($_[0])); if ($perl_version) { $self->perl_version($perl_version); } else { warn "Cannot determine perl version info from $_[0]\n"; return; } } sub author_from { my $self = shift; my $content = Module::Install::_read($_[0]); if ($content =~ m/ =head \d \s+ (?:authors?)\b \s* ([^\n]*) | =head \d \s+ (?:licen[cs]e|licensing|copyright|legal)\b \s* .*? copyright .*? \d\d\d[\d.]+ \s* (?:\bby\b)? \s* ([^\n]*) /ixms) { my $author = $1 || $2; # XXX: ugly but should work anyway... if (eval "require Pod::Escapes; 1") { # Pod::Escapes has a mapping table. # It's in core of perl >= 5.9.3, and should be installed # as one of the Pod::Simple's prereqs, which is a prereq # of Pod::Text 3.x (see also below). $author =~ s{ E<( (\d+) | ([A-Za-z]+) )> } { defined $2 ? chr($2) : defined $Pod::Escapes::Name2character_number{$1} ? chr($Pod::Escapes::Name2character_number{$1}) : do { warn "Unknown escape: E<$1>"; "E<$1>"; }; }gex; } elsif (eval "require Pod::Text; 1" && $Pod::Text::VERSION < 3) { # Pod::Text < 3.0 has yet another mapping table, # though the table name of 2.x and 1.x are different. # (1.x is in core of Perl < 5.6, 2.x is in core of # Perl < 5.9.3) my $mapping = ($Pod::Text::VERSION < 2) ? \%Pod::Text::HTML_Escapes : \%Pod::Text::ESCAPES; $author =~ s{ E<( (\d+) | ([A-Za-z]+) )> } { defined $2 ? chr($2) : defined $mapping->{$1} ? $mapping->{$1} : do { warn "Unknown escape: E<$1>"; "E<$1>"; }; }gex; } else { $author =~ s{E}{<}g; $author =~ s{E}{>}g; } $self->author($author); } else { warn "Cannot determine author info from $_[0]\n"; } } #Stolen from M::B my %license_urls = ( perl => 'http://dev.perl.org/licenses/', apache => 'http://apache.org/licenses/LICENSE-2.0', apache_1_1 => 'http://apache.org/licenses/LICENSE-1.1', artistic => 'http://opensource.org/licenses/artistic-license.php', artistic_2 => 'http://opensource.org/licenses/artistic-license-2.0.php', lgpl => 'http://opensource.org/licenses/lgpl-license.php', lgpl2 => 'http://opensource.org/licenses/lgpl-2.1.php', lgpl3 => 'http://opensource.org/licenses/lgpl-3.0.html', bsd => 'http://opensource.org/licenses/bsd-license.php', gpl => 'http://opensource.org/licenses/gpl-license.php', gpl2 => 'http://opensource.org/licenses/gpl-2.0.php', gpl3 => 'http://opensource.org/licenses/gpl-3.0.html', mit => 'http://opensource.org/licenses/mit-license.php', mozilla => 'http://opensource.org/licenses/mozilla1.1.php', open_source => undef, unrestricted => undef, restrictive => undef, unknown => undef, ); sub license { my $self = shift; return $self->{values}->{license} unless @_; my $license = shift or die( 'Did not provide a value to license()' ); $license = __extract_license($license) || lc $license; $self->{values}->{license} = $license; # Automatically fill in license URLs if ( $license_urls{$license} ) { $self->resources( license => $license_urls{$license} ); } return 1; } sub _extract_license { my $pod = shift; my $matched; return __extract_license( ($matched) = $pod =~ m/ (=head \d \s+ L(?i:ICEN[CS]E|ICENSING)\b.*?) (=head \d.*|=cut.*|)\z /xms ) || __extract_license( ($matched) = $pod =~ m/ (=head \d \s+ (?:C(?i:OPYRIGHTS?)|L(?i:EGAL))\b.*?) (=head \d.*|=cut.*|)\z /xms ); } sub __extract_license { my $license_text = shift or return; my @phrases = ( '(?:under )?the same (?:terms|license) as (?:perl|the perl (?:\d )?programming language)' => 'perl', 1, '(?:under )?the terms of (?:perl|the perl programming language) itself' => 'perl', 1, 'Artistic and GPL' => 'perl', 1, 'GNU general public license' => 'gpl', 1, 'GNU public license' => 'gpl', 1, 'GNU lesser general public license' => 'lgpl', 1, 'GNU lesser public license' => 'lgpl', 1, 'GNU library general public license' => 'lgpl', 1, 'GNU library public license' => 'lgpl', 1, 'GNU Free Documentation license' => 'unrestricted', 1, 'GNU Affero General Public License' => 'open_source', 1, '(?:Free)?BSD license' => 'bsd', 1, 'Artistic license 2\.0' => 'artistic_2', 1, 'Artistic license' => 'artistic', 1, 'Apache (?:Software )?license' => 'apache', 1, 'GPL' => 'gpl', 1, 'LGPL' => 'lgpl', 1, 'BSD' => 'bsd', 1, 'Artistic' => 'artistic', 1, 'MIT' => 'mit', 1, 'Mozilla Public License' => 'mozilla', 1, 'Q Public License' => 'open_source', 1, 'OpenSSL License' => 'unrestricted', 1, 'SSLeay License' => 'unrestricted', 1, 'zlib License' => 'open_source', 1, 'proprietary' => 'proprietary', 0, ); while ( my ($pattern, $license, $osi) = splice(@phrases, 0, 3) ) { $pattern =~ s#\s+#\\s+#gs; if ( $license_text =~ /\b$pattern\b/i ) { return $license; } } return ''; } sub license_from { my $self = shift; if (my $license=_extract_license(Module::Install::_read($_[0]))) { $self->license($license); } else { warn "Cannot determine license info from $_[0]\n"; return 'unknown'; } } sub _extract_bugtracker { my @links = $_[0] =~ m#L<( https?\Q://rt.cpan.org/\E[^>]+| https?\Q://github.com/\E[\w_]+/[\w_]+/issues| https?\Q://code.google.com/p/\E[\w_\-]+/issues/list )>#gx; my %links; @links{@links}=(); @links=keys %links; return @links; } sub bugtracker_from { my $self = shift; my $content = Module::Install::_read($_[0]); my @links = _extract_bugtracker($content); unless ( @links ) { warn "Cannot determine bugtracker info from $_[0]\n"; return 0; } if ( @links > 1 ) { warn "Found more than one bugtracker link in $_[0]\n"; return 0; } # Set the bugtracker bugtracker( $links[0] ); return 1; } sub requires_from { my $self = shift; my $content = Module::Install::_readperl($_[0]); my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+(v?[\d\.]+)/mg; while ( @requires ) { my $module = shift @requires; my $version = shift @requires; $self->requires( $module => $version ); } } sub test_requires_from { my $self = shift; my $content = Module::Install::_readperl($_[0]); my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+([\d\.]+)/mg; while ( @requires ) { my $module = shift @requires; my $version = shift @requires; $self->test_requires( $module => $version ); } } # Convert triple-part versions (eg, 5.6.1 or 5.8.9) to # numbers (eg, 5.006001 or 5.008009). # Also, convert double-part versions (eg, 5.8) sub _perl_version { my $v = $_[-1]; $v =~ s/^([1-9])\.([1-9]\d?\d?)$/sprintf("%d.%03d",$1,$2)/e; $v =~ s/^([1-9])\.([1-9]\d?\d?)\.(0|[1-9]\d?\d?)$/sprintf("%d.%03d%03d",$1,$2,$3 || 0)/e; $v =~ s/(\.\d\d\d)000$/$1/; $v =~ s/_.+$//; if ( ref($v) ) { # Numify $v = $v + 0; } return $v; } sub add_metadata { my $self = shift; my %hash = @_; for my $key (keys %hash) { warn "add_metadata: $key is not prefixed with 'x_'.\n" . "Use appopriate function to add non-private metadata.\n" unless $key =~ /^x_/; $self->{values}->{$key} = $hash{$key}; } } ###################################################################### # MYMETA Support sub WriteMyMeta { die "WriteMyMeta has been deprecated"; } sub write_mymeta_yaml { my $self = shift; # We need YAML::Tiny to write the MYMETA.yml file unless ( eval { require YAML::Tiny; 1; } ) { return 1; } # Generate the data my $meta = $self->_write_mymeta_data or return 1; # Save as the MYMETA.yml file print "Writing MYMETA.yml\n"; YAML::Tiny::DumpFile('MYMETA.yml', $meta); } sub write_mymeta_json { my $self = shift; # We need JSON to write the MYMETA.json file unless ( eval { require JSON; 1; } ) { return 1; } # Generate the data my $meta = $self->_write_mymeta_data or return 1; # Save as the MYMETA.yml file print "Writing MYMETA.json\n"; Module::Install::_write( 'MYMETA.json', JSON->new->pretty(1)->canonical->encode($meta), ); } sub _write_mymeta_data { my $self = shift; # If there's no existing META.yml there is nothing we can do return undef unless -f 'META.yml'; # We need Parse::CPAN::Meta to load the file unless ( eval { require Parse::CPAN::Meta; 1; } ) { return undef; } # Merge the perl version into the dependencies my $val = $self->Meta->{values}; my $perl = delete $val->{perl_version}; if ( $perl ) { $val->{requires} ||= []; my $requires = $val->{requires}; # Canonize to three-dot version after Perl 5.6 if ( $perl >= 5.006 ) { $perl =~ s{^(\d+)\.(\d\d\d)(\d*)}{join('.', $1, int($2||0), int($3||0))}e } unshift @$requires, [ perl => $perl ]; } # Load the advisory META.yml file my @yaml = Parse::CPAN::Meta::LoadFile('META.yml'); my $meta = $yaml[0]; # Overwrite the non-configure dependency hashes delete $meta->{requires}; delete $meta->{build_requires}; delete $meta->{recommends}; if ( exists $val->{requires} ) { $meta->{requires} = { map { @$_ } @{ $val->{requires} } }; } if ( exists $val->{build_requires} ) { $meta->{build_requires} = { map { @$_ } @{ $val->{build_requires} } }; } return $meta; } 1; LaTeX-Driver-1.2.0/inc/Module/Install/External.pm0000644000175000017500000000354513747065026022545 0ustar ehuelsmannehuelsmann#line 1 package Module::Install::External; # Provides dependency declarations for external non-Perl things use strict; use Module::Install::Base (); use vars qw{$VERSION $ISCORE @ISA}; BEGIN { $VERSION = '1.19'; $ISCORE = 1; @ISA = qw{Module::Install::Base}; } sub requires_xs { my $self = shift; # First check for the basic C compiler $self->requires_external_cc; # We need a C compiler that can build XS files unless ( $self->can_xs ) { print "Unresolvable missing external dependency.\n"; print "This package requires perl's header files.\n"; print STDERR "NA: Unable to build distribution on this platform.\n"; exit(0); } 1; } sub requires_external_cc { my $self = shift; # We need a C compiler, use the can_cc method for this unless ( $self->can_cc ) { print "Unresolvable missing external dependency.\n"; print "This package requires a C compiler.\n"; print STDERR "NA: Unable to build distribution on this platform.\n"; exit(0); } # Unlike some of the other modules, while we need to specify a # C compiler as a dep, it needs to be a build-time dependency. 1; } sub requires_external_bin { my ($self, $bin, $version) = @_; if ( $version ) { die "requires_external_bin does not support versions yet"; } # Load the package containing can_run early, # to avoid breaking the message below. $self->load('can_run'); # Locate the bin print "Locating bin:$bin..."; my $found_bin = $self->can_run( $bin ); if ( $found_bin ) { print " found at $found_bin.\n"; } else { print " missing.\n"; print "Unresolvable missing external dependency.\n"; print "Please install '$bin' seperately and try again.\n"; print STDERR "NA: Unable to build distribution on this platform.\n"; exit(0); } # Once we have some way to specify external deps, do it here. # In the mean time, continue as normal. 1; } 1; __END__ #line 171 LaTeX-Driver-1.2.0/inc/Module/Install/Win32.pm0000644000175000017500000000340313747065026021656 0ustar ehuelsmannehuelsmann#line 1 package Module::Install::Win32; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.19'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } # determine if the user needs nmake, and download it if needed sub check_nmake { my $self = shift; $self->load('can_run'); $self->load('get_file'); require Config; return unless ( $^O eq 'MSWin32' and $Config::Config{make} and $Config::Config{make} =~ /^nmake\b/i and ! $self->can_run('nmake') ); print "The required 'nmake' executable not found, fetching it...\n"; require File::Basename; my $rv = $self->get_file( url => 'http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe', ftp_url => 'ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe', local_dir => File::Basename::dirname($^X), size => 51928, run => 'Nmake15.exe /o > nul', check_for => 'Nmake.exe', remove => 1, ); die <<'END_MESSAGE' unless $rv; ------------------------------------------------------------------------------- Since you are using Microsoft Windows, you will need the 'nmake' utility before installation. It's available at: http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe or ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe Please download the file manually, save it to a directory in %PATH% (e.g. C:\WINDOWS\COMMAND\), then launch the MS-DOS command line shell, "cd" to that directory, and run "Nmake15.exe" from there; that will create the 'nmake.exe' file needed by this module. You may then resume the installation process described in README. ------------------------------------------------------------------------------- END_MESSAGE } 1; LaTeX-Driver-1.2.0/inc/Module/Install/AuthorRequires.pm0000644000175000017500000000113113747065026023732 0ustar ehuelsmannehuelsmann#line 1 use strict; use warnings; package Module::Install::AuthorRequires; use base 'Module::Install::Base'; # cargo cult BEGIN { our $VERSION = '0.02'; our $ISCORE = 1; } sub author_requires { my $self = shift; return $self->{values}->{author_requires} unless @_; my @added; while (@_) { my $mod = shift or last; my $version = shift || 0; push @added, [$mod => $version]; } push @{ $self->{values}->{author_requires} }, @added; $self->admin->author_requires(@added); return map { @$_ } @added; } 1; __END__ #line 92 LaTeX-Driver-1.2.0/inc/Module/Install/WriteAll.pm0000644000175000017500000000237613747065026022507 0ustar ehuelsmannehuelsmann#line 1 package Module::Install::WriteAll; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.19'; @ISA = qw{Module::Install::Base}; $ISCORE = 1; } sub WriteAll { my $self = shift; my %args = ( meta => 1, sign => 0, inline => 0, check_nmake => 1, @_, ); $self->sign(1) if $args{sign}; $self->admin->WriteAll(%args) if $self->is_admin; $self->check_nmake if $args{check_nmake}; unless ( $self->makemaker_args->{PL_FILES} ) { # XXX: This still may be a bit over-defensive... unless ($self->makemaker(6.25)) { $self->makemaker_args( PL_FILES => {} ) if -f 'Build.PL'; } } # Until ExtUtils::MakeMaker support MYMETA.yml, make sure # we clean it up properly ourself. $self->realclean_files('MYMETA.yml'); if ( $args{inline} ) { $self->Inline->write; } else { $self->Makefile->write; } # The Makefile write process adds a couple of dependencies, # so write the META.yml files after the Makefile. if ( $args{meta} ) { $self->Meta->write; } # Experimental support for MYMETA if ( $ENV{X_MYMETA} ) { if ( $ENV{X_MYMETA} eq 'JSON' ) { $self->Meta->write_mymeta_json; } else { $self->Meta->write_mymeta_yaml; } } return 1; } 1; LaTeX-Driver-1.2.0/inc/Module/Install/ReadmeFromPod.pm0000644000175000017500000001016413747065026023442 0ustar ehuelsmannehuelsmann#line 1 package Module::Install::ReadmeFromPod; use 5.006; use strict; use warnings; use base qw(Module::Install::Base); use vars qw($VERSION); $VERSION = '0.30'; { # these aren't defined until after _require_admin is run, so # define them so prototypes are available during compilation. sub io; sub capture(&;@); #line 28 my $done = 0; sub _require_admin { # do this once to avoid redefinition warnings from IO::All return if $done; require IO::All; IO::All->import( '-binary' ); require Capture::Tiny; Capture::Tiny->import ( 'capture' ); return; } } sub readme_from { my $self = shift; return unless $self->is_admin; _require_admin; # Input file my $in_file = shift || $self->_all_from or die "Can't determine file to make readme_from"; # Get optional arguments my ($clean, $format, $out_file, $options); my $args = shift; if ( ref $args ) { # Arguments are in a hashref if ( ref($args) ne 'HASH' ) { die "Expected a hashref but got a ".ref($args)."\n"; } else { $clean = $args->{'clean'}; $format = $args->{'format'}; $out_file = $args->{'output_file'}; $options = $args->{'options'}; } } else { # Arguments are in a list $clean = $args; $format = shift; $out_file = shift; $options = \@_; } # Default values; $clean ||= 0; $format ||= 'txt'; # Generate README print "readme_from $in_file to $format\n"; if ($format =~ m/te?xt/) { $out_file = $self->_readme_txt($in_file, $out_file, $options); } elsif ($format =~ m/html?/) { $out_file = $self->_readme_htm($in_file, $out_file, $options); } elsif ($format eq 'man') { $out_file = $self->_readme_man($in_file, $out_file, $options); } elsif ($format eq 'md') { $out_file = $self->_readme_md($in_file, $out_file, $options); } elsif ($format eq 'pdf') { $out_file = $self->_readme_pdf($in_file, $out_file, $options); } if ($clean) { $self->clean_files($out_file); } return 1; } sub _readme_txt { my ($self, $in_file, $out_file, $options) = @_; $out_file ||= 'README'; require Pod::Text; my $parser = Pod::Text->new( @$options ); my $io = io->file($out_file)->open(">"); my $out_fh = $io->io_handle; $parser->output_fh( *$out_fh ); $parser->parse_file( $in_file ); return $out_file; } sub _readme_htm { my ($self, $in_file, $out_file, $options) = @_; $out_file ||= 'README.htm'; require Pod::Html; my ($o) = capture { Pod::Html::pod2html( "--infile=$in_file", "--outfile=-", @$options, ); }; io->file($out_file)->print($o); # Remove temporary files if needed for my $file ('pod2htmd.tmp', 'pod2htmi.tmp') { if (-e $file) { unlink $file or warn "Warning: Could not remove file '$file'.\n$!\n"; } } return $out_file; } sub _readme_man { my ($self, $in_file, $out_file, $options) = @_; $out_file ||= 'README.1'; require Pod::Man; my $parser = Pod::Man->new( @$options ); my $io = io->file($out_file)->open(">"); my $out_fh = $io->io_handle; $parser->output_fh( *$out_fh ); $parser->parse_file( $in_file ); return $out_file; } sub _readme_pdf { my ($self, $in_file, $out_file, $options) = @_; $out_file ||= 'README.pdf'; eval { require App::pod2pdf; } or die "Could not generate $out_file because pod2pdf could not be found\n"; my $parser = App::pod2pdf->new( @$options ); $parser->parse_from_file($in_file); my ($o) = capture { $parser->output }; io->file($out_file)->print($o); return $out_file; } sub _readme_md { my ($self, $in_file, $out_file, $options) = @_; $out_file ||= 'README.md'; require Pod::Markdown; my $parser = Pod::Markdown->new( @$options ); my $io = io->file($out_file)->open(">"); my $out_fh = $io->io_handle; $parser->output_fh( *$out_fh ); $parser->parse_file( $in_file ); return $out_file; } sub _all_from { my $self = shift; return unless $self->admin->{extensions}; my ($metadata) = grep { ref($_) eq 'Module::Install::Metadata'; } @{$self->admin->{extensions}}; return unless $metadata; return $metadata->{values}{all_from} || ''; } 'Readme!'; __END__ #line 316 LaTeX-Driver-1.2.0/inc/Module/Install/AuthorTests.pm0000644000175000017500000000221513747065026023241 0ustar ehuelsmannehuelsmann#line 1 package Module::Install::AuthorTests; use 5.005; use strict; use Module::Install::Base; use Carp (); #line 16 use vars qw{$VERSION $ISCORE @ISA}; BEGIN { $VERSION = '0.002'; $ISCORE = 1; @ISA = qw{Module::Install::Base}; } #line 42 sub author_tests { my ($self, @dirs) = @_; _add_author_tests($self, \@dirs, 0); } #line 56 sub recursive_author_tests { my ($self, @dirs) = @_; _add_author_tests($self, \@dirs, 1); } sub _wanted { my $href = shift; sub { /\.t$/ and -f $_ and $href->{$File::Find::dir} = 1 } } sub _add_author_tests { my ($self, $dirs, $recurse) = @_; return unless $Module::Install::AUTHOR; my @tests = $self->tests ? (split / /, $self->tests) : 't/*.t'; # XXX: pick a default, later -- rjbs, 2008-02-24 my @dirs = @$dirs ? @$dirs : Carp::confess "no dirs given to author_tests"; @dirs = grep { -d } @dirs; if ($recurse) { require File::Find; my %test_dir; File::Find::find(_wanted(\%test_dir), @dirs); $self->tests( join ' ', @tests, map { "$_/*.t" } sort keys %test_dir ); } else { $self->tests( join ' ', @tests, map { "$_/*.t" } sort @dirs ); } } #line 107 1; LaTeX-Driver-1.2.0/inc/Module/Install/Scripts.pm0000644000175000017500000000101113747065026022374 0ustar ehuelsmannehuelsmann#line 1 package Module::Install::Scripts; use strict 'vars'; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.19'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub install_script { my $self = shift; my $args = $self->makemaker_args; my $exe = $args->{EXE_FILES} ||= []; foreach ( @_ ) { if ( -f $_ ) { push @$exe, $_; } elsif ( -d 'script' and -f "script/$_" ) { push @$exe, "script/$_"; } else { die("Cannot find script '$_'"); } } } 1; LaTeX-Driver-1.2.0/inc/Module/Install/Fetch.pm0000644000175000017500000000462713747065026022016 0ustar ehuelsmannehuelsmann#line 1 package Module::Install::Fetch; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.19'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub get_file { my ($self, %args) = @_; my ($scheme, $host, $path, $file) = $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; if ( $scheme eq 'http' and ! eval { require LWP::Simple; 1 } ) { $args{url} = $args{ftp_url} or (warn("LWP support unavailable!\n"), return); ($scheme, $host, $path, $file) = $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; } $|++; print "Fetching '$file' from $host... "; unless (eval { require Socket; Socket::inet_aton($host) }) { warn "'$host' resolve failed!\n"; return; } return unless $scheme eq 'ftp' or $scheme eq 'http'; require Cwd; my $dir = Cwd::getcwd(); chdir $args{local_dir} or return if exists $args{local_dir}; if (eval { require LWP::Simple; 1 }) { LWP::Simple::mirror($args{url}, $file); } elsif (eval { require Net::FTP; 1 }) { eval { # use Net::FTP to get past firewall my $ftp = Net::FTP->new($host, Passive => 1, Timeout => 600); $ftp->login("anonymous", 'anonymous@example.com'); $ftp->cwd($path); $ftp->binary; $ftp->get($file) or (warn("$!\n"), return); $ftp->quit; } } elsif (my $ftp = $self->can_run('ftp')) { eval { # no Net::FTP, fallback to ftp.exe require FileHandle; my $fh = FileHandle->new; local $SIG{CHLD} = 'IGNORE'; unless ($fh->open("|$ftp -n")) { warn "Couldn't open ftp: $!\n"; chdir $dir; return; } my @dialog = split(/\n/, <<"END_FTP"); open $host user anonymous anonymous\@example.com cd $path binary get $file $file quit END_FTP foreach (@dialog) { $fh->print("$_\n") } $fh->close; } } else { warn "No working 'ftp' program available!\n"; chdir $dir; return; } unless (-f $file) { warn "Fetching failed: $@\n"; chdir $dir; return; } return if exists $args{size} and -s $file != $args{size}; system($args{run}) if exists $args{run}; unlink($file) if $args{remove}; print(((!exists $args{check_for} or -e $args{check_for}) ? "done!" : "failed! ($!)"), "\n"); chdir $dir; return !$?; } 1; LaTeX-Driver-1.2.0/inc/Module/Install/Can.pm0000644000175000017500000000640513747065026021462 0ustar ehuelsmannehuelsmann#line 1 package Module::Install::Can; use strict; use Config (); use ExtUtils::MakeMaker (); use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.19'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } # check if we can load some module ### Upgrade this to not have to load the module if possible sub can_use { my ($self, $mod, $ver) = @_; $mod =~ s{::|\\}{/}g; $mod .= '.pm' unless $mod =~ /\.pm$/i; my $pkg = $mod; $pkg =~ s{/}{::}g; $pkg =~ s{\.pm$}{}i; local $@; eval { require $mod; $pkg->VERSION($ver || 0); 1 }; } # Check if we can run some command sub can_run { my ($self, $cmd) = @_; my $_cmd = $cmd; return $_cmd if (-x $_cmd or $_cmd = MM->maybe_command($_cmd)); for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') { next if $dir eq ''; require File::Spec; my $abs = File::Spec->catfile($dir, $cmd); return $abs if (-x $abs or $abs = MM->maybe_command($abs)); } return; } # Can our C compiler environment build XS files sub can_xs { my $self = shift; # Ensure we have the CBuilder module $self->configure_requires( 'ExtUtils::CBuilder' => 0.27 ); # Do we have the configure_requires checker? local $@; eval "require ExtUtils::CBuilder;"; if ( $@ ) { # They don't obey configure_requires, so it is # someone old and delicate. Try to avoid hurting # them by falling back to an older simpler test. return $self->can_cc(); } # Do we have a working C compiler my $builder = ExtUtils::CBuilder->new( quiet => 1, ); unless ( $builder->have_compiler ) { # No working C compiler return 0; } # Write a C file representative of what XS becomes require File::Temp; my ( $FH, $tmpfile ) = File::Temp::tempfile( "compilexs-XXXXX", SUFFIX => '.c', ); binmode $FH; print $FH <<'END_C'; #include "EXTERN.h" #include "perl.h" #include "XSUB.h" int main(int argc, char **argv) { return 0; } int boot_sanexs() { return 1; } END_C close $FH; # Can the C compiler access the same headers XS does my @libs = (); my $object = undef; eval { local $^W = 0; $object = $builder->compile( source => $tmpfile, ); @libs = $builder->link( objects => $object, module_name => 'sanexs', ); }; my $result = $@ ? 0 : 1; # Clean up all the build files foreach ( $tmpfile, $object, @libs ) { next unless defined $_; 1 while unlink; } return $result; } # Can we locate a (the) C compiler sub can_cc { my $self = shift; if ($^O eq 'VMS') { require ExtUtils::CBuilder; my $builder = ExtUtils::CBuilder->new( quiet => 1, ); return $builder->have_compiler; } my @chunks = split(/ /, $Config::Config{cc}) or return; # $Config{cc} may contain args; try to find out the program part while (@chunks) { return $self->can_run("@chunks") || (pop(@chunks), next); } return; } # Fix Cygwin bug on maybe_command(); if ( $^O eq 'cygwin' ) { require ExtUtils::MM_Cygwin; require ExtUtils::MM_Win32; if ( ! defined(&ExtUtils::MM_Cygwin::maybe_command) ) { *ExtUtils::MM_Cygwin::maybe_command = sub { my ($self, $file) = @_; if ($file =~ m{^/cygdrive/}i and ExtUtils::MM_Win32->can('maybe_command')) { ExtUtils::MM_Win32->maybe_command($file); } else { ExtUtils::MM_Unix->maybe_command($file); } } } } 1; __END__ #line 245 LaTeX-Driver-1.2.0/inc/Module/Install/Base.pm0000644000175000017500000000214713747065026021632 0ustar ehuelsmannehuelsmann#line 1 package Module::Install::Base; use strict 'vars'; use vars qw{$VERSION}; BEGIN { $VERSION = '1.19'; } # Suspend handler for "redefined" warnings BEGIN { my $w = $SIG{__WARN__}; $SIG{__WARN__} = sub { $w }; } #line 42 sub new { my $class = shift; unless ( defined &{"${class}::call"} ) { *{"${class}::call"} = sub { shift->_top->call(@_) }; } unless ( defined &{"${class}::load"} ) { *{"${class}::load"} = sub { shift->_top->load(@_) }; } bless { @_ }, $class; } #line 61 sub AUTOLOAD { local $@; my $func = eval { shift->_top->autoload } or return; goto &$func; } #line 75 sub _top { $_[0]->{_top}; } #line 90 sub admin { $_[0]->_top->{admin} or Module::Install::Base::FakeAdmin->new; } #line 106 sub is_admin { ! $_[0]->admin->isa('Module::Install::Base::FakeAdmin'); } sub DESTROY {} package Module::Install::Base::FakeAdmin; use vars qw{$VERSION}; BEGIN { $VERSION = $Module::Install::Base::VERSION; } my $fake; sub new { $fake ||= bless(\@_, $_[0]); } sub AUTOLOAD {} sub DESTROY {} # Restore warning handler BEGIN { $SIG{__WARN__} = $SIG{__WARN__}->(); } 1; #line 159 LaTeX-Driver-1.2.0/inc/Module/Install/Makefile.pm0000644000175000017500000002743713747065026022506 0ustar ehuelsmannehuelsmann#line 1 package Module::Install::Makefile; use strict 'vars'; use ExtUtils::MakeMaker (); use Module::Install::Base (); use Fcntl qw/:flock :seek/; use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.19'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub Makefile { $_[0] } my %seen = (); sub prompt { shift; # Infinite loop protection my @c = caller(); if ( ++$seen{"$c[1]|$c[2]|$_[0]"} > 3 ) { die "Caught an potential prompt infinite loop ($c[1]|$c[2]|$_[0])"; } # In automated testing or non-interactive session, always use defaults if ( ($ENV{AUTOMATED_TESTING} or -! -t STDIN) and ! $ENV{PERL_MM_USE_DEFAULT} ) { local $ENV{PERL_MM_USE_DEFAULT} = 1; goto &ExtUtils::MakeMaker::prompt; } else { goto &ExtUtils::MakeMaker::prompt; } } # Store a cleaned up version of the MakeMaker version, # since we need to behave differently in a variety of # ways based on the MM version. my $makemaker = eval $ExtUtils::MakeMaker::VERSION; # If we are passed a param, do a "newer than" comparison. # Otherwise, just return the MakeMaker version. sub makemaker { ( @_ < 2 or $makemaker >= eval($_[1]) ) ? $makemaker : 0 } # Ripped from ExtUtils::MakeMaker 6.56, and slightly modified # as we only need to know here whether the attribute is an array # or a hash or something else (which may or may not be appendable). my %makemaker_argtype = ( C => 'ARRAY', CONFIG => 'ARRAY', # CONFIGURE => 'CODE', # ignore DIR => 'ARRAY', DL_FUNCS => 'HASH', DL_VARS => 'ARRAY', EXCLUDE_EXT => 'ARRAY', EXE_FILES => 'ARRAY', FUNCLIST => 'ARRAY', H => 'ARRAY', IMPORTS => 'HASH', INCLUDE_EXT => 'ARRAY', LIBS => 'ARRAY', # ignore '' MAN1PODS => 'HASH', MAN3PODS => 'HASH', META_ADD => 'HASH', META_MERGE => 'HASH', PL_FILES => 'HASH', PM => 'HASH', PMLIBDIRS => 'ARRAY', PMLIBPARENTDIRS => 'ARRAY', PREREQ_PM => 'HASH', CONFIGURE_REQUIRES => 'HASH', SKIP => 'ARRAY', TYPEMAPS => 'ARRAY', XS => 'HASH', # VERSION => ['version',''], # ignore # _KEEP_AFTER_FLUSH => '', clean => 'HASH', depend => 'HASH', dist => 'HASH', dynamic_lib=> 'HASH', linkext => 'HASH', macro => 'HASH', postamble => 'HASH', realclean => 'HASH', test => 'HASH', tool_autosplit => 'HASH', # special cases where you can use makemaker_append CCFLAGS => 'APPENDABLE', DEFINE => 'APPENDABLE', INC => 'APPENDABLE', LDDLFLAGS => 'APPENDABLE', LDFROM => 'APPENDABLE', ); sub makemaker_args { my ($self, %new_args) = @_; my $args = ( $self->{makemaker_args} ||= {} ); foreach my $key (keys %new_args) { if ($makemaker_argtype{$key}) { if ($makemaker_argtype{$key} eq 'ARRAY') { $args->{$key} = [] unless defined $args->{$key}; unless (ref $args->{$key} eq 'ARRAY') { $args->{$key} = [$args->{$key}] } push @{$args->{$key}}, ref $new_args{$key} eq 'ARRAY' ? @{$new_args{$key}} : $new_args{$key}; } elsif ($makemaker_argtype{$key} eq 'HASH') { $args->{$key} = {} unless defined $args->{$key}; foreach my $skey (keys %{ $new_args{$key} }) { $args->{$key}{$skey} = $new_args{$key}{$skey}; } } elsif ($makemaker_argtype{$key} eq 'APPENDABLE') { $self->makemaker_append($key => $new_args{$key}); } } else { if (defined $args->{$key}) { warn qq{MakeMaker attribute "$key" is overriden; use "makemaker_append" to append values\n}; } $args->{$key} = $new_args{$key}; } } return $args; } # For mm args that take multiple space-separated args, # append an argument to the current list. sub makemaker_append { my $self = shift; my $name = shift; my $args = $self->makemaker_args; $args->{$name} = defined $args->{$name} ? join( ' ', $args->{$name}, @_ ) : join( ' ', @_ ); } sub build_subdirs { my $self = shift; my $subdirs = $self->makemaker_args->{DIR} ||= []; for my $subdir (@_) { push @$subdirs, $subdir; } } sub clean_files { my $self = shift; my $clean = $self->makemaker_args->{clean} ||= {}; %$clean = ( %$clean, FILES => join ' ', grep { length $_ } ($clean->{FILES} || (), @_), ); } sub realclean_files { my $self = shift; my $realclean = $self->makemaker_args->{realclean} ||= {}; %$realclean = ( %$realclean, FILES => join ' ', grep { length $_ } ($realclean->{FILES} || (), @_), ); } sub libs { my $self = shift; my $libs = ref $_[0] ? shift : [ shift ]; $self->makemaker_args( LIBS => $libs ); } sub inc { my $self = shift; $self->makemaker_args( INC => shift ); } sub _wanted_t { } sub tests_recursive { my $self = shift; my $dir = shift || 't'; unless ( -d $dir ) { die "tests_recursive dir '$dir' does not exist"; } my %tests = map { $_ => 1 } split / /, ($self->tests || ''); require File::Find; File::Find::find( sub { /\.t$/ and -f $_ and $tests{"$File::Find::dir/*.t"} = 1 }, $dir ); $self->tests( join ' ', sort keys %tests ); } sub write { my $self = shift; die "&Makefile->write() takes no arguments\n" if @_; # Check the current Perl version my $perl_version = $self->perl_version; if ( $perl_version ) { eval "use $perl_version; 1" or die "ERROR: perl: Version $] is installed, " . "but we need version >= $perl_version"; } # Make sure we have a new enough MakeMaker require ExtUtils::MakeMaker; if ( $perl_version and $self->_cmp($perl_version, '5.006') >= 0 ) { # This previous attempted to inherit the version of # ExtUtils::MakeMaker in use by the module author, but this # was found to be untenable as some authors build releases # using future dev versions of EU:MM that nobody else has. # Instead, #toolchain suggests we use 6.59 which is the most # stable version on CPAN at time of writing and is, to quote # ribasushi, "not terminally fucked, > and tested enough". # TODO: We will now need to maintain this over time to push # the version up as new versions are released. $self->build_requires( 'ExtUtils::MakeMaker' => 6.59 ); $self->configure_requires( 'ExtUtils::MakeMaker' => 6.59 ); } else { # Allow legacy-compatibility with 5.005 by depending on the # most recent EU:MM that supported 5.005. $self->build_requires( 'ExtUtils::MakeMaker' => 6.36 ); $self->configure_requires( 'ExtUtils::MakeMaker' => 6.36 ); } # Generate the MakeMaker params my $args = $self->makemaker_args; $args->{DISTNAME} = $self->name; $args->{NAME} = $self->module_name || $self->name; $args->{NAME} =~ s/-/::/g; $args->{VERSION} = $self->version or die <<'EOT'; ERROR: Can't determine distribution version. Please specify it explicitly via 'version' in Makefile.PL, or set a valid $VERSION in a module, and provide its file path via 'version_from' (or 'all_from' if you prefer) in Makefile.PL. EOT if ( $self->tests ) { my @tests = split ' ', $self->tests; my %seen; $args->{test} = { TESTS => (join ' ', grep {!$seen{$_}++} @tests), }; } elsif ( $Module::Install::ExtraTests::use_extratests ) { # Module::Install::ExtraTests doesn't set $self->tests and does its own tests via harness. # So, just ignore our xt tests here. } elsif ( -d 'xt' and ($Module::Install::AUTHOR or $ENV{RELEASE_TESTING}) ) { $args->{test} = { TESTS => join( ' ', map { "$_/*.t" } grep { -d $_ } qw{ t xt } ), }; } if ( $] >= 5.005 ) { $args->{ABSTRACT} = $self->abstract; $args->{AUTHOR} = join ', ', @{$self->author || []}; } if ( $self->makemaker(6.10) ) { $args->{NO_META} = 1; #$args->{NO_MYMETA} = 1; } if ( $self->makemaker(6.17) and $self->sign ) { $args->{SIGN} = 1; } unless ( $self->is_admin ) { delete $args->{SIGN}; } if ( $self->makemaker(6.31) and $self->license ) { $args->{LICENSE} = $self->license; } my $prereq = ($args->{PREREQ_PM} ||= {}); %$prereq = ( %$prereq, map { @$_ } # flatten [module => version] map { @$_ } grep $_, ($self->requires) ); # Remove any reference to perl, PREREQ_PM doesn't support it delete $args->{PREREQ_PM}->{perl}; # Merge both kinds of requires into BUILD_REQUIRES my $build_prereq = ($args->{BUILD_REQUIRES} ||= {}); %$build_prereq = ( %$build_prereq, map { @$_ } # flatten [module => version] map { @$_ } grep $_, ($self->configure_requires, $self->build_requires) ); # Remove any reference to perl, BUILD_REQUIRES doesn't support it delete $args->{BUILD_REQUIRES}->{perl}; # Delete bundled dists from prereq_pm, add it to Makefile DIR my $subdirs = ($args->{DIR} || []); if ($self->bundles) { my %processed; foreach my $bundle (@{ $self->bundles }) { my ($mod_name, $dist_dir) = @$bundle; delete $prereq->{$mod_name}; $dist_dir = File::Basename::basename($dist_dir); # dir for building this module if (not exists $processed{$dist_dir}) { if (-d $dist_dir) { # List as sub-directory to be processed by make push @$subdirs, $dist_dir; } # Else do nothing: the module is already present on the system $processed{$dist_dir} = undef; } } } unless ( $self->makemaker('6.55_03') ) { %$prereq = (%$prereq,%$build_prereq); delete $args->{BUILD_REQUIRES}; } if ( my $perl_version = $self->perl_version ) { eval "use $perl_version; 1" or die "ERROR: perl: Version $] is installed, " . "but we need version >= $perl_version"; if ( $self->makemaker(6.48) ) { $args->{MIN_PERL_VERSION} = $perl_version; } } if ($self->installdirs) { warn qq{old INSTALLDIRS (probably set by makemaker_args) is overriden by installdirs\n} if $args->{INSTALLDIRS}; $args->{INSTALLDIRS} = $self->installdirs; } my %args = map { ( $_ => $args->{$_} ) } grep {defined($args->{$_} ) } keys %$args; my $user_preop = delete $args{dist}->{PREOP}; if ( my $preop = $self->admin->preop($user_preop) ) { foreach my $key ( keys %$preop ) { $args{dist}->{$key} = $preop->{$key}; } } my $mm = ExtUtils::MakeMaker::WriteMakefile(%args); $self->fix_up_makefile($mm->{FIRST_MAKEFILE} || 'Makefile'); } sub fix_up_makefile { my $self = shift; my $makefile_name = shift; my $top_class = ref($self->_top) || ''; my $top_version = $self->_top->VERSION || ''; my $preamble = $self->preamble ? "# Preamble by $top_class $top_version\n" . $self->preamble : ''; my $postamble = "# Postamble by $top_class $top_version\n" . ($self->postamble || ''); local *MAKEFILE; open MAKEFILE, "+< $makefile_name" or die "fix_up_makefile: Couldn't open $makefile_name: $!"; eval { flock MAKEFILE, LOCK_EX }; my $makefile = do { local $/; }; $makefile =~ s/\b(test_harness\(\$\(TEST_VERBOSE\), )/$1'inc', /; $makefile =~ s/( -I\$\(INST_ARCHLIB\))/ -Iinc$1/g; $makefile =~ s/( "-I\$\(INST_LIB\)")/ "-Iinc"$1/g; $makefile =~ s/^(FULLPERL = .*)/$1 "-Iinc"/m; $makefile =~ s/^(PERL = .*)/$1 "-Iinc"/m; # Module::Install will never be used to build the Core Perl # Sometimes PERL_LIB and PERL_ARCHLIB get written anyway, which breaks # PREFIX/PERL5LIB, and thus, install_share. Blank them if they exist $makefile =~ s/^PERL_LIB = .+/PERL_LIB =/m; #$makefile =~ s/^PERL_ARCHLIB = .+/PERL_ARCHLIB =/m; # Perl 5.005 mentions PERL_LIB explicitly, so we have to remove that as well. $makefile =~ s/(\"?)-I\$\(PERL_LIB\)\1//g; # XXX - This is currently unused; not sure if it breaks other MM-users # $makefile =~ s/^pm_to_blib\s+:\s+/pm_to_blib :: /mg; seek MAKEFILE, 0, SEEK_SET; truncate MAKEFILE, 0; print MAKEFILE "$preamble$makefile$postamble" or die $!; close MAKEFILE or die $!; 1; } sub preamble { my ($self, $text) = @_; $self->{preamble} = $text . $self->{preamble} if defined $text; $self->{preamble}; } sub postamble { my ($self, $text) = @_; $self->{postamble} ||= $self->admin->postamble; $self->{postamble} .= $text if defined $text; $self->{postamble} } 1; __END__ #line 544 LaTeX-Driver-1.2.0/inc/Module/Install.pm0000644000175000017500000002714513747065026020765 0ustar ehuelsmannehuelsmann#line 1 package Module::Install; # For any maintainers: # The load order for Module::Install is a bit magic. # It goes something like this... # # IF ( host has Module::Install installed, creating author mode ) { # 1. Makefile.PL calls "use inc::Module::Install" # 2. $INC{inc/Module/Install.pm} set to installed version of inc::Module::Install # 3. The installed version of inc::Module::Install loads # 4. inc::Module::Install calls "require Module::Install" # 5. The ./inc/ version of Module::Install loads # } ELSE { # 1. Makefile.PL calls "use inc::Module::Install" # 2. $INC{inc/Module/Install.pm} set to ./inc/ version of Module::Install # 3. The ./inc/ version of Module::Install loads # } use 5.006; use strict 'vars'; use Cwd (); use File::Find (); use File::Path (); use vars qw{$VERSION $MAIN}; BEGIN { # All Module::Install core packages now require synchronised versions. # This will be used to ensure we don't accidentally load old or # different versions of modules. # This is not enforced yet, but will be some time in the next few # releases once we can make sure it won't clash with custom # Module::Install extensions. $VERSION = '1.19'; # Storage for the pseudo-singleton $MAIN = undef; *inc::Module::Install::VERSION = *VERSION; @inc::Module::Install::ISA = __PACKAGE__; } sub import { my $class = shift; my $self = $class->new(@_); my $who = $self->_caller; #------------------------------------------------------------- # all of the following checks should be included in import(), # to allow "eval 'require Module::Install; 1' to test # installation of Module::Install. (RT #51267) #------------------------------------------------------------- # Whether or not inc::Module::Install is actually loaded, the # $INC{inc/Module/Install.pm} is what will still get set as long as # the caller loaded module this in the documented manner. # If not set, the caller may NOT have loaded the bundled version, and thus # they may not have a MI version that works with the Makefile.PL. This would # result in false errors or unexpected behaviour. And we don't want that. my $file = join( '/', 'inc', split /::/, __PACKAGE__ ) . '.pm'; unless ( $INC{$file} ) { die <<"END_DIE" } Please invoke ${\__PACKAGE__} with: use inc::${\__PACKAGE__}; not: use ${\__PACKAGE__}; END_DIE # This reportedly fixes a rare Win32 UTC file time issue, but # as this is a non-cross-platform XS module not in the core, # we shouldn't really depend on it. See RT #24194 for detail. # (Also, this module only supports Perl 5.6 and above). eval "use Win32::UTCFileTime" if $^O eq 'MSWin32' && $] >= 5.006; # If the script that is loading Module::Install is from the future, # then make will detect this and cause it to re-run over and over # again. This is bad. Rather than taking action to touch it (which # is unreliable on some platforms and requires write permissions) # for now we should catch this and refuse to run. if ( -f $0 ) { my $s = (stat($0))[9]; # If the modification time is only slightly in the future, # sleep briefly to remove the problem. my $a = $s - time; if ( $a > 0 and $a < 5 ) { sleep 5 } # Too far in the future, throw an error. my $t = time; if ( $s > $t ) { die <<"END_DIE" } Your installer $0 has a modification time in the future ($s > $t). This is known to create infinite loops in make. Please correct this, then run $0 again. END_DIE } # Build.PL was formerly supported, but no longer is due to excessive # difficulty in implementing every single feature twice. if ( $0 =~ /Build.PL$/i ) { die <<"END_DIE" } Module::Install no longer supports Build.PL. It was impossible to maintain duel backends, and has been deprecated. Please remove all Build.PL files and only use the Makefile.PL installer. END_DIE #------------------------------------------------------------- # To save some more typing in Module::Install installers, every... # use inc::Module::Install # ...also acts as an implicit use strict. $^H |= strict::bits(qw(refs subs vars)); #------------------------------------------------------------- unless ( -f $self->{file} ) { foreach my $key (keys %INC) { delete $INC{$key} if $key =~ /Module\/Install/; } local $^W; require "$self->{path}/$self->{dispatch}.pm"; File::Path::mkpath("$self->{prefix}/$self->{author}"); $self->{admin} = "$self->{name}::$self->{dispatch}"->new( _top => $self ); $self->{admin}->init; @_ = ($class, _self => $self); goto &{"$self->{name}::import"}; } local $^W; *{"${who}::AUTOLOAD"} = $self->autoload; $self->preload; # Unregister loader and worker packages so subdirs can use them again delete $INC{'inc/Module/Install.pm'}; delete $INC{'Module/Install.pm'}; # Save to the singleton $MAIN = $self; return 1; } sub autoload { my $self = shift; my $who = $self->_caller; my $cwd = Cwd::getcwd(); my $sym = "${who}::AUTOLOAD"; $sym->{$cwd} = sub { my $pwd = Cwd::getcwd(); if ( my $code = $sym->{$pwd} ) { # Delegate back to parent dirs goto &$code unless $cwd eq $pwd; } unless ($$sym =~ s/([^:]+)$//) { # XXX: it looks like we can't retrieve the missing function # via $$sym (usually $main::AUTOLOAD) in this case. # I'm still wondering if we should slurp Makefile.PL to # get some context or not ... my ($package, $file, $line) = caller; die <<"EOT"; Unknown function is found at $file line $line. Execution of $file aborted due to runtime errors. If you're a contributor to a project, you may need to install some Module::Install extensions from CPAN (or other repository). If you're a user of a module, please contact the author. EOT } my $method = $1; if ( uc($method) eq $method ) { # Do nothing return; } elsif ( $method =~ /^_/ and $self->can($method) ) { # Dispatch to the root M:I class return $self->$method(@_); } # Dispatch to the appropriate plugin unshift @_, ( $self, $1 ); goto &{$self->can('call')}; }; } sub preload { my $self = shift; unless ( $self->{extensions} ) { $self->load_extensions( "$self->{prefix}/$self->{path}", $self ); } my @exts = @{$self->{extensions}}; unless ( @exts ) { @exts = $self->{admin}->load_all_extensions; } my %seen; foreach my $obj ( @exts ) { while (my ($method, $glob) = each %{ref($obj) . '::'}) { next unless $obj->can($method); next if $method =~ /^_/; next if $method eq uc($method); $seen{$method}++; } } my $who = $self->_caller; foreach my $name ( sort keys %seen ) { local $^W; *{"${who}::$name"} = sub { ${"${who}::AUTOLOAD"} = "${who}::$name"; goto &{"${who}::AUTOLOAD"}; }; } } sub new { my ($class, %args) = @_; delete $INC{'FindBin.pm'}; { # to suppress the redefine warning local $SIG{__WARN__} = sub {}; require FindBin; } # ignore the prefix on extension modules built from top level. my $base_path = Cwd::abs_path($FindBin::Bin); unless ( Cwd::abs_path(Cwd::getcwd()) eq $base_path ) { delete $args{prefix}; } return $args{_self} if $args{_self}; $base_path = VMS::Filespec::unixify($base_path) if $^O eq 'VMS'; $args{dispatch} ||= 'Admin'; $args{prefix} ||= 'inc'; $args{author} ||= ($^O eq 'VMS' ? '_author' : '.author'); $args{bundle} ||= 'inc/BUNDLES'; $args{base} ||= $base_path; $class =~ s/^\Q$args{prefix}\E:://; $args{name} ||= $class; $args{version} ||= $class->VERSION; unless ( $args{path} ) { $args{path} = $args{name}; $args{path} =~ s!::!/!g; } $args{file} ||= "$args{base}/$args{prefix}/$args{path}.pm"; $args{wrote} = 0; bless( \%args, $class ); } sub call { my ($self, $method) = @_; my $obj = $self->load($method) or return; splice(@_, 0, 2, $obj); goto &{$obj->can($method)}; } sub load { my ($self, $method) = @_; $self->load_extensions( "$self->{prefix}/$self->{path}", $self ) unless $self->{extensions}; foreach my $obj (@{$self->{extensions}}) { return $obj if $obj->can($method); } my $admin = $self->{admin} or die <<"END_DIE"; The '$method' method does not exist in the '$self->{prefix}' path! Please remove the '$self->{prefix}' directory and run $0 again to load it. END_DIE my $obj = $admin->load($method, 1); push @{$self->{extensions}}, $obj; $obj; } sub load_extensions { my ($self, $path, $top) = @_; my $should_reload = 0; unless ( grep { ! ref $_ and lc $_ eq lc $self->{prefix} } @INC ) { unshift @INC, $self->{prefix}; $should_reload = 1; } foreach my $rv ( $self->find_extensions($path) ) { my ($file, $pkg) = @{$rv}; next if $self->{pathnames}{$pkg}; local $@; my $new = eval { local $^W; require $file; $pkg->can('new') }; unless ( $new ) { warn $@ if $@; next; } $self->{pathnames}{$pkg} = $should_reload ? delete $INC{$file} : $INC{$file}; push @{$self->{extensions}}, &{$new}($pkg, _top => $top ); } $self->{extensions} ||= []; } sub find_extensions { my ($self, $path) = @_; my @found; File::Find::find( {no_chdir => 1, wanted => sub { my $file = $File::Find::name; return unless $file =~ m!^\Q$path\E/(.+)\.pm\Z!is; my $subpath = $1; return if lc($subpath) eq lc($self->{dispatch}); $file = "$self->{path}/$subpath.pm"; my $pkg = "$self->{name}::$subpath"; $pkg =~ s!/!::!g; # If we have a mixed-case package name, assume case has been preserved # correctly. Otherwise, root through the file to locate the case-preserved # version of the package name. if ( $subpath eq lc($subpath) || $subpath eq uc($subpath) ) { my $content = Module::Install::_read($File::Find::name); my $in_pod = 0; foreach ( split /\n/, $content ) { $in_pod = 1 if /^=\w/; $in_pod = 0 if /^=cut/; next if ($in_pod || /^=cut/); # skip pod text next if /^\s*#/; # and comments if ( m/^\s*package\s+($pkg)\s*;/i ) { $pkg = $1; last; } } } push @found, [ $file, $pkg ]; }}, $path ) if -d $path; @found; } ##################################################################### # Common Utility Functions sub _caller { my $depth = 0; my $call = caller($depth); while ( $call eq __PACKAGE__ ) { $depth++; $call = caller($depth); } return $call; } sub _read { local *FH; open( FH, '<', $_[0] ) or die "open($_[0]): $!"; binmode FH; my $string = do { local $/; }; close FH or die "close($_[0]): $!"; return $string; } sub _readperl { my $string = Module::Install::_read($_[0]); $string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg; $string =~ s/(\n)\n*__(?:DATA|END)__\b.*\z/$1/s; $string =~ s/\n\n=\w+.+?\n\n=cut\b.+?\n+/\n\n/sg; return $string; } sub _readpod { my $string = Module::Install::_read($_[0]); $string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg; return $string if $_[0] =~ /\.pod\z/; $string =~ s/(^|\n=cut\b.+?\n+)[^=\s].+?\n(\n=\w+|\z)/$1$2/sg; $string =~ s/\n*=pod\b[^\n]*\n+/\n\n/sg; $string =~ s/\n*=cut\b[^\n]*\n+/\n\n/sg; $string =~ s/^\n+//s; return $string; } sub _write { local *FH; open( FH, '>', $_[0] ) or die "open($_[0]): $!"; binmode FH; foreach ( 1 .. $#_ ) { print FH $_[$_] or die "print($_[0]): $!"; } close FH or die "close($_[0]): $!"; } # _version is for processing module versions (eg, 1.03_05) not # Perl versions (eg, 5.8.1). sub _version { my $s = shift || 0; my $d =()= $s =~ /(\.)/g; if ( $d >= 2 ) { # Normalise multipart versions $s =~ s/(\.)(\d{1,3})/sprintf("$1%03d",$2)/eg; } $s =~ s/^(\d+)\.?//; my $l = $1 || 0; my @v = map { $_ . '0' x (3 - length $_) } $s =~ /(\d{1,3})\D?/g; $l = $l . '.' . join '', @v if @v; return $l + 0; } sub _cmp { _version($_[1]) <=> _version($_[2]); } # Cloned from Params::Util::_CLASS sub _CLASS { ( defined $_[0] and ! ref $_[0] and $_[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s ) ? $_[0] : undef; } 1; # Copyright 2008 - 2012 Adam Kennedy. LaTeX-Driver-1.2.0/MANIFEST0000644000175000017500000000355313710327633016144 0ustar ehuelsmannehuelsmannChanges inc/Module/Install.pm inc/Module/Install/AuthorRequires.pm inc/Module/Install/AuthorTests.pm inc/Module/Install/Base.pm inc/Module/Install/Can.pm inc/Module/Install/External.pm inc/Module/Install/Fetch.pm inc/Module/Install/Makefile.pm inc/Module/Install/Metadata.pm inc/Module/Install/ReadmeFromPod.pm inc/Module/Install/Scripts.pm inc/Module/Install/Win32.pm inc/Module/Install/WriteAll.pm INSTALL lib/LaTeX/Driver.pm lib/LaTeX/Driver/FilterProgram.pm Makefile.PL MANIFEST This list of files MANIFEST.SKIP META.yml Module meta-data (added by MakeMaker) README General information, installation, etc. README.md script/latex2dvi script/latex2pdf script/latex2ps script/README t/00-basic.t t/01-errors.t t/02-brokendocs.t t/10-simpledoc.t t/11-references.t t/12-includes.t t/13-tableofcontents.t t/14-makeindex.t t/15-bibtex.t t/20-complexdoc.t t/30-output-to-variable.t t/31-input-from-variable.t t/40-pkg-longtable.t t/90-kwalitee.t t/91-pod.t t/92-pod-coverage.t t/93-perl-critic.t t/lib/Test/LaTeX/Driver.pm t/perlcriticrc t/README t/testdata/00-common/testinc2.tex t/testdata/01-errors/01-errors.tex t/testdata/02-brokendocs/02-brokendocs.tex t/testdata/10-simpledoc/10-simpledoc.tex t/testdata/11-references/11-references.tex t/testdata/12-includes/12-includes.tex t/testdata/12-includes/testinc.aux t/testdata/12-includes/testinc.tex t/testdata/13-tableofcontents/13-tableofcontents.tex t/testdata/14-makeindex/14-makeindex.tex t/testdata/14-makeindex/testind.ist t/testdata/15-bibtex/15-bibtex.tex t/testdata/15-bibtex/testbib.bib t/testdata/20-complexdoc/20-complexdoc.tex t/testdata/20-complexdoc/testbib.bib t/testdata/20-complexdoc/testinc.aux t/testdata/20-complexdoc/testinc.tex t/testdata/30-output-to-variable/30-output-to-variable.tex t/testdata/31-input-from-variable/31-input-from-variable.tex t/testdata/40-pkg-longtable/40-pkg-longtable.tex t/testdata/README TODO LaTeX-Driver-1.2.0/Makefile.PL0000644000175000017500000000203213747064335016763 0ustar ehuelsmannehuelsmann#!/usr/bin/perl -w # -*- perl -*- use inc::Module::Install 0.91; use Module::Install::ReadmeFromPod; use Module::Install::AuthorRequires; use Module::Install::AuthorTests; license 'perl'; all_from 'lib/LaTeX/Driver.pm'; readme_from 'lib/LaTeX/Driver.pm'; requires_external_bin 'latex'; requires 'Capture::Tiny'; requires 'Class::Accessor'; requires 'Cwd'; requires 'Exception::Class'; requires 'File::pushd'; requires 'File::Slurp'; requires 'File::Spec'; requires 'File::Temp' => '0.23'; requires 'Getopt::Long'; requires 'IO::File'; requires 'Log::Any'; requires 'parent'; requires 'Readonly'; test_requires 'Test::More' => '0.88'; author_requires 'Test::NoTabs'; author_requires 'Test::Pod' => '1.14'; author_requires 'Test::Pod::Coverage' => '1.04'; author_requires 'Test::Spelling' => '0.11'; install_script 'latex2dvi'; install_script 'latex2pdf'; install_script 'latex2ps'; author_tests 'xt'; resources repository => 'https://github.com/Template-Toolkit-Latex/LaTeX-Driver.git'; WriteAll; LaTeX-Driver-1.2.0/lib/0000755000175000017500000000000013747065026015560 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/lib/LaTeX/0000755000175000017500000000000013747065026016535 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/lib/LaTeX/Driver/0000755000175000017500000000000013747065026017770 5ustar ehuelsmannehuelsmannLaTeX-Driver-1.2.0/lib/LaTeX/Driver/FilterProgram.pm0000644000175000017500000001007312704232647023101 0ustar ehuelsmannehuelsmann#============================================================= -*-perl-*- # # LaTeX::Driver::FilterProgram # # DESCRIPTION # Implements the guts of the latex2xxx filter programs # # AUTHOR # Andrew Ford # # COPYRIGHT # Copyright (C) 2007 Andrew Ford. All Rights Reserved. # # This module is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. # # HISTORY # # $Id: Paths.pm 45 2007-09-28 10:33:19Z andrew $ #======================================================================== package LaTeX::Driver::FilterProgram; use strict; use warnings; use Carp; use LaTeX::Driver; use Getopt::Long; use File::Slurp; sub execute { my ($class, %options) = @_; my ($source, $output, $tt2mode, $debug, @vars, %var); GetOptions( 'output:s' => \$output, 'tt2mode' => \$tt2mode, 'define:s' => \@vars, 'debug' => \$debug ); if ( @ARGV ) { $source = shift @ARGV; } else { my $input = join '', ; $source = \$input; } if ($tt2mode) { eval { use Template; }; if ($@) { die "Cannot load the Template Toolkit - tt2 mode is unavailable\n"; } if (!ref $source) { ${$source} = read_file($source); } foreach (@vars) { my ($name, $value) = split / \s* = \s* /mx; printf(STDERR "defining %s as '%s'\n", $name, $value) if $debug; $var{$name} = $value; } my $input; my $tt2 = Template->new({}); $tt2->process($source, \%var, \$input) or die $tt2->error(), "\n"; $source = \$input; } if (!$output or $output eq '-') { my $tmp; $output = \$tmp; } eval { my $drv = LaTeX::Driver->new( source => $source, output => $output, format => $options{format} ); $drv->run; }; if (my $e = LaTeX::Driver::Exception->caught()) { $e->show_trace(1); # my $extra = sprintf("\nat %s line %d (%s)\n%s", $e->file, $e->line, $e->package, $e->trace); die $e; #sprintf("%s\n%s", "$e", $e->trace); } if (ref $output) { print ${$output}; } return; } 1; __END__ =head1 NAME LaTeX::Driver::FilterProgram =head1 VERSION =head1 SYNOPSIS use LaTeX::Driver::FilterProgram; LaTeX::Driver::FilterProgram->execute(format => $format); =head1 DESCRIPTION This module is not intended to be used except by the programs C, C and C that are included in the LaTeX::Driver distribution. It implements the guts of those filter programs. =head1 SUBROUTINES/METHODS =over 4 =item C This is the only method. It implements the guts of the filter programs, gathering the parameters for the C object constructor from the command line options, along with the options passed from the calling script, which should be the format option. Having constructed a driver object it then runs the driver. If the C<-tt2> option is specified then the source document is taken to be a Template Toolkit template and a Template object is constructed and the template processed through that before being fed to the C module for latex formatting. Template variables may defined with the C<-define> option and these are passed to the Template Toolkit processing stage (they are ignored if the C<-tt2> option is not specified). =back =head1 DIAGNOSTICS The module invokes the C module and optionally the C