#! @PERLBIN@ # Copyright (C) 2010 by Dirk Krause # All rights reserved. # # Redistribution and use in source and binary forms, # with or without modification, are permitted provided # that the following conditions are met: # # * Redistributions of source code must retain the above # copyright notice, this list of conditions and the # following disclaimer. # * Redistributions in binary form must reproduce the above # opyright notice, this list of conditions and the following # disclaimer in the documentation and/or other materials # provided with the distribution. # * Neither the name of the Dirk Krause nor the names of # contributors may be used to endorse or promote # products derived from this software without specific # prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND # CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. # IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH # DAMAGE. my $controlfile = undef; my $outputfile = undef; my $texfile = undef; my $beamertheme = undef; my $background = "black"; my $presentationmaker = 0; my $title = ""; my $author = "Holiday photographer"; my $makemode = 1; my $inputenc = "latin1"; my $babelopt = undef; my @filenames; my $nfilenames = 0; sub modification_time($) { my $filename = shift; my $back = undef; my $i1; my $i2; my $i3; my $i4; my $i5; my $i6; my $i7; my $i8; my $i9; my $ia; my $ib; my $ic; my $id; if(($i1,$i2,$i3,$i4,$i5,$i6,$i7,$i8,$i9,$ia,$ib,$ic,$id)=stat("$filename")) { $back = $i9; } return $back; } sub must_rebuild($$) { my $srcname = shift; my $dstname = shift; my $back = 1; my $srctime; my $dsttime; if($makemode) { $dsttime = modification_time($dstname); if(defined($dsttime)) { $srctime = modification_time($srcname); if(defined($srctime)) { if($dsttime > $srctime) { $back = 0; } } } } return $back; } sub read_control_file() { my $back = 0; # Function result my $line; # Input line my $state = 0; # 0=files, 1=options my $lineno = 0; # Current line number my $mmtext; # Text contents of makemode if(open(INPUT, "<$controlfile")) { $back = 1; while() { $line = $_; chomp $line; $lineno++; if($line !~ /^\s*\#/o) { if($line =~ /^\s*\[/o) { if($line =~ /^\s*\[\s*options\s*\]\s*/o) { $state = 1; } else { if($line =~ /^\s*\[\s*files\s*\]\s*/o) { $state = 0; } else { $back = 0; print "$controlfile:$lineno: ERROR: Unknown section title \"$line\"\n"; } } } else { if($state == 0) { if($line =~ /^\s*(\S.*\S)\s*=\s*(\S.*\S)\s*/o) { $filenames[$nfilenames++] = "$1" . "=" . "$2"; } else { if($line =~ /^\s*(\S.*\S)\s*/o) { $filenames[$nfilenames++] = "$1"; } } } else { if($state == 1) { if($line =~ /^\s*presentation\s+maker\s*=\s*(\S.*\S)\s*/o) { $line = $1; if($line eq "plain") { $presentationmaker = 0; } else { if($line eq "pdftk") { $presentationmaker = 1; } else { if($line eq "beamer") { $presentationmaker = 2; } else { print "$controlfile:$lineno: ERROR: Unknown presentation maker \"$line\"!\n"; print "Must be \"plain\", \"beamer\" or \"pdftk\"!\n"; $back = 0; } } } } else { if($line =~ /^\s*theme\s*=\s*(\S.*\S)\s*/o) { $beamertheme = $1; } else { if($line =~ /^\s*background\s*=\s*(\S.*\S)\s*/o) { $background = $1; } else { if($line =~ /^\s*title\s*=\s*(\S.*\S)\s*/o) { $title = $1; } else { if($line =~ /^\s*author\s*=\s*(\S.*\S)\s*/o) { $author = $1; } else { if($line =~ /^\s*make\s+mode\s*=\s*(\S.*\S)\s*/o) { $makemode = $1; if($makemode !~ /^\d+$/o) { $mmtext = $makemode; $makemode = 0; if("$mmtext" eq "yes") { $makemode = 1; } if("$mmtext" eq "on") { $makemode = 1; } if("$mmtext" eq "true") { $makemode = 1; } if("$mmtext" eq "enable") { $makemode = 1; } if("$mmtext" eq "enabled") { $makemode = 1; } } } else { if($line =~ /^\s*input\s+encoding\s*=\s*(\S.*\S)\s*/o) { $inputenc = $1; } else { if($line =~ /^\s*babel\s+options\s*=\s*(\S.*\S)\s*/o) { $babelopt = $1; } else { if($line !~ /^\s*$/o) { print "$controlfile:$lineno: ERROR: Syntax error!\n"; $back = 0; } } } } } } } } } } } } } } close(INPUT); } else { print "$controlfile:1: ERROR: Can not open this file!\n"; } if($back) { if($nfilenames == 0) { $back = 0; print "$controlfile:$lineno: ERROR: No files specified!\n"; } } return $back; } sub run_plain() { my $back = 0; my $cmd; my $res; my $i; my $filename; my $pdfname; if(open(OUTPUT, ">$texfile")) { $back = 1; print OUTPUT "\\documentclass{scrartcl}\n"; print OUTPUT "\\setcounter{secnumdepth}{0}\n"; print OUTPUT "\\usepackage[$inputenc]{inputenc}\n"; print OUTPUT "\\usepackage[T1]{fontenc}\n"; print OUTPUT "\\usepackage{textcomp}\n"; print OUTPUT "\\usepackage{mathptmx}\n"; print OUTPUT "\\usepackage[scaled=.92]{helvet}\n"; print OUTPUT "\\usepackage{courier}\n"; print OUTPUT "\\renewcommand*{\\sectfont}{\\bfseries}\n"; print OUTPUT "\\usepackage{graphicx}\n"; print OUTPUT "\\usepackage{color}\n"; print OUTPUT "\\usepackage[\n"; print OUTPUT " pdftex,\n"; print OUTPUT " colorlinks=true,\n"; print OUTPUT " pdfpagelayout=SinglePage,\n"; print OUTPUT " pdftitle={$title},\n"; print OUTPUT " pdfsubject={$title},\n"; print OUTPUT " pdfstartview={FitBH},\n"; print OUTPUT " pdfpagemode={FullScreen}\n"; print OUTPUT "]{hyperref}\n"; print OUTPUT "\\pagecolor{black}\n"; print OUTPUT "\\setlength{\\paperwidth}{5.2075in}\n"; print OUTPUT "\\setlength{\\paperheight}{3.75in}\n"; print OUTPUT "\\setlength{\\pdfpagewidth}{\\paperwidth}\n"; print OUTPUT "\\setlength{\\pdfpageheight}{\\paperheight}\n"; print OUTPUT "\\setlength{\\textwidth}{\\paperwidth}\n"; print OUTPUT "\\setlength{\\textheight}{\\paperheight}\n"; print OUTPUT "\\setlength{\\voffset}{-1in}\n"; print OUTPUT "\\setlength{\\topmargin}{0mm}\n"; print OUTPUT "\\setlength{\\headheight}{0mm}\n"; print OUTPUT "\\setlength{\\headsep}{0mm}\n"; print OUTPUT "\\setlength{\\topskip}{0mm}\n"; print OUTPUT "\\setlength{\\hoffset}{-1in}\n"; print OUTPUT "\\setlength{\\oddsidemargin}{0mm}\n"; print OUTPUT "\\setlength{\\evensidemargin}{0mm}\n"; print OUTPUT "\\setlength{\\marginparwidth}{0mm}\n"; print OUTPUT "\\setlength{\\marginparsep}{0mm}\n"; print OUTPUT "\\setlength{\\parskip}{0mm}\n"; print OUTPUT "\\setlength{\\parindent}{0.0cm}\n"; print OUTPUT "\\pagestyle{empty}\n"; print OUTPUT "\\begin{document}\n"; for($i = 0; $i < $nfilenames; $i++) { $filename = $filenames[$i]; if($filename =~ /(.*)=.*/o) { $filename = $1; } if($filename =~ /(.*)\.[^\.\/]+/o) { $pdfname = $1 . ".pdf"; } else { $pdfname = $filename . ".pdf"; } print OUTPUT "\\resizebox{!}{0.98\\textheight}{\\includegraphics{$pdfname}}\\clearpage\n"; if(must_rebuild($filename,$pdfname)) { $cmd = "bmeps -lpdf \"$filename\" \"$pdfname\""; print "Execute command >>$cmd<<\n"; $res = system("$cmd"); if($res != 0) { $back = 0; print "ERROR: Command >>$cmd<< failed!\n"; } } } print OUTPUT "\\end{document}\n"; close(OUTPUT); if($back) { if($texfile =~ /(.*)\.[Tt][Ee][Xx]/o) { $texfile = $1; } $cmd = "pdflatex \"$texfile\""; print "Execute command >>$cmd<<\n"; $res = system("$cmd"); if($res == 0) { $cmd = "pdflatex -interaction=batchmode \"$texfile\""; system("$cmd"); system("$cmd"); } else { print "ERROR: Command >>$cmd<< failed!\n"; } } } else { print "ERROR: Failed to write pdfLaTeX source \"$texfile\"!\n"; } } sub run_pdftk() { my $i; # Current index my $filename; # Current input file name my $pdfname; # Name of PDF file my $cmd; # Bmeps command my $pdftkcmd; # Command for pdftk my $ok = 1; # Can continue my $res; # Command result $pdftkcmd = "pdftk"; for($i = 0; $i < $nfilenames; $i++) { $filename = $filenames[$i]; if($filename =~ /(.*)=.*/o) { $filename = $1; } if($filename =~ /(.*)\.[^\.\/]+/o) { $pdfname = $1 . ".pdf"; } else { $pdfname = $filename . ".pdf"; } $cmd = "bmeps -lpdf \"$filename\" \"$pdfname\""; $res = 0; if(must_rebuild($filename,$pdfname)) { print "Execute command >>$cmd<<\n"; $res = system("$cmd"); if($res != 0) { $ok = 0; print "ERROR: Command >>$cmd<< failed!\n"; } } $pdftkcmd = "$pdftkcmd \"$pdfname\""; } if($ok) { $pdftkcmd = "$pdftkcmd cat output \"$outputfile\""; print "Execute command >>$pdftkcmd<<\n"; $res = system("$pdftkcmd"); if($res != 0) { print "ERROR: Command >>$pdftkcmd<< failed!\n"; } } } sub run_beamer() { my $back = 0; my $i; my $filename; my $pdfname; my $comment; if(open(OUTPUT,">$texfile")) { $back = 1; print OUTPUT "\\documentclass{beamer}\n"; print OUTPUT "\\mode{\\usetheme{$beamertheme}\\setbeamercovered{transparent}}\n"; if(defined($babelopt)) { print OUTPUT "\\usepackage[$babelopt]{babel}\n"; } print OUTPUT "\\usepackage[$inputenc]{inputenc}\n"; print OUTPUT "\\usepackage[T1]{fontenc}\n"; print OUTPUT "\\usepackage{ifpdf}\n"; print OUTPUT "\\usepackage{graphicx}\n"; print OUTPUT "\\usepackage{color}\n"; print OUTPUT "\\hypersetup{pdfpagemode=FullScreen}\n"; print OUTPUT "\\title{$title}\n"; print OUTPUT "\\author{$author}\n"; print OUTPUT "\\subject{$title}\n"; print OUTPUT "\\beamertemplateshadingbackground{$background}{$background}\n"; print OUTPUT "\\begin{document}\n"; for($i = 0; $i < $nfilenames; $i++) { $filename = $filenames[$i]; $comment = undef; if($filename =~ /(.*)=(.*)/o) { $filename = $1; $comment = $2; } if($filename =~ /(.*)\.[^\.\/]+/o) { $pdfname = $1 . ".pdf"; } else { $pdfname = $filename . ".pdf"; } if(must_rebuild($filename,$pdfname)) { $cmd = "bmeps -lpdf \"$filename\" \"$pdfname\""; print "Execute command >>$cmd<<\n"; $res = system("$cmd"); if($res != 0) { $back = 0; print "ERROR: Command >>$cmd<< failed!\n"; } } print OUTPUT "\\begin{frame}\n"; print OUTPUT "\\frametitle{"; if(defined($comment)) { print OUTPUT "$comment"; } else { print OUTPUT "Picture " . ($i + 1); } print OUTPUT "}"; print OUTPUT "\\includegraphics[height=0.8\\textheight]{$pdfname}"; print OUTPUT "\\end{frame}\n"; } print OUTPUT "\\end{document}\n"; close(OUTPUT); if($back) { if($texfile =~ /(.*)\.[Tt][Ee][Xx]/o) { $texfile = $1; } $cmd = "pdflatex \"$texfile\""; print "Execute command >>$cmd<<\n"; $res = system("$cmd"); if($res == 0) { $cmd = "pdflatex -interaction=batchmode \"$texfile\""; system("$cmd"); system("$cmd"); } else { print "ERROR: Command >>$cmd<< failed!\n"; } } } else { print "ERROR: Failed to write LaTeX source \"$texfile\"!\n"; } } if(exists($ENV{"LANG"})) { my $lang = $ENV{"LANG"}; if($lang =~ /.*\.[Uu][Tt][Ff]\-8/o) { $inputenc = "utf8"; } } if($#ARGV > -1) { $controlfile = shift @ARGV; if($controlfile =~ /(.*)\.[^\.\/]+/o) { $outputfile = $1; $texfile = $outputfile . ".tex"; $outputfile = $outputfile . ".pdf"; } else { $texfile = $controlfile . ".tex"; $outputfile = $controlfile . ".pdf"; } if(read_control_file()) { if($presentationmaker == 0) { run_plain(); } else { if($presentationmaker == 1) { run_pdftk(); } else { if($presentationmaker == 2) { run_beamer(); } } } } } else { print "ERROR: Must specify project file!\n"; }