--- loncom/xml/lonplot.pm 2001/12/27 22:30:01 1.20 +++ loncom/xml/lonplot.pm 2001/12/28 15:49:38 1.21 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Dynamic plot # -# $Id: lonplot.pm,v 1.20 2001/12/27 22:30:01 matthew Exp $ +# $Id: lonplot.pm,v 1.21 2001/12/28 15:49:38 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -63,10 +63,12 @@ sub BEGIN { ## $curves[$i]->{'data'} = [ [x1,x2,x3,x4], ## [y1,y2,y3,y4] ] ## -##------------------------------------------------------------ -## -## Tests used in checking the validitity of input -## + +################################################################### +## ## +## Tests used in checking the validitity of input ## +## ## +################################################################### my $int_test = sub {$_[0]=~s/\s+//g;$_[0]=~/^\d+$/}; my $real_test = sub {$_[0]=~s/\s+//g;$_[0]=~/^[+-]?\d*\.?\d*([eE][+-]\d+)?$/}; @@ -76,9 +78,12 @@ my $key_pos_test = sub {$_[0]=~/^(top| my $sml_test = sub {$_[0]=~/^(small|medium|large)$/}; my $linestyle_test = sub {$_[0]=~/^(lines|linespoints|dots|points|steps)$/}; my $words_test = sub {$_[0]=~s/\s+/ /g;$_[0]=~/^([\w\(\)]+ ?)+$/}; -## -## Attribute metadata -## + +################################################################### +## ## +## Attribute metadata ## +## ## +################################################################### my %plot_defaults = ( height => { @@ -250,9 +255,11 @@ my %curve_defaults = } ); -## -## End of defaults -## +################################################################### +## ## +## parsing and edit rendering ## +## ## +################################################################### my (%plot,%key,%axis,$title,$xlabel,$ylabel,@labels,@curves); sub start_plot { @@ -274,6 +281,8 @@ sub start_plot { &get_attributes(\%plot,\%plot_defaults,$parstack,$safeeval, $tagstack->[-1]); } elsif ($target eq 'edit') { + $result .= &Apache::edit::tag_start($target,$token); + $result .= &edit_attributes($target,$token,\%plot_defaults); } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args ($token,$parstack,$safeeval,keys %plot_defaults); @@ -282,7 +291,7 @@ sub start_plot { $result.= &Apache::edit::handle_insert(); } } - return ''; + return $result; } sub end_plot { @@ -292,26 +301,7 @@ sub end_plot { ('title','xlabel','ylabel','key','axis','label','curve')); my $result = ''; if ($target eq 'web') { - ## - ## 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 - if (! defined(%axis )) { &set_defaults(\%axis,\%axis_defaults); } - if (! defined($title )) {} # No title for this plot - if (! defined($xlabel)) {} # No xlabel for this plot - if (! defined($ylabel)) {} # No ylabel for this plot - if ($#labels < 0) { } # No labels for this plot - if ($#curves < 0) { - &Apache::lonxml::warning("No curves specified for plot!!!!"); - return ''; - } - my $curve; - foreach $curve (@curves) { - if (!defined($curve->{'function'})&&!defined($curve->{'data'})){ - &Apache::lonxml::warning("One of the curves specified did not contain any or declarations\n"); - return ''; - } - } + &check_inputs(); # Make sure we have all the data we need ## ## Determine filename my $tmpdir = '/home/httpd/perl/tmp/'; @@ -330,7 +320,7 @@ sub end_plot { alt = "/cgi-bin/plot.gif?$filename" /> ENDIMAGE } elsif ($target eq 'edit') { - } elsif ($target eq 'modified') { + $result.=&Apache::edit::tag_end($target,$token); } return $result; } @@ -343,6 +333,8 @@ sub start_key { &get_attributes(\%key,\%key_defaults,$parstack,$safeeval, $tagstack->[-1]); } elsif ($target eq 'edit') { + $result .= &Apache::edit::tag_start($target,$token); + $result .= &edit_attributes($target,$token,\%key_defaults); } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args ($token,$parstack,$safeeval,keys %key_defaults); @@ -359,10 +351,11 @@ sub end_key { my $result = ''; if ($target eq 'web') { } elsif ($target eq 'edit') { - } elsif ($target eq 'modified') { + $result.=&Apache::edit::tag_end($target,$token); } return $result; } + ##------------------------------------------------------------------- title sub start_title { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; @@ -371,6 +364,8 @@ sub start_title { $title = &Apache::lonxml::get_all_text("/title",$$parser[-1]); } elsif ($target eq 'edit') { } elsif ($target eq 'modified') { + my $text=$$parser[-1]->get_text("/function"); + $result.=&Apache::edit::modifiedfield($token); } return $result; } @@ -380,7 +375,6 @@ sub end_title { my $result = ''; if ($target eq 'web') { } elsif ($target eq 'edit') { - } elsif ($target eq 'modified') { } return $result; } @@ -392,6 +386,8 @@ sub start_xlabel { $xlabel = &Apache::lonxml::get_all_text("/xlabel",$$parser[-1]); } elsif ($target eq 'edit') { } elsif ($target eq 'modified') { + my $text=$$parser[-1]->get_text("/function"); + $result.=&Apache::edit::modifiedfield($token); } return $result; } @@ -401,10 +397,10 @@ sub end_xlabel { my $result = ''; if ($target eq 'web') { } elsif ($target eq 'edit') { - } elsif ($target eq 'modified') { } return $result; } + ##------------------------------------------------------------------- ylabel sub start_ylabel { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; @@ -413,6 +409,8 @@ sub start_ylabel { $ylabel = &Apache::lonxml::get_all_text("/ylabel",$$parser[-1]); } elsif ($target eq 'edit') { } elsif ($target eq 'modified') { + my $text=$$parser[-1]->get_text("/function"); + $result.=&Apache::edit::modifiedfield($token); } return $result; } @@ -422,10 +420,10 @@ sub end_ylabel { my $result = ''; if ($target eq 'web') { } elsif ($target eq 'edit') { - } elsif ($target eq 'modified') { } return $result; } + ##------------------------------------------------------------------- label sub start_label { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; @@ -441,6 +439,8 @@ sub start_label { } push(@labels,\%label); } elsif ($target eq 'edit') { + $result .= &Apache::edit::tag_start($target,$token); + $result .= &edit_attributes($target,$token,\%label_defaults); } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args ($token,$parstack,$safeeval,keys %label_defaults); @@ -448,6 +448,8 @@ sub start_label { $result = &Apache::edit::rebuild_tag($token); $result.= &Apache::edit::handle_insert(); } + my $text=$$parser[-1]->get_text("/function"); + $result.=&Apache::edit::modifiedfield($token); } return $result; } @@ -457,7 +459,7 @@ sub end_label { my $result = ''; if ($target eq 'web') { } elsif ($target eq 'edit') { - } elsif ($target eq 'modified') { + $result.=&Apache::edit::tag_end($target,$token); } return $result; } @@ -474,6 +476,8 @@ sub start_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 .= &edit_attributes($target,$token,\%curve_defaults); } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args ($token,$parstack,$safeeval,keys %label_defaults); @@ -492,10 +496,11 @@ sub end_curve { pop @Apache::lonxml::namespace; &Apache::lonxml::deregister('Apache::lonplot',('function','data')); } elsif ($target eq 'edit') { - } elsif ($target eq 'modified') { + $result.=&Apache::edit::tag_end($target,$token); } return $result; } + ##------------------------------------------------------------ curve function sub start_function { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; @@ -526,10 +531,10 @@ sub end_function { my $result = ''; if ($target eq 'web') { } elsif ($target eq 'edit') { - } elsif ($target eq 'modified') { } return $result; } + ##------------------------------------------------------------ curve data sub start_data { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; @@ -571,6 +576,8 @@ sub start_data { push @{$curves[-1]->{'data'}},\@data; } elsif ($target eq 'edit') { } elsif ($target eq 'modified') { + my $text=$$parser[-1]->get_text("/data"); + $result.=&Apache::edit::modifiedfield($token); } return $result; } @@ -580,7 +587,6 @@ sub end_data { my $result = ''; if ($target eq 'web') { } elsif ($target eq 'edit') { - } elsif ($target eq 'modified') { } return $result; } @@ -593,6 +599,8 @@ sub start_axis { &get_attributes(\%axis,\%axis_defaults,$parstack,$safeeval, $tagstack->[-1]); } elsif ($target eq 'edit') { + $result .= &Apache::edit::tag_start($target,$token); + $result .= &edit_attributes($target,$token,\%axis_defaults); } elsif ($target eq 'modified') { } return $result; @@ -603,6 +611,7 @@ sub end_axis { my $result = ''; if ($target eq 'web') { } 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); @@ -614,10 +623,15 @@ sub end_axis { return $result; } +################################################################### +## ## +## Utility Functions ## +## ## +################################################################### + ##----------------------------------------------------------- set_defaults sub set_defaults { - my $var = shift; - my $defaults = shift; + my ($var,$defaults) = @_; my $key; foreach $key (keys %$defaults) { $var->{$key} = $defaults->{$key}->{'default'}; @@ -626,11 +640,7 @@ sub set_defaults { ##------------------------------------------------------------------- misc sub get_attributes{ - my $values = shift; - my $defaults = shift; - my $parstack = shift; - my $safeeval = shift; - my $tag = shift; + my ($values,$defaults,$parstack,$safeeval,$tag) = @_; foreach my $attr (keys %{$defaults}) { $values->{$attr} = &Apache::lonxml::get_param($attr,$parstack,$safeeval); @@ -728,13 +738,36 @@ sub write_gnuplot_file { $gnuplot_input .= $/.$datatext; return $gnuplot_input; } + +#---------------------------------------------- check_inputs +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 (! 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 + if ($#labels < 0) { } # No labels for this plot, thats okay + if ($#curves < 0) { + &Apache::lonxml::warning("No curves specified for plot!!!!"); + return ''; + } + my $curve; + foreach $curve (@curves) { + if (!defined($curve->{'function'})&&!defined($curve->{'data'})){ + &Apache::lonxml::warning("One of the curves specified did not contain any or declarations\n"); + return ''; + } + } +} + #------------------------------------------------ make_edit sub edit_attributes { - my $target = shift; - my $token = shift; - my $defaults = shift; + my ($target,$token,$defaults) = @_; my $result; - foreach my $attr (%{$token->[2]}) { + foreach my $attr (%$defaults) { if ($defaults->{$attr}->{'edit_type'} eq 'entry') { $result .= &Apache::edit::text_arg( $defaults->{$attr}->{'description'}, @@ -751,6 +784,13 @@ sub edit_attributes { return $result; } + +################################################################### +## ## +## Insertion functions for editing plots ## +## ## +################################################################### + #------------------------------------------------ insert_xxxxxxx sub insert_plot { my $result; @@ -832,6 +872,7 @@ sub insert_data { return $result; } +##---------------------------------------------------------------------- 1; __END__