version 1.130, 2008/03/10 10:24:49
|
version 1.133, 2008/03/18 09:48:11
|
Line 43 use LONCAPA::Configuration;
|
Line 43 use LONCAPA::Configuration;
|
|
|
use strict; |
use strict; |
|
|
my $busy_wait_timeout = 20; |
my $busy_wait_timeout = 30; |
|
|
# Determine if a user is operating as a student for this course/domain. |
# Determine if a user is operating as a student for this course/domain. |
#Parameters: |
#Parameters: |
Line 165 END
|
Line 165 END
|
} |
} |
|
|
my %perlvar=%{&LONCAPA::Configuration::read_conf('loncapa.conf')}; |
my %perlvar=%{&LONCAPA::Configuration::read_conf('loncapa.conf')}; |
&Apache::lonlocal::get_language_handle(); |
&Apache::lonlocal::get_language_handle(); |
&Apache::loncommon::content_type(undef,'text/html'); |
&Apache::loncommon::content_type(undef,'text/html'); |
$env{'request.noversionuri'} = '/cgi-bin/printout.pl'; |
$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('','Coverting 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 |
#print "$texfile\n"; #name of the tex file for debugging only |
my @texfile=($texfile); |
my @texfile=($texfile); |
if ($number_of_files>1) { |
if ($number_of_files>1) { |
Line 377 foreach $texfile (@texfile) {
|
Line 311 foreach $texfile (@texfile) {
|
my $name_file = $2; |
my $name_file = $2; |
my $path_file = $1.'/'; |
my $path_file = $1.'/'; |
chdir $path_file; |
chdir $path_file; |
my $dvi_file= $name_file; $dvi_file =~ s/\.tex/$name_range\.dvi/; |
my $dvi_file= $name_file; $dvi_file =~ s/\.tex$/\.dvi/; |
&busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null", |
&busy_wait_command("latex $name_file 1>/dev/null 2>/dev/null", |
"for $status_statement now LaTeXing file", |
"for $status_statement now LaTeXing file", |
\%prog_state,$dvi_file, $busy_wait_timeout); |
\%prog_state,$dvi_file, $busy_wait_timeout); |
Line 449 foreach $texfile (@texfile) {
|
Line 383 foreach $texfile (@texfile) {
|
$logfilename=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool}; |
$logfilename=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool}; |
print "<a href=\"$logfilename\">Your log file </a></big></b>"; |
print "<a href=\"$logfilename\">Your log file </a></big></b>"; |
print "\n"; |
print "\n"; |
#link tooriginal LaTeX file (included according Michael Hamlin desire) |
#link to original LaTeX file |
my $tex_temporary_file=IO::File->new($texfile) || die "Couldn't open tex file $texfile for reading: $!\n"; |
my $tex_temporary_file=IO::File->new($texfile) || die "Couldn't open tex file $texfile for reading: $!\n"; |
my @tex_content_of_file = <$tex_temporary_file>; |
my @tex_content_of_file = <$tex_temporary_file>; |
close $tex_temporary_file; |
close $tex_temporary_file; |
Line 620 foreach $texfile (@texfile) {
|
Line 554 foreach $texfile (@texfile) {
|
$logfilename=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool}; |
$logfilename=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool}; |
print "<a href=\"$logfilename\">Your log file </a></big></b>"; |
print "<a href=\"$logfilename\">Your log file </a></big></b>"; |
print "\n"; |
print "\n"; |
#link tooriginal LaTeX file (included according Michael Hamlin desire) |
#link to original LaTeX file |
my $tex_temporary_file=IO::File->new($texfile) || die "Couldn't open tex file $texfile for reading: $!\n"; |
my $tex_temporary_file=IO::File->new($texfile) || die "Couldn't open tex file $texfile for reading: $!\n"; |
my @tex_content_of_file = <$tex_temporary_file>; |
my @tex_content_of_file = <$tex_temporary_file>; |
close $tex_temporary_file; |
close $tex_temporary_file; |
Line 824 sub busy_wait_command {
|
Line 758 sub busy_wait_command {
|
if ($size == $last_size) { |
if ($size == $last_size) { |
$unchanged_time++; |
$unchanged_time++; |
if ($timeout && ($unchanged_time > $timeout)) { |
if ($timeout && ($unchanged_time > $timeout)) { |
print "<h1>Operation timed out!!!</h1>\n"; |
print "<h1>Operation timed out!</h1>\n"; |
print "<p>Executing $command, The output file $output_file did not grow\n"; |
print "<p>Executing $command, the output file $output_file did not grow\n"; |
print "after $timeout seconds. This <em>may</em> indicate $command\n"; |
print "after $timeout seconds. This <em>may</em> indicate $command\n"; |
print "is in an infinite loop."; |
print "is in an infinite loop.\n"; |
print "See if printing fewer copies helps. Please contact LonCAPA\n"; |
print "See if printing fewer copies helps. Please contact LON-CAPA\n"; |
print "support about this in any event"; |
print "support about this in any event."; |
print "</p>"; |
print "</p>"; |
kill(9, $pid); # Reaper will do the rest...I hope there's errors in the log. |
kill(9, $pid); # Reaper will do the rest...I hope there's errors in the log. |
} |
} |
Line 1033 sub create_missing_fonts {
|
Line 967 sub create_missing_fonts {
|
} |
} |
|
|
} |
} |
|
# |
|
# 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); |
|
} |
|
} |
|
} |
|
|
|
} |