--- loncom/xml/lonplot.pm 2001/12/28 15:49:38 1.21 +++ loncom/xml/lonplot.pm 2001/12/31 17:30:09 1.27 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Dynamic plot # -# $Id: lonplot.pm,v 1.21 2001/12/28 15:49:38 matthew Exp $ +# $Id: lonplot.pm,v 1.27 2001/12/31 17:30:09 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 Matthew +# 12/17 12/18 12/19 12/20 12/21 12/27 12/28 12/30 Matthew package Apache::lonplot; use strict; @@ -263,32 +263,32 @@ my %curve_defaults = my (%plot,%key,%axis,$title,$xlabel,$ylabel,@labels,@curves); sub start_plot { - %plot = undef; %key = undef; %axis = undef; + %plot = (); %key = (); %axis = (); $title = undef; $xlabel = undef; $ylabel = undef; $#labels = -1; $#curves = -1; # 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,'plot'); + my $inside = &Apache::lonxml::get_all_text("/plot",$$parser[-1]); 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); - ##------------------------------------------------------- + } + &Apache::lonxml::newparser($parser,\$inside); + if ($target eq 'web') { &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); + ($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 +296,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')); @@ -333,11 +334,11 @@ 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 - ($token,$parstack,$safeeval,keys %key_defaults); + ($token,$parstack,$safeeval,keys(%key_defaults)); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); $result.= &Apache::edit::handle_insert(); @@ -363,6 +364,10 @@ 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,'Plot Title'); + my $text=&Apache::lonxml::get_all_text("/title",$$parser[-1]); + $result.=''. + &Apache::edit::editfield('',$text,'',20,1); } elsif ($target eq 'modified') { my $text=$$parser[-1]->get_text("/function"); $result.=&Apache::edit::modifiedfield($token); @@ -375,6 +380,7 @@ sub end_title { my $result = ''; if ($target eq 'web') { } elsif ($target eq 'edit') { + $result.=&Apache::edit::tag_end($target,$token); } return $result; } @@ -385,6 +391,10 @@ 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,'Plot Xlabel'); + my $text=&Apache::lonxml::get_all_text("/xlabel",$$parser[-1]); + $result.=''. + &Apache::edit::editfield('',$text,'',20,1); } elsif ($target eq 'modified') { my $text=$$parser[-1]->get_text("/function"); $result.=&Apache::edit::modifiedfield($token); @@ -397,6 +407,7 @@ sub end_xlabel { my $result = ''; if ($target eq 'web') { } elsif ($target eq 'edit') { + $result.=&Apache::edit::tag_end($target,$token); } return $result; } @@ -408,6 +419,10 @@ 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,'Plot Ylabel'); + my $text = &Apache::lonxml::get_all_text("/ylabel",$$parser[-1]); + $result .= ''. + &Apache::edit::editfield('',$text,'',20,1); } elsif ($target eq 'modified') { my $text=$$parser[-1]->get_text("/function"); $result.=&Apache::edit::modifiedfield($token); @@ -420,6 +435,7 @@ sub end_ylabel { my $result = ''; if ($target eq 'web') { } elsif ($target eq 'edit') { + $result.=&Apache::edit::tag_end($target,$token); } return $result; } @@ -439,16 +455,19 @@ 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); } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args - ($token,$parstack,$safeeval,keys %label_defaults); + ($token,$parstack,$safeeval,keys(%label_defaults)); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); $result.= &Apache::edit::handle_insert(); } - my $text=$$parser[-1]->get_text("/function"); + my $text=$$parser[-1]->get_text("/label"); $result.=&Apache::edit::modifiedfield($token); } return $result; @@ -468,19 +487,19 @@ 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 - ($token,$parstack,$safeeval,keys %label_defaults); + ($token,$parstack,$safeeval,keys(%label_defaults)); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); $result.= &Apache::edit::handle_insert(); @@ -492,9 +511,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); } @@ -513,11 +532,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); - my $text=&Apache::lonxml::get_all_text("/function",$$parser[-1]); - $result.=''. - &Apache::edit::editfield('',$text,'',20,1). - &Apache::edit::end_table(); + $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); } elsif ($target eq 'modified') { # Why do I do this? my $text=$$parser[-1]->get_text("/function"); @@ -531,6 +549,7 @@ sub end_function { my $result = ''; if ($target eq 'web') { } elsif ($target eq 'edit') { + $result .= &Apache::edit::end_table(); } return $result; } @@ -575,6 +594,10 @@ sub start_data { } push @{$curves[-1]->{'data'}},\@data; } elsif ($target eq 'edit') { + $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); } elsif ($target eq 'modified') { my $text=$$parser[-1]->get_text("/data"); $result.=&Apache::edit::modifiedfield($token); @@ -587,6 +610,7 @@ sub end_data { my $result = ''; if ($target eq 'web') { } elsif ($target eq 'edit') { + $result .= &Apache::edit::end_table(); } return $result; } @@ -599,7 +623,7 @@ 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') { } @@ -614,7 +638,7 @@ sub end_axis { $result.=&Apache::edit::tag_end($target,$token); } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args - ($token,$parstack,$safeeval,keys %axis_defaults); + ($token,$parstack,$safeeval,keys(%axis_defaults)); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); $result.= &Apache::edit::handle_insert(); @@ -633,7 +657,7 @@ sub end_axis { sub set_defaults { my ($var,$defaults) = @_; my $key; - foreach $key (keys %$defaults) { + foreach $key (keys(%$defaults)) { $var->{$key} = $defaults->{$key}->{'default'}; } } @@ -641,7 +665,7 @@ sub set_defaults { ##------------------------------------------------------------------- misc sub get_attributes{ my ($values,$defaults,$parstack,$safeeval,$tag) = @_; - foreach my $attr (keys %{$defaults}) { + foreach my $attr (keys(%{$defaults})) { $values->{$attr} = &Apache::lonxml::get_param($attr,$parstack,$safeeval); if ($values->{$attr} eq '' | !defined($values->{$attr})) { @@ -688,12 +712,12 @@ sub write_gnuplot_file { $gnuplot_input .= "set title \"$title\"\n" if (defined($title)) ; $gnuplot_input .= "set xlabel \"$xlabel\"\n" if (defined($xlabel)); $gnuplot_input .= "set ylabel \"$ylabel\"\n" if (defined($ylabel)); - if (defined(%axis)) { + if (%axis) { $gnuplot_input .= "set xrange \[$axis{'xmin'}:$axis{'xmax'}\]\n"; $gnuplot_input .= "set yrange \[$axis{'ymin'}:$axis{'ymax'}\]\n"; } # Key - if (defined(%key)) { + if (%key) { $gnuplot_input .= 'set key '.$key{'pos'}.' '; if ($key{'title'} ne '') { $gnuplot_input .= 'title "'.$key{'title'}.'" '; @@ -743,9 +767,9 @@ sub write_gnuplot_file { sub check_inputs { ## Note: no inputs, no outputs - this acts only on global variables. ## Make sure we have all the input we need: - if (! defined(%plot )) { &set_defaults(\%plot,\%plot_defaults); } - if (! defined(%key )) {} # No key for this plot, thats okay - if (! defined(%axis )) { &set_defaults(\%axis,\%axis_defaults); } + if (! %plot) { &set_defaults(\%plot,\%plot_defaults); } + if (! %key ) {} # No key for this plot, thats okay + if (! %axis) { &set_defaults(\%axis,\%axis_defaults); } if (! defined($title )) {} # No title for this plot, thats okay if (! defined($xlabel)) {} # No xlabel for this plot, thats okay if (! defined($ylabel)) {} # No ylabel for this plot, thats okay @@ -767,7 +791,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'}, @@ -780,6 +804,7 @@ sub edit_attributes { $defaults->{$attr}->{'choices'}, $token); } + $result .= '
'; } return $result; } @@ -797,7 +822,7 @@ sub insert_plot { # plot attributes $result .= '{'default'}. + $result .= ' '.$attr.'="'.$plot_defaults{$attr}->{'default'}. "\"\n"; } $result .= ">\n"; @@ -820,7 +845,7 @@ sub insert_key { my $result; $result .= ' {'default'}. + $result .= ' '.$attr.'="'.$key_defaults{$attr}->{'default'}. "\"\n"; } $result .= " />\n"; @@ -831,7 +856,7 @@ sub insert_axis{ my $result; $result .= ' {'default'}. + $result .= ' '.$attr.'="'.$axis_defaults{$attr}->{'default'}. "\"\n"; } $result .= " />\n"; @@ -842,7 +867,7 @@ sub insert_label { my $result; $result .= '