--- loncom/xml/londefdef.pm 2005/03/02 22:26:36 1.260
+++ loncom/xml/londefdef.pm 2005/05/23 09:49:36 1.275
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Tags Default Definition Module
#
-# $Id: londefdef.pm,v 1.260 2005/03/02 22:26:36 raeburn Exp $
+# $Id: londefdef.pm,v 1.275 2005/05/23 09:49:36 foxr Exp $
#
#
# Copyright Michigan State University Board of Trustees
@@ -39,7 +39,7 @@
package Apache::londefdef;
-use Apache::lonnet();
+use Apache::lonnet;
use strict;
use Apache::lonxml;
use Apache::File();
@@ -132,7 +132,7 @@ sub start_tthoption {
if ($target eq 'web') {
my $inside = &Apache::lonxml::get_all_text("/tthoption",$parser);
$inside=~s/^\s*//;
- if ($ENV{'browser.mathml'}) {
+ if ($env{'browser.mathml'}) {
&tth::ttmoptions($inside);
} else {
&tth::tthoptions($inside);
@@ -151,15 +151,14 @@ sub end_tthoption {
sub start_html {
my ($target,$token) = @_;
my $currentstring = '';
- my $options=$ENV{'course.'.$ENV{'request.course.id'}.'.tthoptions'};
+ my $options=$env{'course.'.$env{'request.course.id'}.'.tthoptions'};
&Apache::lontexconvert::init_tth();
- if ($target eq 'web' || $target eq 'edit') {
+ if ($target eq 'web' || $target eq 'edit' || $target eq 'webgrade' ) {
$currentstring = &Apache::lonxml::xmlbegin();
} elsif ($target eq 'tex') {
- @Apache::londefdef::table = ();
$currentstring .= '\documentclass[letterpaper]{article}';
- if (($ENV{'form.latex_type'}=~'batchmode') ||
- (!$ENV{'request.role.adv'})) {$currentstring .='\batchmode';}
+ if (($env{'form.latex_type'}=~'batchmode') ||
+ (!$env{'request.role.adv'})) {$currentstring .='\batchmode';}
$currentstring .= '\newcommand{\keephidden}[1]{}'.
'\renewcommand{\deg}{$^{\circ}$}'.
'\usepackage{longtable}'.
@@ -202,7 +201,7 @@ sub start_head {
sub end_head {
my ($target,$token) = @_;
my $currentstring = '';
- if ($target eq 'web' && $ENV{'request.state'} eq 'published') {
+ if ($target eq 'web' && $env{'request.state'} eq 'published') {
$currentstring = &Apache::lonmenu::registerurl(undef,$target).
$token->[2];
}
@@ -490,15 +489,15 @@ sub start_body {
return '';
}
if (!$Apache::lonxml::registered &&
- $ENV{'request.state'} eq 'published') {
+ $env{'request.state'} eq 'published') {
$currentstring.='
'.
&Apache::lonmenu::registerurl(undef,$target).'';
}
# Accessibility
- if ($ENV{'browser.imagesuppress'} eq 'on') {
+ if ($env{'browser.imagesuppress'} eq 'on') {
delete($token->[2]->{'background'});
}
- if ($ENV{'browser.fontenhance'} eq 'on') {
+ if ($env{'browser.fontenhance'} eq 'on') {
my $style='';
foreach my $key (keys(%{$token->[2]})) {
if ($key =~ /^style$/i) {
@@ -508,7 +507,7 @@ sub start_body {
}
$token->[2]->{'style'}=$style.'; font-size: x-large;';
}
- if ($ENV{'browser.blackwhite'} eq 'on') {
+ if ($env{'browser.blackwhite'} eq 'on') {
delete($token->[2]->{'font'});
delete($token->[2]->{'link'});
delete($token->[2]->{'alink'});
@@ -535,17 +534,17 @@ sub start_body {
$token->[2]->{'onunload'}=&Apache::lonmenu::unloadevents().
';'.$onUnload;
- if ($ENV{'request.state'} ne 'construct') {
+ if ($env{'request.state'} ne 'construct') {
$currentstring .= '<'.$token->[1];
}
foreach (keys %{$token->[2]}) {
$currentstring.=' '.$_.'="'.$token->[2]->{$_}.'"';
}
- if ($ENV{'request.state'} ne 'construct') {
+ if ($env{'request.state'} ne 'construct') {
$currentstring.='>';
}
- if ($ENV{'request.state'} ne 'published') {
- my $remote=($ENV{'environment.remote'} ne 'off');
+ if ($env{'request.state'} ne 'published') {
+ my $remote=($env{'environment.remote'} ne 'off');
$currentstring=&Apache::loncommon::bodytag(undef,undef,
$currentstring,$remote);
$currentstring.=(<';
&start_output($target);
@@ -710,7 +709,7 @@ sub start_h2 {
}
my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
if (not defined $TeXsize) {$TeXsize="large";}
- $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{';
+ $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
}
return $currentstring;
}
@@ -753,7 +752,7 @@ sub start_h3 {
}
my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
if (not defined $TeXsize) {$TeXsize="large";}
- $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{';
+ $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
}
return $currentstring;
}
@@ -796,7 +795,7 @@ sub start_h4 {
}
my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
if (not defined $TeXsize) {$TeXsize="large";}
- $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{';
+ $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
}
return $currentstring;
}
@@ -839,7 +838,7 @@ sub start_h5 {
}
my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
if (not defined $TeXsize) {$TeXsize="large";}
- $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{';
+ $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
}
return $currentstring;
}
@@ -882,7 +881,7 @@ sub start_h6 {
}
my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
if (not defined $TeXsize) {$TeXsize="large";}
- $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{';
+ $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
}
return $currentstring;
}
@@ -1126,9 +1125,9 @@ sub start_p {
if ($align eq 'center') {
$currentstring='\begin{center}\par';
} elsif ($align eq 'right') {
- $currentstring='\makebox['.$ENV{'form.textwidth'}.']{\hfill\llap{';
+ $currentstring='\makebox['.$env{'form.textwidth'}.']{\hfill\llap{';
} elsif ($align eq 'left') {
- $currentstring='\noindent\makebox['.$ENV{'form.textwidth'}.']{\rlap{';
+ $currentstring='\noindent\makebox['.$env{'form.textwidth'}.']{\rlap{';
} else {
$currentstring='\par ';
}
@@ -1277,8 +1276,8 @@ sub start_font {
if ($target eq 'web') {
my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval);
if ($face!~/symbol/i) {
- if (($ENV{'browser.fontenhance'} eq 'on') ||
- ($ENV{'browser.blackwhite'} eq 'on')) { return ''; }
+ if (($env{'browser.fontenhance'} eq 'on') ||
+ ($env{'browser.blackwhite'} eq 'on')) { return ''; }
}
$currentstring = $token->[4];
} elsif ($target eq 'tex') {
@@ -1826,7 +1825,7 @@ sub start_table {
$Apache::londefdef::table[-1]{'row_number'} = -1;
#maximum table's width (default coincides with text line length)
if ($#Apache::londefdef::table==0) {
- $textwidth=&recalc($ENV{'form.textwidth'}); #result is always in mm
+ $textwidth=&recalc($env{'form.textwidth'}); #result is always in mm
$textwidth=~/(\d+\.?\d*)/;
$textwidth=0.95*$1; #accounts "internal" LaTeX space for table frame
} else {
@@ -2450,7 +2449,7 @@ sub start_img {
# Render unto browsers that which are the browser's...
if ($target eq 'web') {
- if ($ENV{'browser.imagesuppress'} ne 'on') {
+ if ($env{'browser.imagesuppress'} ne 'on') {
$currentstring.=&Apache::lonenc::encrypt_ref($token,{'src'=>$src});
} else {
my $alttag= &Apache::lonxml::get_param
@@ -2495,16 +2494,28 @@ sub start_img {
if(!$latex_rendering) {
$latex_rendering = "parbox";
}
- &Apache::lonxml::debug("LaTeX rendering = $latex_rendering");
+ &Apache::lonxml::debug("LaTeX rendering = $latex_rendering image file: $src");
#if original gif/jpg/png file exist do following:
+ my $origsrc=$src;
my ($path,$file) = &get_eps_image($src);
$src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
+ &Apache::lonxml::debug("path = $path file = $file src = $src");
if (-e $src) {
+ &Apache::lonxml::debug("$src exists");
my ($height_param,$width_param)=
- &image_size($src,0.3,$parstack,$safeeval);
- $currentstring .= '\graphicspath{{'.$path.'}}'
- .'\includegraphics[width='.$width_param.' mm,height='.$height_param.'mm]{'.$file.'} ';
+ &image_size($origsrc,0.3,$parstack,$safeeval);
+ my $destpath = $path;
+ $destpath =~ s/ /\_/g; # Spaces in path cause LaTex to vomit.
+ my $destfile = $file;
+ $destfile =~ s/ /\_/g;
+ my $size;
+ if ($width_param) { $size.='width='.$width_param.' mm,'; }
+ if ($height_param) { $size.='height='.$height_param.' mm]'; }
+ $size='['.$size;
+ $size=~s/,$/]/;
+ $currentstring .= '\graphicspath{{'.$destpath.'}}'
+ .'\includegraphics'.$size.'{'.$destfile.'} ';
# If there's an alignment specification we need to honor it here.
# For the horizontal alignments, we will also honor the
@@ -2537,6 +2548,7 @@ sub start_img {
# $currentstring = '\raisebox{'.$height_param.'mm}{'.$currentstring.'}';
}
} else {
+ &Apache::lonxml::debug("$src does not exist");
#original image file doesn't exist so check the alt attribute
my $alt =
&Apache::lonxml::get_param('alt',$parstack,$safeeval,undef,1);
@@ -2615,6 +2627,7 @@ sub start_img {
}
if ($ctag) {$currentstring=&Apache::edit::rebuild_tag($token);}
}
+
return $currentstring;
}
@@ -2642,7 +2655,7 @@ sub start_applet {
my $currentstring = '';
if ($target eq 'web') {
- if ($ENV{'browser.appletsuppress'} ne 'on') {
+ if ($env{'browser.appletsuppress'} ne 'on') {
$currentstring = &Apache::lonenc::encrypt_ref($token,
{'code'=>$code,
'archive'=>$archive}
@@ -2688,7 +2701,7 @@ sub start_embed {
$Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$src;
my $currentstring = '';
if ($target eq 'web') {
- if ($ENV{'browser.embedsuppress'} ne 'on') {
+ if ($env{'browser.embedsuppress'} ne 'on') {
$currentstring=&Apache::lonenc::encrypt_ref($token,{'src'=>$src});
} else {
my $alttag=&Apache::lonxml::get_param
@@ -2784,7 +2797,7 @@ sub start_frameset {
my $currentstring = '';
if ($target eq 'web') {
if (!$Apache::lonxml::registered &&
- $ENV{'request.state'} eq 'published') {
+ $env{'request.state'} eq 'published') {
$currentstring.=''.
&Apache::lonmenu::registerurl(undef,$target).'';
}
@@ -3749,22 +3762,45 @@ sub image_replication {
$pssrc =~ s/\.(gif|jpg|jpeg|png)$/.ps/i;
if (not -e $epssrc && not -e $pssrc) {
my $result=&Apache::lonnet::repcopy($epssrc);
- if ($result ne 'OK') { &Apache::lonnet::repcopy($pssrc); }
+ if ($result ne 'ok') { &Apache::lonnet::repcopy($pssrc); }
}
return '';
}
+#
+# Get correct sizing parameter for an image given
+# it's initial ht. and wid. This allows sizing of
+# images that are generated on-the-fly (e.g. gnuplot)
+# as well as serving as a utility for image_size.
+#
+# Parameter:
+# height_param
+# width_param - Initial picture dimensions.
+# scaling - A scale factor.
+# parstack, - the current stack of tag attributes
+# from the xml parser
+# safeeval, - pointer to the safespace
+# depth, - from what level in the stack to look for attributes
+# (assumes -1 if unspecified)
+# cis - look for attrubutes case insensitively
+# (assumes false)
+#
+# Returns:
+# height, width - new dimensions.
+#
+sub resize_image {
+ my ($height_param, $width_param, $scaling,
+ $parstack, $safeeval, $depth, $cis) = @_;
+
+ # First apply the scaling...
+
+ $height_param = $height_param * $scaling;
+ $width_param = $width_param * $scaling;
-sub image_size {
- my ($src,$scaling,$parstack,$safeeval,$depth,$cis)=@_;
- #size of image from gif/jpg/jpeg/png
- $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
- my $image = Image::Magick->new;
- my $current_figure = $image->Read($src);
- my $width_param = $image->Get('width') * $scaling;;
- my $height_param = $image->Get('height') * $scaling;;
- undef($image);
#do we have any specified LaTeX size of the picture?
- my $toget='TeXwidth'; if ($cis) { $toget=lc($toget); }
+ my $toget='TeXwidth';
+ if ($cis) {
+ $toget=lc($toget);
+ }
my $TeXwidth = &Apache::lonxml::get_param($toget,$parstack,
$safeeval,$depth,$cis);
$toget='TeXheight'; if ($cis) { $toget=lc($toget); }
@@ -3776,24 +3812,57 @@ sub image_size {
if ($TeXwidth) {
my $old_width_param=$width_param;
if ($TeXwidth=~/(\d+)\s*\%/) {
- $width_param = $1*$ENV{'form.textwidth'}/100;
+ $width_param = $1*$env{'form.textwidth'}/100;
} else {
$width_param = $TeXwidth;
}
- $height_param=$TeXwidth/$old_width_param*$height_param;
+ if ($TeXheight) {
+ $height_param = $TeXheight;
+ } elsif ($old_width_param) {
+ $height_param=$TeXwidth/$old_width_param*$height_param;
+ }
} elsif ($TeXheight) {
$height_param = $TeXheight;
- $width_param = $TeXheight/$height_param*$width_param;
+ if ($height_param) {
+ $width_param = $TeXheight/$height_param*$width_param;
+ }
} elsif ($width) {
my $old_width_param=$width_param;
$width_param = $width*$scaling;
- $height_param=$width_param/$old_width_param*$height_param;
+ if ($old_width_param) {
+ $height_param=$width_param/$old_width_param*$height_param;
+ }
}
- if ($width_param > $ENV{'form.textwidth'}) {
+ if ($width_param > $env{'form.textwidth'}) {
my $old_width_param=$width_param;
- $width_param =0.95*$ENV{'form.textwidth'};
- $height_param=$width_param/$old_width_param*$height_param;
+ $width_param =0.95*$env{'form.textwidth'};
+ if ($old_width_param) {
+ $height_param=$width_param/$old_width_param*$height_param;
+ }
}
+
+ return ($height_param, $width_param);
+}
+
+sub image_size {
+ my ($src,$scaling,$parstack,$safeeval,$depth,$cis)=@_;
+
+ #size of image from gif/jpg/jpeg/png
+ my $ressrc=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
+ if (-e $ressrc) {
+ $src = $ressrc;
+ }
+ my $image = Image::Magick->new;
+ my $current_figure = $image->Read($src);
+ my $width_param = $image->Get('width');
+ my $height_param = $image->Get('height');
+ &Apache::lonxml::debug("Image magick says: $src : Height = $height_param width = $width_param");
+ undef($image);
+
+ ($height_param, $width_param) = &resize_image($height_param, $width_param,
+ $scaling, $parstack, $safeeval,
+ $depth, $cis);
+
return ($height_param, $width_param);
}
@@ -3811,35 +3880,47 @@ sub image_height {
sub get_eps_image {
my ($src)=@_;
- my $orig_src=$src;
+ my $orig_src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1], $src);
+ &Apache::lonxml::debug("get_eps_image: Original image: $orig_src");
$src=~s/\.(gif|png|jpg|jpeg)$/\.eps/i;
$src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
+ &Apache::lonxml::debug("Filelocation gives: $src");
if (! -e $src) {
- if (&Apache::lonnet::repcopy($src) ne 'OK' ) {
+ &Apache::lonxml::debug("$src does not exist");
+ if (&Apache::lonnet::repcopy($src) ne 'ok' ) {
+ &Apache::lonxml::debug("Repcopy of $src failed (1)");
#if replication failed try to find ps file
$src=~s/\.eps$/\.ps/;
- #if no ps file try to replicate it
- if (not -e $src &&
- &Apache::lonnet::repcopy($src) ne 'OK') {
+ &Apache::lonxml::debug("Now looking for $src");
+ #if no ps file try to replicate it.
+ my $didrepcopy = &Apache::lonnet::repcopy($src);
+ &Apache::lonxml::debug("repcopy of $src ... $didrepcopy");
+ if ( (not -e $src) ||
+ ($didrepcopy ne 'ok')) {
+ &Apache::lonxml::debug("Failed to find or replicate $src");
+
#if replication failed try to produce eps file dynamically
$src=~s/\.ps$/\.eps/;
my $temp_file;
- open(FILE,">>/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.dat");
+ open(FILE,">>/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat");
my $newsrc=$orig_src;
$newsrc =~ s|(.*)/res/|/home/httpd/html/res/|;
+ &Apache::lonxml::debug("queueing $newsrc for dynamic eps production.");
print FILE "$newsrc\n";
+ close FILE;
$src=~s|/home/httpd/html/res|/home/httpd/prtspool|;
$src=~s|/home/([^/]*)/public_html/|/home/httpd/prtspool/$1/|;
}
}
}
my ($path,$file)=($src=~m|(.*)/([^/]*)$|);
+ &Apache::lonxml::debug("get_eps_image returning: $path / $file
");
return ($path.'/',$file);
}
sub eps_generation {
my ($src,$file,$width_param) = @_;
- my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.dat";
+ my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat";
my $temp_file = Apache::File->new('>>'.$filename);
print $temp_file "$src\n";
my $newsrc = $src;