--- loncom/xml/lonplot.pm 2001/12/28 21:09:57 1.24 +++ 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.24 2001/12/28 21:09:57 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'] } ); @@ -269,26 +288,24 @@ sub start_plot { # my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; + &Apache::lonxml::register('Apache::lonplot', + ('title','xlabel','ylabel','key','axis','label','curve')); + push (@Apache::lonxml::namespace,'lonplot'); if ($target eq 'web') { - &Apache::lonxml::register('Apache::lonplot', - ('title','xlabel','ylabel','key','axis','label','curve')); - push (@Apache::lonxml::namespace,'plot'); - ## Always evaluate the insides of the tags my $inside = &Apache::lonxml::get_all_text("/plot",$$parser[-1]); $inside=&Apache::run::evaluate($inside,$safeeval,$$parstack[-1]); &Apache::lonxml::newparser($parser,\$inside); - ##------------------------------------------------------- &get_attributes(\%plot,\%plot_defaults,$parstack,$safeeval, $tagstack->[-1]); } elsif ($target eq 'edit') { - $result .= &Apache::edit::tag_start($target,$token); + $result .= &Apache::edit::tag_start($target,$token,'Plot'); $result .= &edit_attributes($target,$token,\%plot_defaults); } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args ($token,$parstack,$safeeval,keys(%plot_defaults)); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); - $result.= &Apache::edit::handle_insert(); +# $result.= &Apache::edit::handle_insert(); } } return $result; @@ -296,6 +313,7 @@ sub start_plot { sub end_plot { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + pop @Apache::lonxml::namespace; &Apache::lonxml::deregister('Apache::lonplot', ('title','xlabel','ylabel','key','axis','label','curve')); @@ -306,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(); @@ -333,7 +351,7 @@ sub start_key { &get_attributes(\%key,\%key_defaults,$parstack,$safeeval, $tagstack->[-1]); } elsif ($target eq 'edit') { - $result .= &Apache::edit::tag_start($target,$token); + $result .= &Apache::edit::tag_start($target,$token,'Plot Key'); $result .= &edit_attributes($target,$token,\%key_defaults); } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args @@ -363,13 +381,12 @@ sub start_title { if ($target eq 'web') { $title = &Apache::lonxml::get_all_text("/title",$$parser[-1]); } elsif ($target eq 'edit') { - $result.=&Apache::edit::tag_start($target,$token); + $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; @@ -380,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; } @@ -390,13 +408,12 @@ sub start_xlabel { if ($target eq 'web') { $xlabel = &Apache::lonxml::get_all_text("/xlabel",$$parser[-1]); } elsif ($target eq 'edit') { - $result.=&Apache::edit::tag_start($target,$token); + $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; @@ -407,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; } @@ -418,13 +436,12 @@ sub start_ylabel { if ($target eq 'web') { $ylabel = &Apache::lonxml::get_all_text("/ylabel",$$parser[-1]); } elsif ($target eq 'edit') { - $result .= &Apache::edit::tag_start($target,$token); + $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; @@ -435,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; } @@ -454,12 +472,11 @@ sub start_label { } push(@labels,\%label); } elsif ($target eq 'edit') { - $result .= &Apache::edit::tag_start($target,$token); + $result .= &Apache::edit::tag_start($target,$token,'Plot 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)); @@ -487,15 +504,15 @@ sub end_label { sub start_curve { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; + &Apache::lonxml::register('Apache::lonplot',('function','data')); + push (@Apache::lonxml::namespace,'curve'); if ($target eq 'web') { my %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'); } elsif ($target eq 'edit') { - $result .= &Apache::edit::tag_start($target,$token); + $result .= &Apache::edit::tag_start($target,$token,'Curve'); $result .= &edit_attributes($target,$token,\%curve_defaults); } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args @@ -511,9 +528,9 @@ sub start_curve { sub end_curve { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result = ''; + pop @Apache::lonxml::namespace; + &Apache::lonxml::deregister('Apache::lonplot',('function','data')); if ($target eq 'web') { - pop @Apache::lonxml::namespace; - &Apache::lonxml::deregister('Apache::lonplot',('function','data')); } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_end($target,$token); } @@ -532,12 +549,10 @@ sub start_function { $curves[-1]->{'function'} = &Apache::lonxml::get_all_text("/function",$$parser[-1]); } elsif ($target eq 'edit') { - $result .= &Apache::edit::tag_start($target,$token); + $result .= &Apache::edit::tag_start($target,$token,'Curve Function'); my $text = &Apache::lonxml::get_all_text("/function",$$parser[-1]); $result .= ''. - &Apache::edit::editfield('',$text,'',20,1). - &Apache::edit::end_table(); - + &Apache::edit::editfield('',$text,'',20,1); } elsif ($target eq 'modified') { # Why do I do this? my $text=$$parser[-1]->get_text("/function"); @@ -551,6 +566,7 @@ sub end_function { my $result = ''; if ($target eq 'web') { } elsif ($target eq 'edit') { + $result .= &Apache::edit::end_table(); } return $result; } @@ -595,11 +611,10 @@ sub start_data { } push @{$curves[-1]->{'data'}},\@data; } elsif ($target eq 'edit') { - $result .= &Apache::edit::tag_start($target,$token); + $result .= &Apache::edit::tag_start($target,$token,'Curve Data'); my $text = &Apache::lonxml::get_all_text("/data",$$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("/data"); $result.=&Apache::edit::modifiedfield($token); @@ -612,6 +627,7 @@ sub end_data { my $result = ''; if ($target eq 'web') { } elsif ($target eq 'edit') { + $result .= &Apache::edit::end_table(); } return $result; } @@ -624,9 +640,15 @@ sub start_axis { &get_attributes(\%axis,\%axis_defaults,$parstack,$safeeval, $tagstack->[-1]); } elsif ($target eq 'edit') { - $result .= &Apache::edit::tag_start($target,$token); + $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; } @@ -792,7 +808,7 @@ sub check_inputs { sub edit_attributes { my ($target,$token,$defaults) = @_; my $result; - foreach my $attr (%$defaults) { + foreach my $attr (sort keys(%$defaults)) { if ($defaults->{$attr}->{'edit_type'} eq 'entry') { $result .= &Apache::edit::text_arg( $defaults->{$attr}->{'description'}, @@ -805,6 +821,7 @@ sub edit_attributes { $defaults->{$attr}->{'choices'}, $token); } + $result .= '
'; } return $result; } @@ -818,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; @@ -843,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; @@ -856,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 .= '