Annotation of loncom/xml/lonplot.pm, revision 1.1
1.1 ! matthew 1: # The LearningOnline Network with CAPA
! 2: # Dynamic plot
! 3: #
! 4: # $Id$
! 5: #
! 6: # Copyright Michigan State University Board of Trustees
! 7: #
! 8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
! 9: #
! 10: # LON-CAPA is free software; you can redistribute it and/or modify
! 11: # it under the terms of the GNU General Public License as published by
! 12: # the Free Software Foundation; either version 2 of the License, or
! 13: # (at your option) any later version.
! 14: #
! 15: # LON-CAPA is distributed in the hope that it will be useful,
! 16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
! 17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 18: # GNU General Public License for more details.
! 19: #
! 20: # You should have received a copy of the GNU General Public License
! 21: # along with LON-CAPA; if not, write to the Free Software
! 22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
! 23: #
! 24: # /home/httpd/html/adm/gpl.txt
! 25: #
! 26: # http://www.lon-capa.org/
! 27: #
! 28: # 2/21 Guy
! 29: package Apache::lonplot;
! 30: use strict;
! 31: use Apache::response;
! 32:
! 33: sub BEGIN {
! 34: &Apache::lonxml::register('Apache::lonplot',('plot'));
! 35: }
! 36:
! 37:
! 38: ##
! 39: ## Tests used in checking the validitity of input
! 40: ##
! 41: my $int_test = sub {$_[0]=~/^\d+$/};
! 42: my $real_test = sub {$_[0]=~/^[+-]?\d*\.?\d*$/};
! 43: my $color_test = sub {$_[0]=~/^x[\da-f]{6}$/};
! 44: my $onoff_test = sub {$_[0]=~/^(on|off)$/};
! 45: my $key_pos_test = sub {$_[0]=~/^(top|bottom|right|left|outside|below)+$/};
! 46: my $sml_test = sub {$_[0]=~/^(small|medium|large)$/};
! 47: my $linestyle_test = sub {$_[0]=~/^(lines|linespoints|dots|points|steps)$/};
! 48:
! 49: ##
! 50: ## Default values for attributes of elements
! 51: ##
! 52: my %plot_defaults =
! 53: (
! 54: height => {default => 200, test => $int_test },
! 55: width => {default => 200, test => $int_test },
! 56: bgcolor => {default => "xffffff", test => $color_test},
! 57: fgcolor => {default => "x000000", test => $color_test},
! 58: transparent => {default => "off", test => $onoff_test},
! 59: grid => {default => "off", test => $onoff_test},
! 60: border => {default => "on" , test => $onoff_test},
! 61: font => {default => "medium", test => $sml_test }
! 62: );
! 63:
! 64: my %key_defaults =
! 65: (
! 66: title => { default => "on" , test => $onoff_test },
! 67: box => { default => "off" , test => $onoff_test },
! 68: pos => { default => "top right" , test => $key_pos_test}
! 69: );
! 70:
! 71: my %label_defaults =
! 72: (
! 73: xpos => {default => 0, test => $real_test },
! 74: ypos => {default => 0, test => $real_test },
! 75: color => {default => "x000000", test => $color_test },
! 76: justify => {default => "left",
! 77: test => sub {$_[0]=~/^(left|right|center)$/}}
! 78: );
! 79:
! 80: my %axis_defaults =
! 81: (
! 82: color => {default => "x000000", test => $color_test},
! 83: thickness => {default => 1, test => $int_test },
! 84: xmin => {default => -10.0, test => $real_test },
! 85: xmax => {default => 10.0, test => $real_test },
! 86: ymin => {default => -10.0, test => $real_test },
! 87: ymax => {default => 10.0, test => $real_test }
! 88: );
! 89:
! 90: my %curve_defaults =
! 91: (
! 92: color => {default => "x000000", test => $color_test },
! 93: name => {default => "x000000", test => sub {$_[0]=~/^[\w ]*$/} },
! 94: linestyle => {default => "lines", test => $linestyle_test }
! 95: );
! 96:
! 97: ##
! 98: ## End of defaults
! 99: ##
! 100: my (%plot,%key,%axis,$title,$xlabel,$ylabel,@labels,@curves);
! 101:
! 102: sub start_plot {
! 103: %plot = ''; %key=''; %axis='';
! 104: $title=''; $xlabel=''; $ylabel='';
! 105: @labels = ''; @curves='';
! 106: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 107: my $result='';
! 108: #
! 109: &Apache::lonxml::register('Apache::plot',
! 110: ('title','xlabel','ylabel','key','axis','label','curve'));
! 111: push (@Apache::lonxml::namespace,'plot');
! 112: &get_attributes(\%plot,\%plot_defaults,$parstack,$safeeval);
! 113: return '';
! 114: }
! 115:
! 116: sub get_attributes{
! 117: %values = %{$_[0]};
! 118: %defaults = %{$_[1]};
! 119: $parstack = $_[2];
! 120: $safeeval = $_[3];
! 121: my $attr;
! 122: foreach $attr (keys %defaults) {
! 123: $values{$attr} = &Apache::lonxml::get_param($attr,$parstack,$safeeval);
! 124: my $test = $defaults{$attr}->{'test'};
! 125: $values{$attr} = (&$test($values{$attr}) ?
! 126: $values{$attr} :
! 127: $defaults{$attr} );
! 128: }
! 129: return ;
! 130: }
! 131:
! 132: sub end_plot {
! 133: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 134: pop @Apache::lonxml::namespace;
! 135: my $result;
! 136: ## Determine filename
! 137: my $filename =
! 138: ## Write the plot description to the file
! 139: ## return image tag for the plot
! 140: return $result;
! 141: }
! 142: ##----------------------------------------------------------------- key
! 143: sub start_key {
! 144: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 145: my $result='';
! 146: &get_attributes(\%key,\%key_defaults,$parstack,$safeeval);
! 147: return $result;
! 148: }
! 149:
! 150: sub end_key {
! 151: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 152: my $result = '';
! 153: return $result;
! 154: }
! 155: ##------------------------------------------------------------------- title
! 156: sub start_title {
! 157: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 158: $title = &Apache::lonxml::get_all_text("/title",$$parser[-1]);
! 159: my $result='';
! 160: return $result;
! 161: }
! 162:
! 163: sub end_title {
! 164: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 165: my $result = '';
! 166: return $result;
! 167: }
! 168: ##------------------------------------------------------------------- xlabel
! 169: sub start_xlabel {
! 170: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 171: my $result='';
! 172: $xlabel = &Apache::lonxml::get_all_text("/xlabel",$$parser[-1]);
! 173: return $result;
! 174: }
! 175:
! 176: sub end_xlabel {
! 177: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 178: my $result = '';
! 179: return $result;
! 180: }
! 181: ##------------------------------------------------------------------- ylabel
! 182: sub start_ylabel {
! 183: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 184: my $result='';
! 185: $ylabel = &Apache::lonxml::get_all_text("/ylabel",$$parser[-1]);
! 186: return $result;
! 187: }
! 188:
! 189: sub end_ylabel {
! 190: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 191: my $result = '';
! 192: return $result;
! 193: }
! 194: ##------------------------------------------------------------------- label
! 195: sub start_label {
! 196: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 197: my $result='';
! 198: my $label = &newhashref();
! 199: &get_attributes($label,\%label_defaults,$parstack,$safeeval);
! 200: $label->{'text'} = &Apache::lonxml::get_all_text("/label",$$parser[-1]);
! 201: push(@labels,$label);
! 202: return $result;
! 203: }
! 204:
! 205: sub end_label {
! 206: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 207: my $result = '';
! 208: return $result;
! 209: }
! 210:
! 211: ##------------------------------------------------------------------- curve
! 212: sub start_curve {
! 213: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 214: my $result='';
! 215: my $curve = &newhashref();
! 216: &get_attributes($curve,\%curve_defaults,$parstack,$safeeval);
! 217: push (@curves,$curve);
! 218:
! 219: &Apache::lonxml::register('Apache::plot',('function','data'));
! 220: push (@Apache::lonxml::namespace,'curve');
! 221:
! 222: return $result;
! 223: }
! 224:
! 225: sub end_curve {
! 226: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 227: my $result = '';
! 228: return $result;
! 229: }
! 230:
! 231: ##------------------------------------------------------------ curve function
! 232: sub start_function {
! 233: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 234: my $result='';
! 235:
! 236: $curves[-1]->{'function'} =
! 237: &Apache::lonxml::get_all_text("/function",$$parser[-1]);
! 238: return $result;
! 239: }
! 240:
! 241: sub end_function {
! 242: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 243: my $result = '';
! 244: return $result;
! 245: }
! 246:
! 247: ##------------------------------------------------------------ curve data
! 248: sub start_data {
! 249: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 250: my $result='';
! 251: push( @{$curves[-1]->{'data'}},
! 252: &Apache::lonxml::get_all_text("/data",$$parser[-1]));
! 253: return $result;
! 254: }
! 255:
! 256: sub end_data {
! 257: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 258: my $result = '';
! 259: return $result;
! 260: }
! 261:
! 262: ##------------------------------------------------------------------- axis
! 263: sub start_axis {
! 264: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 265: my $result='';
! 266: &get_attributes(\%axis,\%label_defaults,$parstack,$safeeval);
! 267: return $result;
! 268: }
! 269:
! 270: sub end_axis {
! 271: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
! 272: my $result = '';
! 273: return $result;
! 274: }
! 275:
! 276: ##------------------------------------------------------------------- misc
! 277: sub newhashref{
! 278: my %hash;
! 279: return \%hash;
! 280: }
! 281:
! 282:
! 283: 1;
! 284: __END__
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>