--- loncom/xml/lonplot.pm 2001/12/27 22:30:01 1.20 +++ loncom/xml/lonplot.pm 2001/12/28 21:09:57 1.24 @@ -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.24 2001/12/28 21:09:57 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 Matthew package Apache::lonplot; use strict; @@ -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,13 +255,15 @@ my %curve_defaults = } ); -## -## End of defaults -## +################################################################### +## ## +## parsing and edit rendering ## +## ## +################################################################### 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; # @@ -274,15 +281,17 @@ 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); + ($token,$parstack,$safeeval,keys(%plot_defaults)); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); $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,9 +333,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 .= &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(); @@ -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)=@_; @@ -370,7 +363,14 @@ 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); + my $text=&Apache::lonxml::get_all_text("/title",$$parser[-1]); + $result.=''. + &Apache::edit::editfield('',$text,'',20,1). + &Apache::edit::end_table(); } elsif ($target eq 'modified') { + my $text=$$parser[-1]->get_text("/function"); + $result.=&Apache::edit::modifiedfield($token); } return $result; } @@ -380,7 +380,6 @@ sub end_title { my $result = ''; if ($target eq 'web') { } elsif ($target eq 'edit') { - } elsif ($target eq 'modified') { } return $result; } @@ -391,7 +390,14 @@ 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); + my $text=&Apache::lonxml::get_all_text("/xlabel",$$parser[-1]); + $result.=''. + &Apache::edit::editfield('',$text,'',20,1). + &Apache::edit::end_table(); } elsif ($target eq 'modified') { + my $text=$$parser[-1]->get_text("/function"); + $result.=&Apache::edit::modifiedfield($token); } return $result; } @@ -401,10 +407,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)=@_; @@ -412,7 +418,14 @@ 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); + my $text = &Apache::lonxml::get_all_text("/ylabel",$$parser[-1]); + $result .= ''. + &Apache::edit::editfield('',$text,'',20,1). + &Apache::edit::end_table(); } elsif ($target eq 'modified') { + my $text=$$parser[-1]->get_text("/function"); + $result.=&Apache::edit::modifiedfield($token); } return $result; } @@ -422,10 +435,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,13 +454,21 @@ sub start_label { } push(@labels,\%label); } elsif ($target eq 'edit') { + $result .= &Apache::edit::tag_start($target,$token); + $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(); } 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("/label"); + $result.=&Apache::edit::modifiedfield($token); } return $result; } @@ -457,7 +478,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,9 +495,11 @@ 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); + ($token,$parstack,$safeeval,keys(%label_defaults)); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); $result.= &Apache::edit::handle_insert(); @@ -492,10 +515,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)=@_; @@ -508,11 +532,12 @@ 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.=''. + $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(); + } elsif ($target eq 'modified') { # Why do I do this? my $text=$$parser[-1]->get_text("/function"); @@ -526,10 +551,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)=@_; @@ -570,7 +595,14 @@ sub start_data { } push @{$curves[-1]->{'data'}},\@data; } elsif ($target eq 'edit') { + $result .= &Apache::edit::tag_start($target,$token); + my $text = &Apache::lonxml::get_all_text("/data",$$parser[-1]); + $result .= ''. + &Apache::edit::editfield('',$text,'',20,1). + &Apache::edit::end_table(); } elsif ($target eq 'modified') { + my $text=$$parser[-1]->get_text("/data"); + $result.=&Apache::edit::modifiedfield($token); } return $result; } @@ -580,7 +612,6 @@ sub end_data { my $result = ''; if ($target eq 'web') { } elsif ($target eq 'edit') { - } elsif ($target eq 'modified') { } return $result; } @@ -593,6 +624,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,9 +636,10 @@ 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); + ($token,$parstack,$safeeval,keys(%axis_defaults)); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); $result.= &Apache::edit::handle_insert(); @@ -614,24 +648,25 @@ 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) { + foreach $key (keys(%$defaults)) { $var->{$key} = $defaults->{$key}->{'default'}; } } ##------------------------------------------------------------------- misc sub get_attributes{ - my $values = shift; - my $defaults = shift; - my $parstack = shift; - my $safeeval = shift; - my $tag = shift; - foreach my $attr (keys %{$defaults}) { + my ($values,$defaults,$parstack,$safeeval,$tag) = @_; + foreach my $attr (keys(%{$defaults})) { $values->{$attr} = &Apache::lonxml::get_param($attr,$parstack,$safeeval); if ($values->{$attr} eq '' | !defined($values->{$attr})) { @@ -678,12 +713,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'}.'" '; @@ -728,13 +763,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 (! %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 + 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 +809,13 @@ sub edit_attributes { return $result; } + +################################################################### +## ## +## Insertion functions for editing plots ## +## ## +################################################################### + #------------------------------------------------ insert_xxxxxxx sub insert_plot { my $result; @@ -832,6 +897,7 @@ sub insert_data { return $result; } +##---------------------------------------------------------------------- 1; __END__