--- loncom/xml/londefdef.pm 2004/12/27 14:06:32 1.248
+++ loncom/xml/londefdef.pm 2005/02/10 23:00:09 1.256
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Tags Default Definition Module
#
-# $Id: londefdef.pm,v 1.248 2004/12/27 14:06:32 foxr Exp $
+# $Id: londefdef.pm,v 1.256 2005/02/10 23:00:09 albertel Exp $
#
#
# Copyright Michigan State University Board of Trustees
@@ -36,10 +36,6 @@
# The C source of the Code may not be distributed by the Licensee
# to any other parties under any circumstances.
#
-#
-# last modified 06/26/00 by Alexander Sakharuk
-# 11/6,11/30,02/01/01,5/4 Gerd Kortemeyer
-# 01/18 Alex Sakharuk
package Apache::londefdef;
@@ -156,7 +152,8 @@ sub start_html {
} elsif ($target eq 'tex') {
@Apache::londefdef::table = ();
$currentstring .= '\documentclass[letterpaper]{article}';
- if ($ENV{'form.latex_type'}=~'batchmode') {$currentstring .='\batchmode';}
+ if (($ENV{'form.latex_type'}=~'batchmode') ||
+ (!$ENV{'request.role.adv'})) {$currentstring .='\batchmode';}
$currentstring .= '\newcommand{\keephidden}[1]{}'.
'\renewcommand{\deg}{$^{\circ}$}'.
'\usepackage{longtable}'.
@@ -1463,7 +1460,9 @@ sub start_a {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = '';
if ($target eq 'web') {
- $currentstring .= $token->[4];
+ my $href=&Apache::lonxml::get_param('href',$parstack,$safeeval,
+ undef,1);
+ $currentstring=&Apache::lonenc::encrypt_ref($token,{'href'=>$href});
} elsif ($target eq 'tex') {
my $a=&Apache::lonxml::get_param('href',$parstack,$safeeval,undef,1);
my $b=&Apache::lonxml::get_param('name',$parstack,$safeeval,undef,1);
@@ -2420,6 +2419,16 @@ sub end_th {
}
#-- tag (end tag forbidden)
+#
+# Render the tag.
+# has the following attributes (in addition to the
+# standard HTML ones:
+# TeXwrap - Governs how the tex target will try to wrap text around
+# horizontally aligned images.
+# TeXwidth - The width of the image when rendered for print (mm).
+# TeXheight - The height of the image when rendered for print (mm)
+# (Note there seems to also be support for this as a % of page size)
+#
sub start_img {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval,
@@ -2431,9 +2440,12 @@ sub start_img {
$Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$src;
my $currentstring = '';
my $scaling = .3;
+
+ # Render unto browsers that which are the browser's...
+
if ($target eq 'web') {
if ($ENV{'browser.imagesuppress'} ne 'on') {
- $currentstring.= $token->[4];
+ $currentstring.=&Apache::lonenc::encrypt_ref($token,{'src'=>$src});
} else {
my $alttag= &Apache::lonxml::get_param
('alt',$parstack,$safeeval,undef,1);
@@ -2443,6 +2455,9 @@ sub start_img {
}
$currentstring.='[IMAGE: '.$alttag.']';
}
+
+ # and render unto TeX that which is LaTeX
+
} elsif ($target eq 'tex') {
#
# The alignment will require some superstructure to be put around
@@ -2476,40 +2491,15 @@ sub start_img {
}
&Apache::lonxml::debug("LaTeX rendering = $latex_rendering");
- my $oldSRC=$src;
- $oldSRC=~s/\.(gif|jpg|png)$/\.eps/;
- $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
#if original gif/jpg/png file exist do following:
+ my ($path,$file) = &get_eps_image($src);
+ $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
if (-e $src) {
- #what is the image size?
- my $width_param=&image_width($src,$scaling,$parstack,$safeeval);
- my $height_param=&image_height($src,$scaling,$parstack,$safeeval);
- my ($file,$path)=&file_path($src);
- my $newsrc = $src;
- $newsrc =~ s/\.(gif|jpg|png)$/.eps/i;
- &Apache::lonnet::repcopy($oldSRC);
- $file=~s/\.(gif|jpg|png)$/.eps/i;
- #where can we find the picture?
- if (-e $newsrc) {
- #eps counterpart for image exist
- if ($path) {
- $currentstring .= '\graphicspath{{'.$path.'}}'
- .'\includegraphics[width='.$width_param.' mm,height='.$height_param.'mm]{'.$file.'} ';
- }
- } else {
- #there is no eps counterpart for image - check for ps one
- $newsrc =~ s/\.eps$/\.ps/;
- if (-e $newsrc) {
- #ps counterpart for image exist
- $file =~ s/\.eps$/\.ps/;
- if ($path) {
- $currentstring .= '\graphicspath{{'.$path.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';
- }
- } else {
- #care about eps dynamical generation
- $currentstring.=&eps_generation($src,$file,$width_param);
- }
- }
+ 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.'} ';
+
# If there's an alignment specification we need to honor it here.
# For the horizontal alignments, we will also honor the
# value of the latex specfication. The default is parbox,
@@ -2527,7 +2517,8 @@ sub start_img {
if ($latex_rendering eq "parpic") {
$currentstring = '\parpic[l]{'.$currentstring.'}';
} else { # parbox rendering
- $currentstring = '\newline'."\n".'\parbox{'.$width_param.'mm}{'.$currentstring.'}';
+ $currentstring = "\\strut\\newline\n".
+ '\parbox{'.$width_param.'mm}{'.$currentstring.'}';
}
} elsif ($align eq "right") {
if ($latex_rendering eq "parpic") {
@@ -2547,12 +2538,11 @@ sub start_img {
$alt=&Apache::lonmeta::alttag($Apache::lonxml::pwd[-1],$src);
}
- if ($alt) {
- $currentstring .= ' '.$alt.' ';
- } else {
- # tag will care about replication
- }
+ if ($alt) { $currentstring .= ' '.$alt.' '; }
}
+
+ # And here's where the semi-quote breaks down: allow the user
+ # to edit the beast as well by rendering the problem for edit:
} elsif ($target eq 'edit') {
$currentstring .=&Apache::edit::tag_start($target,$token);
$currentstring .=&Apache::edit::text_arg('Image Url:','src',$token,70).
@@ -2565,11 +2555,15 @@ sub start_img {
$currentstring .=&Apache::edit::text_arg('TeXheight (mm):','TeXheight',$token,5);
$currentstring .=&Apache::edit::select_arg('Alignment:','align',
['','bottom','middle','top','left','right'],$token,5);
+ $currentstring .=&Apache::edit::select_arg('TeXwrap:', 'TeXwrap',
+ ['', 'parbox', 'parpic'], $token, 2);
$currentstring .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
- my $src=&Apache::lonxml::get_param('src',$parstack,$safeeval);
- my $alt=&Apache::lonxml::get_param('alt',$parstack,$safeeval);
- my $width=&Apache::lonxml::get_param('width',$parstack,$safeeval);
- my $height=&Apache::lonxml::get_param('height',$parstack,$safeeval);
+ my $src= &Apache::lonxml::get_param('src',$parstack,$safeeval);
+ my $alt= &Apache::lonxml::get_param('alt',$parstack,$safeeval);
+ my $width= &Apache::lonxml::get_param('width',$parstack,$safeeval);
+ my $height= &Apache::lonxml::get_param('height',$parstack,$safeeval);
+
+
$currentstring .= '[2]{'src'},$token->[2]{'width'},$token->[2]{'height'});
my $ctag=&Apache::edit::get_new_args($token,$parstack,
$safeeval,'src','alt','align',
- 'TeXwidth','TeXheight',
+ 'TeXwidth','TeXheight', 'TeXwrap',
'width','height');
my ($nsrc,$nwidth,$nheight)=
($token->[2]{'src'},$token->[2]{'width'},$token->[2]{'height'});
@@ -2643,7 +2637,10 @@ sub start_applet {
my $currentstring = '';
if ($target eq 'web') {
if ($ENV{'browser.appletsuppress'} ne 'on') {
- $currentstring = $token->[4];
+ $currentstring = &Apache::lonenc::encrypt_ref($token,
+ {'code'=>$code,
+ 'archive'=>$archive}
+ );
} else {
my $alttag= &Apache::lonxml::get_param('alt',$parstack,
$safeeval,undef,1);
@@ -2686,7 +2683,7 @@ sub start_embed {
my $currentstring = '';
if ($target eq 'web') {
if ($ENV{'browser.embedsuppress'} ne 'on') {
- $currentstring = $token->[4];
+ $currentstring=&Apache::lonenc::encrypt_ref($token,{'src'=>$src});
} else {
my $alttag=&Apache::lonxml::get_param
('alt',$parstack,$safeeval,undef,1);
@@ -2722,7 +2719,16 @@ sub start_param {
&Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);
my $currentstring = '';
if ($target eq 'web') {
- $currentstring = $token->[4];
+ my %toconvert;
+ my $src=&Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);
+ if ($src) { $toconvert{'src'}= $src; }
+ my $name=&Apache::lonxml::get_param('name',$parstack,$safeeval,
+ undef,1);
+ if ($name=~/^cabbase$/i) {
+ $toconvert{'value'}=&Apache::lonxml::get_param('value',$parstack,
+ $safeeval,undef,1);
+ }
+ $currentstring = &Apache::lonenc::encrypt_ref($token,\%toconvert);
} elsif ($target eq 'tex') {
}
return $currentstring;
@@ -3743,32 +3749,45 @@ sub image_replication {
}
sub image_size {
- my ($src,$scaling,$parstack,$safeeval)=@_;
+ 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;
+ undef($image);
#do we have any specified LaTeX size of the picture?
- my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval);
- my $TeXheight = &Apache::lonxml::get_param('TeXheight',$parstack,$safeeval);
+ 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); }
+ my $TeXheight = &Apache::lonxml::get_param($toget,$parstack,
+ $safeeval,$depth,$cis);
#do we have any specified web size of the picture?
my $width = &Apache::lonxml::get_param('width',$parstack,$safeeval,
- undef,1);
- if ($TeXwidth ne '') {
+ $depth,1);
+ if ($TeXwidth) {
+ my $old_width_param=$width_param;
if ($TeXwidth=~/(\d+)\s*\%/) {
$width_param = $1*$ENV{'form.textwidth'}/100;
} else {
$width_param = $TeXwidth;
}
- } elsif ($TeXheight ne '') {
+ $height_param=$TeXwidth/$old_width_param*$height_param;
+ } elsif ($TeXheight) {
$height_param = $TeXheight;
$width_param = $TeXheight/$height_param*$width_param;
- } elsif ($width ne '') {
- $width_param = $width*$scaling;
+ } elsif ($width) {
+ my $old_width_param=$width_param;
+ $width_param = $width*$scaling;
+ $height_param=$width_param/$old_width_param*$height_param;
+ }
+ 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;
}
- if ($width_param > $ENV{'form.textwidth'}) {$width_param =0.95*$ENV{'form.textwidth'}}
return ($height_param, $width_param);
}
@@ -3784,6 +3803,34 @@ sub image_height {
return $height;
}
+sub get_eps_image {
+ my ($src)=@_;
+ my $orig_src=$src;
+ $src=~s/\.(gif|png|jpg|jpeg)$/\.eps/i;
+ $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
+ if (! -e $src) {
+ if (&Apache::lonnet::repcopy($src) ne OK ) {
+ #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) {
+ #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");
+ my $newsrc=$orig_src;
+ $newsrc =~ s|(.*)/res/|/home/httpd/html/res/|;
+ print FILE "$newsrc\n";
+ $src=~s|/home/httpd/html/res|/home/httpd/prtspool|;
+ $src=~s|/home/([^/]*)/public_html/|/home/httpd/prtspool/$1/|;
+ }
+ }
+ }
+ my ($path,$file)=($src=~m|(.*)/([^/]*)$|);
+ return ($path.'/',$file);
+}
+
sub eps_generation {
my ($src,$file,$width_param) = @_;
my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.dat";