--- loncom/xml/lonplot.pm 2001/12/19 22:14:20 1.9
+++ loncom/xml/lonplot.pm 2001/12/20 19:20:43 1.10
@@ -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.10 2001/12/20 19:20:43 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -26,17 +26,44 @@
# 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
##
@@ -47,41 +74,40 @@ my $onoff_test = sub {$_[0]=~/^(on|o
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]=~/^(\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 },
@@ -90,9 +116,9 @@ my %axis_defaults =
my %curve_defaults =
(
- color => {default => 'x000000', test => $color_test },
+ color => {default => 'x000000', test => $color_test },
name => {default => 'x000000', test => sub {$_[0]=~/^[\w ]*$/} },
- linestyle => {default => 'lines', test => $linestyle_test }
+ 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 = '{'text'} = &Apache::lonxml::get_all_text("/label",$$parser[-1]); + &get_attributes(\%label,\%label_defaults,$parstack,$safeeval,$tagstack); + $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 +281,8 @@ 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); + push (@curves,\%curve); &Apache::lonxml::register('Apache::lonplot',('function','data')); push (@Apache::lonxml::namespace,'curve'); if ($target eq 'web') { @@ -272,9 +305,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