[LON-CAPA-cvs] cvs: loncom /interface printout.pl
foxr
lon-capa-cvs-allow@mail.lon-capa.org
Tue, 18 Mar 2008 09:48:12 -0000
This is a MIME encoded message
--foxr1205833692
Content-Type: text/plain
foxr Tue Mar 18 05:48:12 2008 EDT
Modified files:
/loncom/interface printout.pl
Log:
Factored figure conversion into separate sub to make the main line a bit easier to read.
I think it even still works.
--foxr1205833692
Content-Type: text/plain
Content-Disposition: attachment; filename="foxr-20080318054812.txt"
Index: loncom/interface/printout.pl
diff -u loncom/interface/printout.pl:1.132 loncom/interface/printout.pl:1.133
--- loncom/interface/printout.pl:1.132 Mon Mar 10 21:48:57 2008
+++ loncom/interface/printout.pl Tue Mar 18 05:48:11 2008
@@ -1,7 +1,7 @@
#!/usr/bin/perl
# CGI-script to run LaTeX, dvips, ps2ps, ps2pdf etc.
#
-# $Id: printout.pl,v 1.132 2008/03/11 01:48:57 www Exp $
+# $Id: printout.pl,v 1.133 2008/03/18 09:48:11 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -165,145 +165,79 @@
}
my %perlvar=%{&LONCAPA::Configuration::read_conf('loncapa.conf')};
- &Apache::lonlocal::get_language_handle();
- &Apache::loncommon::content_type(undef,'text/html');
+&Apache::lonlocal::get_language_handle();
+&Apache::loncommon::content_type(undef,'text/html');
$env{'request.noversionuri'} = '/cgi-bin/printout.pl';
- print(&Apache::loncommon::start_page('Creating PDF'));
+print(&Apache::loncommon::start_page('Creating PDF'));
+
+my $identifier = $ENV{'QUERY_STRING'};
+my $texfile = $env{'cgi.'.$identifier.'.file'};
+my $laystyle = $env{'cgi.'.$identifier.'.layout'};
+my $numberofcolumns = $env{'cgi.'.$identifier.'.numcol'};
+my $paper = $env{'cgi.'.$identifier.'.paper'};
+my $selectionmade = $env{'cgi.'.$identifier.'.selection'};
+my $tableofcontents = $env{'cgi.'.$identifier.'.tableofcontents'};
+my $tableofindex = $env{'cgi.'.$identifier.'.tableofindex'};
+my $advanced_role = $env{'cgi.'.$identifier.'.role'};
+my $number_of_files = $env{'cgi.'.$identifier.'.numberoffiles'}+1;
+my $student_names = $env{'cgi.'.$identifier.'.studentnames'};
+my $backref = &Apache::lonnet::unescape($env{'cgi.'.$identifier.'.backref'});
+
+
+my @names_pack=();
+if ($student_names=~/_END_/) {
+ @names_pack=split(/_ENDPERSON_/,$student_names);
+}
+if ($backref) {
+ print('<p>'.&mt("[_1]Return[_2] to editing resource.",
+ "<a href=\"$backref\"><b>","</b></a>").'</p>');
+}
+my $figfile = $texfile;
+$figfile =~ s/^(.*_printout)_\d+_\d+_\d+\.tex/$1\.dat/;
+my $duefile = $texfile;
+$duefile =~ s/^(.*_printout)_\d+_\d+_\d+\.tex/$1\.due/;
+
+
+#-------------------------------------------------------------------------------------
+#
+# Each print may have associated with it a file that contains a set of figures
+# that need to be converted to .eps from whatever form they were in when included
+# in the resource. The name of the figure file is in $figfile. If it exists,
+# it contains the names of the files that need to be converted, one per line.
+#
+
+if (-e $figfile) {
+ # print "$figfile exists\n";
+ my %done_conversion;
+ my $temporary_file=IO::File->new($figfile) || die "Couldn't open fig file $figfile for reading: $!\n";
+ my @content_of_file = <$temporary_file>;
+ close $temporary_file;
+ my $noteps;
+ my %prog_state;
+ if ($advanced_role) { %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Converting Images to EPS','Picture Conversion Status',$#content_of_file,'inline','80'); }
+ print('<br />');
+ foreach my $not_eps (@content_of_file) {
+ chomp($not_eps);
+ if ($not_eps ne '') {
+ $not_eps=~s|\/\.\/|\/|g;
+ if (!$done_conversion{$not_eps}) { # Only convert multiple includes once.
+ &convert_figure($not_eps);
+ $done_conversion{$not_eps} = 1;
+ }
+ }
+ }
+ if ($advanced_role) {
+ &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state);
+ }
+ unlink($figfile);
+}
+# End of figure conversion section:
+#
+#--------------------------------------------------------------------------------------------
+
- my $identifier = $ENV{'QUERY_STRING'};
- my $texfile = $env{'cgi.'.$identifier.'.file'};
- my $laystyle = $env{'cgi.'.$identifier.'.layout'};
- my $numberofcolumns = $env{'cgi.'.$identifier.'.numcol'};
- my $paper = $env{'cgi.'.$identifier.'.paper'};
- my $selectionmade = $env{'cgi.'.$identifier.'.selection'};
- my $tableofcontents = $env{'cgi.'.$identifier.'.tableofcontents'};
- my $tableofindex = $env{'cgi.'.$identifier.'.tableofindex'};
- my $advanced_role = $env{'cgi.'.$identifier.'.role'};
- my $number_of_files = $env{'cgi.'.$identifier.'.numberoffiles'}+1;
- my $student_names = $env{'cgi.'.$identifier.'.studentnames'};
- my $backref = &Apache::lonnet::unescape($env{'cgi.'.$identifier.'.backref'});
-
- my @names_pack=();
- if ($student_names=~/_END_/) {
- @names_pack=split(/_ENDPERSON_/,$student_names);
- }
- if ($backref) {
- print('<p>'.&mt("[_1]Return[_2] to editing resource.",
- "<a href=\"$backref\"><b>","</b></a>").'</p>');
- }
- my $figfile = $texfile;
- $figfile =~ s/^(.*_printout)_\d+_\d+_\d+\.tex/$1\.dat/;
- my $duefile = $texfile;
- $duefile =~ s/^(.*_printout)_\d+_\d+_\d+\.tex/$1\.due/;
- #do we have figures?
- # print "Figure file: $figfile\n";
- if (-e $figfile) {
- # print "$figfile exists\n";
- my %done_conversion;
- my $temporary_file=IO::File->new($figfile) || die "Couldn't open fig file $figfile for reading: $!\n";
- my @content_of_file = <$temporary_file>;
- close $temporary_file;
- my $noteps;
- my %prog_state;
- if ($advanced_role) { %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('','Converting Images to EPS','Picture Conversion Status',$#content_of_file,'inline','80'); }
- print('<br />');
- foreach my $not_eps (@content_of_file) {
- chomp($not_eps);
- if ($not_eps ne '') {
- # print "Converting $not_eps"; # Debugging.
- my $status_statement='EPS picture for '.$not_eps;
- # print "$status_statement\n";
- $not_eps=~s|\/\.\/|\/|g;
- my $eps_f = $not_eps;
- # $eps_f =~ s/\.[^.]*$/\.eps/i;
- if ($eps_f=~/\/home\/([^\/]+)\/public_html\//) {
- $eps_f=~s/\/home\/([^\/]+)\/public_html/$1/;
- $eps_f = $perlvar{'lonPrtDir'}.'/'.$eps_f;
- } elsif ($eps_f=~/$perlvar{'lonDocRoot'}\/res\//) {
- $eps_f=~m/$perlvar{'lonDocRoot'}\/res\/(.+)/;
- $eps_f = $perlvar{'lonPrtDir'}.'/'.$1;
- } elsif ($eps_f=~/$perlvar{'lonUsersDir'}\//) {
- $eps_f=~/$perlvar{'lonUsersDir'}\/([^\/]+)\/\w\/\w\/\w\/(.+)/;
- $eps_f = $perlvar{'lonPrtDir'}.'/'.$1.'/'.$2;
- }
- $eps_f =~ s/ /\_/g; # Spaces are problematic for system commands and LaTeX.
- #
- # If the file is already an .eps or .ps file,
- # We really just need to copy it from where it was to prtspool
- # but with the spaces substituted to _'s.
- #
- my ($nsname,$path, $sext) = &fileparse($eps_f, qr/\.(ps|eps)/i);
- if ($sext =~/ps$/i) {
- # print "$not_eps is a postscript file. copy to $path\n";
- &File::Path::mkpath($path,0,0777);
- #print("Made path: $path");
- #$not_eps =~ s/^\s+//;
- #$not_eps =~ s/\s+$//;
- #$not_eps =~ s/ /\__/g;
- #print("Copying $not_eps to $eps_f\n");
- copy("$not_eps", "$eps_f");
- # print "Copy complete\n";
- } else {
-
- $eps_f .= '.eps'; # Just append the eps ext.
- my $path=$eps_f;
- $path =~ s/\/([^\/]+)\.eps$//;
- # print "Final file path: $path "; # Debugging
- &File::Path::mkpath($path,0,0777);
- $not_eps =~ s/^\s+//;
- $not_eps =~ s/\s+$//;
- $not_eps =~ s/ /\\ /g;
- if ( exists($done_conversion{$not_eps})) { next; }
- if ($advanced_role) {
- my $prettyname=$not_eps;
- $prettyname=~s|/home/([^/]+)/public_html|/priv/$1|;
- $prettyname=~s|$perlvar{'lonDocRoot'}/|/|;
- &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,
- 'Converting to EPS '.$prettyname);
- }
- $done_conversion{$not_eps}=1;
- # print "Converting $not_eps -> $eps_f"; # Debugging
- system("convert $not_eps $eps_f");
- # check is eps exist in prtspool
- if (not -e $eps_f) {
- # converting an animated gif creates either:
- # anim.gif.eps.0
- # or
- # anim.gif-0.eps
- for (my $i=0;$i<10000;$i++) {
- if (-e $eps_f.'.'.$i) {
- rename($eps_f.'.'.$i, $eps_f);
- last;
- }
- my $anim_eps = $eps_f;
- $anim_eps =~ s/(\.[^.]*)\.eps$/$1-$i\.eps/i;
- if (-e $anim_eps) {
- rename($anim_eps, $eps_f);
- last;
- }
- }
- }
-
- # imagemagick 6.2.0-6.2.7 fails to properly handle
- # convert anim.gif anim.gif.eps
- # it creates anim.eps instead.
- if (not -e $eps_f) {
- my $eps_f2 = $eps_f;
- $eps_f2 =~ s/\.[^.]*\.eps$/\.eps/i;
- if(-e $eps_f2) {
- rename($eps_f2,$eps_f);
- }
- }
- }
- }
- }
- if ($advanced_role) {
- &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state);
- }
- unlink($figfile);
- }
#print "$texfile\n"; #name of the tex file for debugging only
my @texfile=($texfile);
if ($number_of_files>1) {
@@ -1033,3 +967,85 @@
}
}
+#
+# Convert a figure file to encapsulated postscript:
+# At present, this is using a lot of file scoped globals to pass data around.
+# Parameters:
+# not_eps - The name of the file to convert which, presumably, is not
+# already an eps file.
+#
+sub convert_figure {
+ my ($not_eps) = @_;
+
+
+ my $status_statement='EPS picture for '.$not_eps;
+ my $eps_f = $not_eps;
+ if ($eps_f=~/\/home\/([^\/]+)\/public_html\//) {
+ $eps_f=~s/\/home\/([^\/]+)\/public_html/$1/;
+ $eps_f = $perlvar{'lonPrtDir'}.'/'.$eps_f;
+ } elsif ($eps_f=~/$perlvar{'lonDocRoot'}\/res\//) {
+ $eps_f=~m/$perlvar{'lonDocRoot'}\/res\/(.+)/;
+ $eps_f = $perlvar{'lonPrtDir'}.'/'.$1;
+ } elsif ($eps_f=~/$perlvar{'lonUsersDir'}\//) {
+ $eps_f=~/$perlvar{'lonUsersDir'}\/([^\/]+)\/\w\/\w\/\w\/(.+)/;
+ $eps_f = $perlvar{'lonPrtDir'}.'/'.$1.'/'.$2;
+ }
+ $eps_f =~ s/ /\_/g; # Spaces are problematic for system commands and LaTeX.
+ #
+ # If the file is already an .eps or .ps file,
+ # We really just need to copy it from where it was to prtspool
+ # but with the spaces substituted to _'s.
+ #
+ my ($nsname,$path, $sext) = &fileparse($not_eps, qr/\.(ps|eps)/i);
+ if ($sext =~/ps$/i) {
+ &File::Path::mkpath($path,0,0777);
+ copy("$not_eps", "$eps_f");
+ } else {
+
+ $eps_f .= '.eps'; # Just append the eps ext.
+ my $path=$eps_f;
+ $path =~ s/\/([^\/]+)\.eps$//;
+ &File::Path::mkpath($path,0,0777);
+ $not_eps =~ s/^\s+//;
+ $not_eps =~ s/\s+$//;
+ $not_eps =~ s/ /\\ /g;
+ if ($advanced_role) {
+ my $prettyname=$not_eps;
+ $prettyname=~s|/home/([^/]+)/public_html|/priv/$1|;
+ $prettyname=~s|$perlvar{'lonDocRoot'}/|/|;
+ &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,
+ 'Converting to EPS '.$prettyname);
+ }
+ system("convert $not_eps $eps_f");
+ if (not -e $eps_f) {
+ # converting an animated gif creates either:
+ # anim.gif.eps.0
+ # or
+ # anim.gif-0.eps
+ for (my $i=0;$i<10000;$i++) {
+ if (-e $eps_f.'.'.$i) {
+ rename($eps_f.'.'.$i, $eps_f);
+ last;
+ }
+ my $anim_eps = $eps_f;
+ $anim_eps =~ s/(\.[^.]*)\.eps$/$1-$i\.eps/i;
+ if (-e $anim_eps) {
+ rename($anim_eps, $eps_f);
+ last;
+ }
+ }
+ }
+
+ # imagemagick 6.2.0-6.2.7 fails to properly handle
+ # convert anim.gif anim.gif.eps
+ # it creates anim.eps instead.
+ if (not -e $eps_f) {
+ my $eps_f2 = $eps_f;
+ $eps_f2 =~ s/\.[^.]*\.eps$/\.eps/i;
+ if(-e $eps_f2) {
+ rename($eps_f2,$eps_f);
+ }
+ }
+ }
+
+}
--foxr1205833692--