--- loncom/xml/lonplot.pm 2002/02/28 21:04:10 1.53
+++ loncom/xml/lonplot.pm 2002/03/22 13:45:59 1.58
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Dynamic plot
#
-# $Id: lonplot.pm,v 1.53 2002/02/28 21:04:10 matthew Exp $
+# $Id: lonplot.pm,v 1.58 2002/03/22 13:45:59 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -144,6 +144,8 @@ A gnuplot tag can contain the fol
Allows specification of the x and y coordinate 'tics' on the axes.
This is mostly used to adjust the grid lines when a grid is displayed.
+If you are having trouble with your plot, please read the help
+available on Plot Curve.
ENDPLOTHELP
my %gnuplot_defaults =
@@ -360,8 +362,8 @@ first tag will be the X data and the sec
Curve Function
The function tag allows you to specify the curve to be
-plotted as a formula that gnuplot can understand. Be careful using this
-tag - it is surprisingly easy to give gnuplot a function it cannot deal
+plotted as a formula that gnuplot can understand. Be careful using this
+tag. It is surprisingly easy to give gnuplot a function it cannot deal
with properly. Be explicit: 2*sin(2*3.141592*x/4) will work but
2sin(2*3.141592x/4) will not. If you do not receive any errors in the
gnuplot data but still do not have an image produced, it is likely there
@@ -414,9 +416,6 @@ sub start_gnuplot {
'xtics','ytics'));
push (@Apache::lonxml::namespace,'lonplot');
if ($target eq 'web' || $target eq 'tex') {
- my $inside = &Apache::lonxml::get_all_text("/gnuplot",$$parser[-1]);
- $inside=&Apache::run::evaluate($inside,$safeeval,$$parstack[-1]);
- &Apache::lonxml::newparser($parser,\$inside);
&get_attributes(\%plot,\%gnuplot_defaults,$parstack,$safeeval,
$tagstack->[-1]);
} elsif ($target eq 'edit') {
@@ -441,15 +440,24 @@ sub end_gnuplot {
&Apache::lonxml::deregister('Apache::lonplot',
('title','xlabel','ylabel','key','axis','label','curve'));
my $result = '';
+ my $randnumber;
+ # need to call rand everytime start_script would evaluate, as the
+ # safe space rand number generator and the global rand generator
+ # are not seperate
+ if ($target eq 'web' || $target eq 'tex' || $target eq 'grade' ||
+ $target eq 'answer') {
+ $randnumber=int(rand(1000));
+ }
if ($target eq 'web' || $target eq 'tex') {
&check_inputs(); # Make sure we have all the data we need
##
## Determine filename
my $tmpdir = '/home/httpd/perl/tmp/';
my $filename = $ENV{'user.name'}.'_'.$ENV{'user.domain'}.
- '_'.time.'_'.$$.int(rand(1000)).'_plot.data';
+ '_'.time.'_'.$$.$randnumber.'_plot.data';
## Write the plot description to the file
&write_gnuplot_file($tmpdir,$filename,$target);
+ $filename = &Apache::lonnet::escape($filename);
## return image tag for the plot
if ($target eq 'web') {
$result .= <<"ENDIMAGE";
@@ -570,6 +578,7 @@ sub start_title {
my $result='';
if ($target eq 'web' || $target eq 'tex') {
$title = &Apache::lonxml::get_all_text("/title",$$parser[-1]);
+ $title=&Apache::run::evaluate($title,$safeeval,$$parstack[-1]);
$title =~ s/\n/ /g;
if (length($title) > $max_str_len) {
$title = substr($title,0,$max_str_len);
@@ -603,6 +612,7 @@ sub start_xlabel {
my $result='';
if ($target eq 'web' || $target eq 'tex') {
$xlabel = &Apache::lonxml::get_all_text("/xlabel",$$parser[-1]);
+ $xlabel=&Apache::run::evaluate($xlabel,$safeeval,$$parstack[-1]);
$xlabel =~ s/\n/ /g;
if (length($xlabel) > $max_str_len) {
$xlabel = substr($xlabel,0,$max_str_len);
@@ -637,6 +647,7 @@ sub start_ylabel {
my $result='';
if ($target eq 'web' || $target eq 'tex') {
$ylabel = &Apache::lonxml::get_all_text("/ylabel",$$parser[-1]);
+ $ylabel = &Apache::run::evaluate($ylabel,$safeeval,$$parstack[-1]);
$ylabel =~ s/\n/ /g;
if (length($ylabel) > $max_str_len) {
$ylabel = substr($ylabel,0,$max_str_len);
@@ -674,6 +685,7 @@ sub start_label {
&get_attributes(\%label,\%label_defaults,$parstack,$safeeval,
$tagstack->[-1]);
my $text = &Apache::lonxml::get_all_text("/label",$$parser[-1]);
+ $text = &Apache::run::evaluate($text,$safeeval,$$parstack[-1]);
$text =~ s/\n/ /g;
$text = substr($text,0,$max_str_len) if (length($text) > $max_str_len);
$label{'text'} = $text;
@@ -752,8 +764,9 @@ sub start_function {
&Apache::lonxml::warning('Use of precludes use of . The will be omitted in favor of the declaration.');
delete $curves[-1]->{'data'} ;
}
- $curves[-1]->{'function'} =
- &Apache::lonxml::get_all_text("/function",$$parser[-1]);
+ my $function = &Apache::lonxml::get_all_text("/function",$$parser[-1]);
+ $function = &Apache::run::evaluate($function,$safeeval,$$parstack[-1]);
+ $curves[-1]->{'function'} = $function;
} elsif ($target eq 'edit') {
$result .= &Apache::edit::tag_start($target,$token,'Gnuplot compatible curve function');
my $text = &Apache::lonxml::get_all_text("/function",$$parser[-1]);
@@ -790,6 +803,7 @@ sub start_data {
delete($curves[-1]->{'function'});
}
my $datatext = &Apache::lonxml::get_all_text("/data",$$parser[-1]);
+ $datatext=&Apache::run::evaluate($datatext,$safeeval,$$parstack[-1]);
# Deal with cases where we're given an array...
if ($datatext =~ /^\@/) {
$datatext = &Apache::run::run('return "'.$datatext.'"',