[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--