version 1.77, 2005/06/07 22:31:30
|
version 1.89, 2007/06/20 17:33:33
|
Line 61 use Apache::File();
|
Line 61 use Apache::File();
|
use Apache::Constants qw(:common :http); |
use Apache::Constants qw(:common :http); |
use Image::Magick; |
use Image::Magick; |
use Apache::lonplot; |
use Apache::lonplot; |
|
use lib '/home/httpd/lib/perl/'; |
|
use LONCAPA; |
|
|
|
|
my %args; |
my %args; |
my $cgi_id; |
my $cgi_id; |
my $scale_factor; # image scale factor. |
my $scale_factor; # image scale factor. |
my $label_xscale; # Label scale factor (needed for gnuplot). |
my $label_xscale; # Label scale factor (needed for gnuplot). |
my $label_yscale; |
my $label_yscale; |
|
my $dirty_width_adjust = 5; # Width adjustment for e.g. gnuplot images. |
|
|
BEGIN { |
BEGIN { |
&Apache::lonxml::register('Apache::randomlabel',('randomlabel','labelgroup','location','label','bgimg')); |
&Apache::lonxml::register('Apache::randomlabel',('randomlabel','labelgroup','location','label','bgimg')); |
Line 138 sub start_randomlabel {
|
Line 141 sub start_randomlabel {
|
if ($target eq 'web') { |
if ($target eq 'web') { |
$cgi_id=&Apache::loncommon::get_cgi_id(); |
$cgi_id=&Apache::loncommon::get_cgi_id(); |
%args=(); |
%args=(); |
$args{"cgi.$cgi_id.BGIMG"}=&Apache::lonnet::escape($bgimg); |
$args{"cgi.$cgi_id.BGIMG"}=&escape($bgimg); |
$height_param = &Apache::lonxml::get_param('height',$parstack, $safeeval); |
$height_param = &Apache::lonxml::get_param('height',$parstack, $safeeval); |
$width_param = &Apache::lonxml::get_param('width', $parstack, $safeeval); |
$width_param = &Apache::lonxml::get_param('width', $parstack, $safeeval); |
} elsif ($target eq 'tex' && defined($bgimg)) { |
} elsif ($target eq 'tex' && defined($bgimg)) { |
$result.=&make_eps_image($bgimg,$parstack,$safeeval); |
$result.=&make_eps_image($bgimg,$parstack,$safeeval); |
} elsif ($target eq 'edit') { |
} elsif ($target eq 'edit') { |
|
my $only = join(',',&Apache::loncommon::filecategorytypes('Pictures')); |
$result.=&Apache::edit::tag_start($target,$token); |
$result.=&Apache::edit::tag_start($target,$token); |
$Apache::edit::bgimgsrc= |
$Apache::edit::bgimgsrc= |
&Apache::lonxml::get_param('bgimg',$parstack,$safeeval); |
&Apache::lonxml::get_param('bgimg',$parstack,$safeeval); |
$Apache::edit::bgimgsrccurdepth=$Apache::lonxml::curdepth; |
$Apache::edit::bgimgsrccurdepth=$Apache::lonxml::curdepth; |
$result.=&Apache::edit::text_arg('Image:','bgimg',$token,75).' '; |
$result.=&Apache::edit::text_arg('Image:','bgimg',$token,75).' '; |
$result.=&Apache::edit::browse('bgimg').' '; |
$result.=&Apache::edit::browse('bgimg',undef,undef,$only).' '; |
$result.=&Apache::edit::search('bgimg').'<br />'. |
$result.=&Apache::edit::search('bgimg').'<br />'. |
&Apache::edit::text_arg('Width(pixel):' ,'width' ,$token,6). |
&Apache::edit::text_arg('Width(pixel):' ,'width' ,$token,6). |
&Apache::edit::text_arg('Height(pixel):','height' ,$token,6). |
&Apache::edit::text_arg('Height(pixel):','height' ,$token,6). |
Line 161 sub start_randomlabel {
|
Line 165 sub start_randomlabel {
|
'height','texwidth'); |
'height','texwidth'); |
if ($constructtag) { |
if ($constructtag) { |
$result = &Apache::edit::rebuild_tag($token); |
$result = &Apache::edit::rebuild_tag($token); |
$result.=&Apache::edit::handle_insert(); |
|
} |
} |
} |
} |
return $result; |
return $result; |
Line 206 sub end_bgimg {
|
Line 209 sub end_bgimg {
|
# If the tag produced has sizes, they override ours. |
# If the tag produced has sizes, they override ours. |
# (for now anyway). |
# (for now anyway). |
# |
# |
|
|
&Apache::lonxml::debug("Base sizes: $width_param x $height_param"); |
&Apache::lonxml::debug("Base sizes: $width_param x $height_param"); |
|
|
my ($plot_x, $plot_y) = &extract_tag_sizes($bgimg, |
my ($plot_x, $plot_y) = &extract_tag_sizes($bgimg, |
$width_param, |
$width_param, |
$height_param ); |
$height_param); |
&Apache::lonxml::debug("Extracted sizes: $plot_x x $plot_y"); |
&Apache::lonxml::debug("Extracted sizes: $plot_x x $plot_y"); |
$label_xscale = $plot_x / $width_param; |
if ($width_param) { |
$label_yscale = $plot_y / $height_param; |
$label_xscale = $plot_x / $width_param; |
|
} |
|
if ($height_param) { |
|
$label_yscale = $plot_y / $height_param; |
|
} |
&Apache::lonxml::debug("Scale factors: $label_xscale $label_yscale"); |
&Apache::lonxml::debug("Scale factors: $label_xscale $label_yscale"); |
|
|
&Apache::lonxml::debug("Image: $bgimg"); |
&Apache::lonxml::debug("Image: $bgimg"); |
$bgimg=&Apache::imageresponse::clean_up_image($bgimg); |
$bgimg=&Apache::imageresponse::clean_up_image($bgimg); |
&Apache::lonxml::debug("Cleaned image: $bgimg"); |
&Apache::lonxml::debug("Cleaned image: $bgimg"); |
$args{"cgi.$cgi_id.BGIMG"}=&Apache::lonnet::escape($bgimg); |
$args{"cgi.$cgi_id.BGIMG"}=&escape($bgimg); |
} elsif ($target eq 'tex') { |
} elsif ($target eq 'tex') { |
# Some bg images can create latex for us... e.g. gnuplot. |
# Some bg images can create latex for us... e.g. gnuplot. |
# If it looks like we have some latex use that, |
# If it looks like we have some latex use that, |
Line 262 sub end_bgimg {
|
Line 268 sub end_bgimg {
|
&Apache::lonxml::debug("height $height_param"); |
&Apache::lonxml::debug("height $height_param"); |
&Apache::lonxml::debug("Width $width_param"); |
&Apache::lonxml::debug("Width $width_param"); |
&Apache::lonxml::debug("Scale factors: $label_xscale $label_yscale"); |
&Apache::lonxml::debug("Scale factors: $label_xscale $label_yscale"); |
my $dirty_width = $width_param + 5; |
my $dirty_width = $width_param + $dirty_width_adjust; |
|
my $x_offset = -$dirty_width_adjust/2.0; |
|
# |
|
# Somewhere here it looks like height_param and |
|
# width_param got backwards... |
|
# |
$result .= '\parbox{'.$dirty_width.'mm}{'; |
$result .= '\parbox{'.$dirty_width.'mm}{'; |
$result .= " $src \n"; |
$result .= " $src \n"; |
$result .= '\setlength{\unitlength}{1mm}'."\n"; |
$result .= '\setlength{\unitlength}{1mm}'."\n"; |
$result .= '\begin{picture}('."$height_param,$width_param)"; |
$result .= '\begin{picture}('."$width_param,$height_param)"; |
$result .= "(0,-$height_param)"; |
$result .= "($x_offset,-$height_param)"; |
$result .= "\n"; |
$result .= "\n"; |
$Apache::lonxml::debug = 0; |
$Apache::lonxml::debug = 0; |
|
|
} else { |
} else { |
|
|
|
|
$result.=&make_eps_image($bgimg,$parstack,$safeeval,-2); |
$result.=&make_eps_image($bgimg,$parstack,$safeeval,-2); |
} |
} |
} |
} |
Line 292 sub make_eps_image {
|
Line 301 sub make_eps_image {
|
&Apache::lonxml::debug("Image size: $height_param x $width_param"); |
&Apache::lonxml::debug("Image size: $height_param x $width_param"); |
|
|
my $dirtywidth=$width_param+5; |
my $dirtywidth=$width_param+5; |
|
|
my $result ="\n".'\vspace*{2mm}\noindent'."\n". |
my $result ="\n".'\vspace*{2mm}\noindent'."\n". |
'\parbox{'.$dirtywidth. |
'\parbox{'.$dirtywidth. |
' mm}{ \noindent \epsfxsize='.$width_param. |
' mm}{ \noindent \epsfxsize='.$width_param. |
Line 344 sub start_labelgroup {
|
Line 354 sub start_labelgroup {
|
'TeXsize'); |
'TeXsize'); |
if ($constructtag) { |
if ($constructtag) { |
$result = &Apache::edit::rebuild_tag($token); |
$result = &Apache::edit::rebuild_tag($token); |
$result.=&Apache::edit::handle_insert(); |
|
} |
} |
} |
} |
return $result; |
return $result; |
Line 368 sub get_label_width {
|
Line 377 sub get_label_width {
|
|
|
|
|
} |
} |
|
|
|
sub get_label_height { |
|
my $label = shift; |
|
&Apache::lonxml::debug("image label = $label"); |
|
if (-e $label) { |
|
&Apache::lonxml::debug("$label exists"); |
|
} else { |
|
&Apache::lonxml::debug("$label does not exist"); |
|
} |
|
my $magick = Image::Magick->new; |
|
$magick->Read($label); |
|
my $pixel_height = $magick->Get('height'); |
|
return $pixel_height * $scale_factor; |
|
} |
|
|
sub add_vars { |
sub add_vars { |
my ($name,$order,$label,$labelorder,$value,$image,$safeeval) = @_; |
my ($name,$order,$label,$labelorder,$value,$image,$safeeval) = @_; |
if (!defined($name) || $name eq '') { return; } |
if (!defined($name) || $name eq '') { return; } |
Line 406 sub end_labelgroup {
|
Line 430 sub end_labelgroup {
|
my $i=$Apache::randomlabel::obj_cnt++; |
my $i=$Apache::randomlabel::obj_cnt++; |
if( $type eq 'text') { |
if( $type eq 'text') { |
&add_vars($gname,$_,$label,$idx_arr[$_],$value,'',$safeeval); |
&add_vars($gname,$_,$label,$idx_arr[$_],$value,'',$safeeval); |
$str = join(':',$x,$y,&Apache::lonnet::escape($label)); |
$str = join(':',$x,$y,&escape($label)); |
$args{"cgi.$cgi_id.OBJTYPE"}.='LABEL:'; |
$args{"cgi.$cgi_id.OBJTYPE"}.='LABEL:'; |
} elsif ( $type eq 'image') { |
} elsif ( $type eq 'image') { |
&add_vars($gname,$_, |
&add_vars($gname,$_, |
$Apache::randomlabel::description[$idx_arr[$_]], |
$Apache::randomlabel::description[$idx_arr[$_]], |
$idx_arr[$_],$value,$label,$safeeval); |
$idx_arr[$_],$value,$label,$safeeval); |
$str = join(':',$x,$y,&Apache::lonnet::escape($label)); |
$str = join(':',$x,$y,&escape($label)); |
$args{"cgi.$cgi_id.OBJTYPE"}.='IMAGE:'; |
$args{"cgi.$cgi_id.OBJTYPE"}.='IMAGE:'; |
} else { |
} else { |
&Apache::lonxml::error('Unknown type of label :'.$type.':'); |
&Apache::lonxml::error('Unknown type of label :'.$type.':'); |
Line 435 sub end_labelgroup {
|
Line 459 sub end_labelgroup {
|
for(my $i=0;$i <= $#Apache::randomlabel::label_arr; $i++) { |
for(my $i=0;$i <= $#Apache::randomlabel::label_arr; $i++) { |
my $label = "$Apache::randomlabel::label_arr[ $idx_arr[$i] ]"; |
my $label = "$Apache::randomlabel::label_arr[ $idx_arr[$i] ]"; |
my $x = $Apache::randomlabel::xcoord[$i]; |
my $x = $Apache::randomlabel::xcoord[$i]; |
# FIXME the 3.5 here is the 'height' of the letter in TeX |
my $y = $Apache::randomlabel::ycoord[$i]; |
my $y = $Apache::randomlabel::ycoord[$i]-3.5; |
if ( $type eq 'text' ) { |
|
# FIXME the 3.5 here is the 'height' of the letter in TeX |
|
$y=$y-3.5; |
|
} |
&Apache::lonxml::debug("initially: x= $x y= $y"); |
&Apache::lonxml::debug("initially: x= $x y= $y"); |
my $value = $Apache::randomlabel::value[$i]; |
my $value = $Apache::randomlabel::value[$i]; |
#x latex coordinate |
#x latex coordinate |
Line 445 sub end_labelgroup {
|
Line 472 sub end_labelgroup {
|
#y latex coordinate |
#y latex coordinate |
# my $ratio=($wwidth > 0 ? $wheight/$wwidth : 1 ); |
# my $ratio=($wwidth > 0 ? $wheight/$wwidth : 1 ); |
my $tcY=$height_param-$y*($height_param/$wheight); |
my $tcY=$height_param-$y*($height_param/$wheight); |
|
if ( $type eq 'image') { |
|
my $label_height = &get_label_height($label); |
|
$tcY=$tcY-$label_height; |
|
} |
|
|
&Apache::lonxml::debug("hparam = $height_param wheight = $wheight texy = $tcY"); |
&Apache::lonxml::debug("hparam = $height_param wheight = $wheight texy = $tcY"); |
$tcX=sprintf('%.2f',$tcX); |
$tcX=sprintf('%.2f',$tcX); |
$tcY=sprintf('%.2f',$tcY); |
$tcY=sprintf('%.2f',$tcY); |
Line 455 sub end_labelgroup {
|
Line 487 sub end_labelgroup {
|
} elsif ( $type eq 'image') { |
} elsif ( $type eq 'image') { |
my ($path,$file) = &Apache::londefdef::get_eps_image($label); |
my ($path,$file) = &Apache::londefdef::get_eps_image($label); |
my $image_name = $path.$file; |
my $image_name = $path.$file; |
my $label_width = get_label_width($label); |
# |
|
# Note that spaces in e.. \includegraphics cause problems for Latex |
|
# so they get replaced by _'s by lonprintout/printout and us: |
|
# |
|
my $label_width = &get_label_width($label); |
|
|
$result .= '\includegraphics[width='.$label_width.'mm]{' |
$result .= '\includegraphics[width='.$label_width.'mm]{' |
.$image_name."}}\n"; |
.$image_name."}}\n"; |
Line 503 sub start_location {
|
Line 539 sub start_location {
|
$safeeval,'x','y','value'); |
$safeeval,'x','y','value'); |
if ($constructtag) { |
if ($constructtag) { |
$result = &Apache::edit::rebuild_tag($token); |
$result = &Apache::edit::rebuild_tag($token); |
$result.=&Apache::edit::handle_insert(); |
|
} |
} |
} |
} |
$Apache::lonxml::debug = 0; |
$Apache::lonxml::debug = 0; |
Line 527 sub start_label {
|
Line 562 sub start_label {
|
&Apache::lonxml::startredirection; |
&Apache::lonxml::startredirection; |
} elsif ($target eq 'edit') { |
} elsif ($target eq 'edit') { |
$result.=&Apache::edit::tag_start($target,$token,"$type Label"); |
$result.=&Apache::edit::tag_start($target,$token,"$type Label"); |
my $text=&Apache::lonxml::get_all_text("/label",$parser); |
my $text=&Apache::lonxml::get_all_text("/label",$parser,$style); |
if ($type eq 'image') { |
if ($type eq 'image') { |
$result.=&Apache::edit::end_row(). |
$result.=&Apache::edit::end_row(). |
&Apache::edit::start_spanning_row(); |
&Apache::edit::start_spanning_row(); |