--- loncom/xml/lonplot.pm 2001/12/19 22:14:20 1.9
+++ loncom/xml/lonplot.pm 2001/12/20 20:24:36 1.11
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Dynamic plot
#
-# $Id: lonplot.pm,v 1.9 2001/12/19 22:14:20 matthew Exp $
+# $Id: lonplot.pm,v 1.11 2001/12/20 20:24:36 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -26,73 +26,99 @@
# http://www.lon-capa.org/
#
# 12/15/01 Matthew
-# 12/18 Matthew
+# 12/18 12/19 12/20 Matthew
package Apache::lonplot;
+
use strict;
+use Apache::File;
use Apache::response;
use Apache::lonxml;
+
use Digest::MD5 qw(md5 md5_hex md5_base64);
sub BEGIN {
&Apache::lonxml::register('Apache::lonplot',('plot'));
}
+##
+## Description of data structures:
+##
+## %plot %key %axis
+## --------------------------
+## height title color
+## width box xmin
+## bgcolor pos xmax
+## fgcolor ymin
+## transparent ymax
+## grid
+## border
+## font
+##
+## @labels: $labels[$i] = \%label
+## %label: text, xpos, ypos, justify
+##
+## @curves: $curves[$i] = \%curve
+## %curve: name, linestyle, ( function | data )
+##
+## $curves[$i]->{'data'} = [ [x1,x2,x3,x4],
+## [y1,y2,y3,y4] ]
+##
+##------------------------------------------------------------
##
## Tests used in checking the validitity of input
##
-my $int_test = sub {$_[0]=~/^\d+$/};
-my $real_test = sub {$_[0]=~/^[+-]?\d*\.?\d*$/};
-my $color_test = sub {$_[0]=~/^x[\da-f]{6}$/};
+my $int_test = sub {$_[0]=~s/\s+//g;$_[0]=~/^\d+$/};
+my $real_test = sub {$_[0]=~s/\s+//g;$_[0]=~/^[+-]?\d*\.?\d*$/};
+my $color_test = sub {$_[0]=~s/\s+//g;$_[0]=~/^x[\da-f]{6}$/};
my $onoff_test = sub {$_[0]=~/^(on|off)$/};
my $key_pos_test = sub {$_[0]=~/^(top|bottom|right|left|outside|below)+$/};
my $sml_test = sub {$_[0]=~/^(small|medium|large)$/};
my $linestyle_test = sub {$_[0]=~/^(lines|linespoints|dots|points|steps)$/};
-my $words_test = sub {$_[0]=~/^((\w+\b*)+$/};
+my $words_test = sub {$_[0]=~s/\s+/ /g;$_[0]=~/^(\w+ ?)+$/};
##
## Default values for attributes of elements
##
my %plot_defaults =
(
- height => {default => 200, test => $int_test },
- width => {default => 200, test => $int_test },
- bgcolor => {default => 'xffffff', test => $color_test},
- fgcolor => {default => 'x000000', test => $color_test},
- transparent => {default => 'off', test => $onoff_test},
- grid => {default => 'off', test => $onoff_test},
- border => {default => 'on', test => $onoff_test},
- font => {default => 'medium', test => $sml_test }
+ height => {default => 200, test => $int_test },
+ width => {default => 200, test => $int_test },
+ bgcolor => {default => 'xffffff', test => $color_test },
+ fgcolor => {default => 'x000000', test => $color_test },
+ transparent => {default => 'off', test => $onoff_test },
+ grid => {default => 'off', test => $onoff_test },
+ border => {default => 'on', test => $onoff_test },
+ font => {default => 'medium', test => $sml_test }
);
my %key_defaults =
(
- title => { default => '', test => $words_test },
- box => { default => 'off', test => $onoff_test },
- pos => { default => 'top right', test => $key_pos_test}
+ title => { default => '', test => $words_test },
+ box => { default => 'off', test => $onoff_test },
+ pos => { default => 'top right', test => $key_pos_test }
);
my %label_defaults =
(
- xpos => {default => 0, test => $real_test },
- ypos => {default => 0, test => $real_test },
+ xpos => {default => 0, test => $real_test },
+ ypos => {default => 0, test => $real_test },
justify => {default => 'left',
- test => sub {$_[0]=~/^(left|right|center)$/}}
+ test => sub {$_[0]=~/^(left|right|center)$/} }
);
my %axis_defaults =
(
color => {default => 'x000000', test => $color_test},
-# thickness => {default => 1, test => $int_test },
- xmin => {default => -10.0, test => $real_test },
- xmax => {default => 10.0, test => $real_test },
- ymin => {default => -10.0, test => $real_test },
- ymax => {default => 10.0, test => $real_test }
+ xmin => {default => '-10.0', test => $real_test },
+ xmax => {default => ' 10.0', test => $real_test },
+ ymin => {default => '-10.0', test => $real_test },
+ ymax => {default => ' 10.0', test => $real_test }
);
my %curve_defaults =
(
- color => {default => 'x000000', test => $color_test },
- name => {default => 'x000000', test => sub {$_[0]=~/^[\w ]*$/} },
- linestyle => {default => 'lines', test => $linestyle_test }
+ color => {default => 'x000000', test => $color_test },
+ name => {default => 'x000000', test => sub {1} },#sub {$_[0]=~/^[\w ]*$/} },
+ linestyle => {default => 'lines', test => $linestyle_test }
);
##
@@ -101,13 +127,13 @@ my %curve_defaults =
my (%plot,%key,%axis,$title,$xlabel,$ylabel,@labels,@curves);
sub start_plot {
- %plot = ''; %key=''; %axis='';
- $title=''; $xlabel=''; $ylabel='';
- @labels = ''; @curves='';
+ %plot = undef; %key = undef; %axis = undef;
+ $title = undef; $xlabel = undef; $ylabel = undef;
+ $#labels = -1; $#curves = -1;
#
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
my $result='';
- &Apache::lonxml::register('Apache::plot',
+ &Apache::lonxml::register('Apache::lonplot',
('title','xlabel','ylabel','key','axis','label','curve'));
push (@Apache::lonxml::namespace,'plot');
## Always evaluate the insides of the
'; + $result .= &write_gnuplot_file($fh); + $result .= ''.$/; ## return image tag for the plot - $result = ''; } return $result; } @@ -148,7 +177,8 @@ sub end_plot { sub start_key { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; - &get_attributes(\%key,\%key_defaults,$parstack,$safeeval,$tagstack); + &get_attributes(\%key,\%key_defaults,$parstack,$safeeval, + $tagstack->[-1]); if ($target eq 'web') { # This routine should never return anything. } @@ -225,8 +255,13 @@ sub start_label { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; my %label; - &get_attributes($label,\%label_defaults,$parstack,$safeeval,$tagstack); - $label->{'text'} = &Apache::lonxml::get_all_text("/label",$$parser[-1]); + &get_attributes(\%label,\%label_defaults,$parstack,$safeeval, + $tagstack->[-1]); + $label{'text'} = &Apache::lonxml::get_all_text("/label",$$parser[-1]); + if (! &$words_test($label{'text'})) { + # I should probably warn about it, too. + $label{'text'} = 'Illegal text'; + } push(@labels,\%label); if ($target eq 'web') { # This routine should never return anything. @@ -248,8 +283,9 @@ sub start_curve { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; my %curve; - &get_attributes($curve,\%curve_defaults,$parstack,$safeeval,$tagstack); - push (@curves,$curve); + &get_attributes(\%curve,\%curve_defaults,$parstack,$safeeval, + $tagstack->[-1]); + push (@curves,\%curve); &Apache::lonxml::register('Apache::lonplot',('function','data')); push (@Apache::lonxml::namespace,'curve'); if ($target eq 'web') { @@ -272,9 +308,9 @@ sub end_curve { sub start_function { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; - if (exists($curves[-1]->{'data'}) { + if (exists($curves[-1]->{'data'})) { &Apache::lonxml::warning('Use of