--- loncom/xml/lonplot.pm 2001/12/31 16:19:55 1.26 +++ loncom/xml/lonplot.pm 2002/01/01 19:34:25 1.29 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Dynamic plot # -# $Id: lonplot.pm,v 1.26 2001/12/31 16:19:55 matthew Exp $ +# $Id: lonplot.pm,v 1.29 2002/01/01 19:34:25 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -26,7 +26,7 @@ # http://www.lon-capa.org/ # # 12/15/01 Matthew -# 12/17 12/18 12/19 12/20 12/21 12/27 12/28 Matthew +# 12/17 12/18 12/19 12/20 12/21 12/27 12/28 12/30 Matthew package Apache::lonplot; use strict; @@ -69,6 +69,28 @@ sub BEGIN { ## Tests used in checking the validitity of input ## ## ## ################################################################### + +my %linestyles = + ( + lines => 2, # Maybe this will be used in the future + linespoints => 2, # to check on whether or not they have + dots => 2, # supplied enough fields + points => 2, # to use the given line style. But for + steps => 2, # now there are more important things + fsteps => 2, # for me to deal with. + histeps => 2, + errorbars => 2, + xerrorbars => 2, + yerrorbars => 2, + xyerrorbars => 2, + boxes => 2, + boxerrorbars => 2, + boxxyerrorbars => 2, + financebars => 2, + candlesticks => 2, + vector => 2 + ); + my $int_test = sub {$_[0]=~s/\s+//g;$_[0]=~/^\d+$/}; my $real_test = sub {$_[0]=~s/\s+//g;$_[0]=~/^[+-]?\d*\.?\d*([eE][+-]\d+)?$/}; @@ -76,7 +98,7 @@ my $color_test = sub {$_[0]=~s/\s+// 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 $linestyle_test = sub {exists($linestyles{$_[0]})}; my $words_test = sub {$_[0]=~s/\s+/ /g;$_[0]=~/^([\w\(\)]+ ?)+$/}; ################################################################### @@ -89,13 +111,13 @@ my %plot_defaults = height => { default => 200, test => $int_test, - description => 'vertical size of image (pixels)', + description => 'height of image (pixels)', edit_type => 'entry' }, width => { default => 200, test => $int_test, - description => 'horizontal size of image (pixels)', + description => 'width of image (pixels)', edit_type => 'entry' }, bgcolor => { @@ -193,7 +215,7 @@ my %label_defaults = my %axis_defaults = ( - color => { + color => { default => 'x000000', test => $color_test, description => 'color of axes (x000000)', @@ -222,13 +244,6 @@ my %axis_defaults = test => $real_test, description => 'maximum y-value shown in plot', edit_type => 'entry' - }, - linestyle => { - default => 'points', - test => $linestyle_test, - description => 'Style of the axis lines', - edit_type => 'choice', - choices => ['lines','linespoints','dots','points'] } ); @@ -251,7 +266,11 @@ my %curve_defaults = test => $linestyle_test, description => 'Style of the axis lines', edit_type => 'choice', - choices => ['lines','linespoints','dots','points','steps'] + choices => ['lines','linespoints','dots','points','steps', + 'fsteps','histeps','errorbars','xerrorbars', + 'yerrorbars','xyerrorbars','boxes','boxerrorbars', + 'boxxyerrorbars','financebars','candlesticks', + 'vector'] } ); @@ -271,13 +290,11 @@ sub start_plot { my $result=''; &Apache::lonxml::register('Apache::lonplot', ('title','xlabel','ylabel','key','axis','label','curve')); - push (@Apache::lonxml::namespace,'plot'); - my $inside = &Apache::lonxml::get_all_text("/plot",$$parser[-1]); + push (@Apache::lonxml::namespace,'lonplot'); if ($target eq 'web') { + my $inside = &Apache::lonxml::get_all_text("/plot",$$parser[-1]); $inside=&Apache::run::evaluate($inside,$safeeval,$$parstack[-1]); - } - &Apache::lonxml::newparser($parser,\$inside); - if ($target eq 'web') { + &Apache::lonxml::newparser($parser,\$inside); &get_attributes(\%plot,\%plot_defaults,$parstack,$safeeval, $tagstack->[-1]); } elsif ($target eq 'edit') { @@ -307,7 +324,7 @@ sub end_plot { ## Determine filename my $tmpdir = '/home/httpd/perl/tmp/'; my $filename = $ENV{'user.name'}.'_'.$ENV{'user.domain'}. - '_'.time.'_'.$$.'_plot.data'; + '_'.time.'_'.$$.int(rand(1000)).'_plot.data'; ## Write the plot description to the file my $fh=Apache::File->new(">$tmpdir$filename"); print $fh &write_gnuplot_file(); @@ -367,10 +384,9 @@ sub start_title { $result.=&Apache::edit::tag_start($target,$token,'Plot Title'); my $text=&Apache::lonxml::get_all_text("/title",$$parser[-1]); $result.=''. - &Apache::edit::editfield('',$text,'',20,1). - &Apache::edit::end_table(); + &Apache::edit::editfield('',$text,'',20,1); } elsif ($target eq 'modified') { - my $text=$$parser[-1]->get_text("/function"); + my $text=$$parser[-1]->get_text("/title"); $result.=&Apache::edit::modifiedfield($token); } return $result; @@ -381,6 +397,7 @@ sub end_title { my $result = ''; if ($target eq 'web') { } elsif ($target eq 'edit') { + $result.=&Apache::edit::tag_end($target,$token); } return $result; } @@ -394,10 +411,9 @@ sub start_xlabel { $result.=&Apache::edit::tag_start($target,$token,'Plot Xlabel'); my $text=&Apache::lonxml::get_all_text("/xlabel",$$parser[-1]); $result.=''. - &Apache::edit::editfield('',$text,'',20,1). - &Apache::edit::end_table(); + &Apache::edit::editfield('',$text,'',20,1); } elsif ($target eq 'modified') { - my $text=$$parser[-1]->get_text("/function"); + my $text=$$parser[-1]->get_text("/xlabel"); $result.=&Apache::edit::modifiedfield($token); } return $result; @@ -408,6 +424,7 @@ sub end_xlabel { my $result = ''; if ($target eq 'web') { } elsif ($target eq 'edit') { + $result.=&Apache::edit::tag_end($target,$token); } return $result; } @@ -422,10 +439,9 @@ sub start_ylabel { $result .= &Apache::edit::tag_start($target,$token,'Plot Ylabel'); my $text = &Apache::lonxml::get_all_text("/ylabel",$$parser[-1]); $result .= ''. - &Apache::edit::editfield('',$text,'',20,1). - &Apache::edit::end_table(); + &Apache::edit::editfield('',$text,'',20,1); } elsif ($target eq 'modified') { - my $text=$$parser[-1]->get_text("/function"); + my $text=$$parser[-1]->get_text("/ylabel"); $result.=&Apache::edit::modifiedfield($token); } return $result; @@ -436,6 +452,7 @@ sub end_ylabel { my $result = ''; if ($target eq 'web') { } elsif ($target eq 'edit') { + $result.=&Apache::edit::tag_end($target,$token); } return $result; } @@ -459,8 +476,7 @@ sub start_label { $result .= &edit_attributes($target,$token,\%label_defaults); my $text = &Apache::lonxml::get_all_text("/label",$$parser[-1]); $result .= ''. - &Apache::edit::editfield('',$text,'',20,1). - &Apache::edit::end_table(); + &Apache::edit::editfield('',$text,'',20,1); } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args ($token,$parstack,$safeeval,keys(%label_defaults)); @@ -627,6 +643,12 @@ sub start_axis { $result .= &Apache::edit::tag_start($target,$token,'Plot Axes'); $result .= &edit_attributes($target,$token,\%axis_defaults); } elsif ($target eq 'modified') { + my $constructtag=&Apache::edit::get_new_args + ($token,$parstack,$safeeval,keys(%axis_defaults)); + if ($constructtag) { + $result = &Apache::edit::rebuild_tag($token); + $result.= &Apache::edit::handle_insert(); + } } return $result; } @@ -638,12 +660,6 @@ sub end_axis { } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_end($target,$token); } elsif ($target eq 'modified') { - my $constructtag=&Apache::edit::get_new_args - ($token,$parstack,$safeeval,keys(%axis_defaults)); - if ($constructtag) { - $result = &Apache::edit::rebuild_tag($token); - $result.= &Apache::edit::handle_insert(); - } } return $result; } @@ -819,24 +835,20 @@ sub edit_attributes { #------------------------------------------------ insert_xxxxxxx sub insert_plot { - my $result; + my $result = ''; # plot attributes - $result .= '{'default'}. - "\"\n"; + $result .= " $attr=\"$plot_defaults{$attr}->{'default'}\"\n"; } $result .= ">\n"; # Add the components $result .= &insert_key(); $result .= &insert_axis(); - $result .= &insert_label(); + $result .= &insert_title(); + $result .= &insert_xlabel(); + $result .= &insert_ylabel(); $result .= &insert_curve(); - $result .= &insert_function(); - $result .= "\n"; - $result .= &insert_curve(); - $result .= &insert_data(); - $result .= "\n"; # close up the $result .= "\n"; return $result; @@ -844,10 +856,9 @@ sub insert_plot { sub insert_key { my $result; - $result .= ' {'default'}. - "\"\n"; + $result .= " $attr=\"$key_defaults{$attr}->{'default'}\"\n"; } $result .= " />\n"; return $result; @@ -857,18 +868,21 @@ sub insert_axis{ my $result; $result .= ' {'default'}. - "\"\n"; + $result .= " $attr=\"$axis_defaults{$attr}->{'default'}\"\n"; } $result .= " />\n"; return $result; } +sub insert_title { return " \n"; } +sub insert_xlabel { return " \n"; } +sub insert_ylabel { return " \n"; } + sub insert_label { my $result; $result .= '