--- loncom/xml/lonplot.pm 2002/02/06 10:24:55 1.48 +++ loncom/xml/lonplot.pm 2002/02/27 22:17:06 1.52 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Dynamic plot # -# $Id: lonplot.pm,v 1.48 2002/02/06 10:24:55 matthew Exp $ +# $Id: lonplot.pm,v 1.52 2002/02/27 22:17:06 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -29,7 +29,7 @@ # 12/17 12/18 12/19 12/20 12/21 12/27 12/28 12/30 12/31 Matthew # 01/01/02 Matthew # 01/02 01/03 01/04 01/07 01/08 01/09 Matthew -# 01/21 02/05 Matthew +# 01/21 02/05 02/06 2/28Matthew package Apache::lonplot; @@ -413,7 +413,7 @@ sub start_gnuplot { ('title','xlabel','ylabel','key','axis','label','curve', 'xtics','ytics')); push (@Apache::lonxml::namespace,'lonplot'); - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { my $inside = &Apache::lonxml::get_all_text("/gnuplot",$$parser[-1]); $inside=&Apache::run::evaluate($inside,$safeeval,$$parstack[-1]); &Apache::lonxml::newparser($parser,\$inside); @@ -441,7 +441,7 @@ sub end_gnuplot { &Apache::lonxml::deregister('Apache::lonplot', ('title','xlabel','ylabel','key','axis','label','curve')); my $result = ''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { &check_inputs(); # Make sure we have all the data we need ## ## Determine filename @@ -449,15 +449,20 @@ sub end_gnuplot { my $filename = $ENV{'user.name'}.'_'.$ENV{'user.domain'}. '_'.time.'_'.$$.int(rand(1000)).'_plot.data'; ## Write the plot description to the file - &write_gnuplot_file($tmpdir,$filename); + &write_gnuplot_file($tmpdir,$filename,$target); ## return image tag for the plot - $result .= <<"ENDIMAGE"; + if ($target eq 'web') { + $result .= <<"ENDIMAGE"; image should be /cgi-bin/plot.gif?$filename ENDIMAGE + } elsif ($target eq 'tex') { + system "gnuplot $filename"; + $result = "$filename.eps"; + } } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_end($target,$token); } @@ -469,7 +474,7 @@ ENDIMAGE sub start_xtics { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { &get_attributes(\%xtics,\%tic_defaults,$parstack,$safeeval, $tagstack->[-1]); } elsif ($target eq 'edit') { @@ -489,7 +494,7 @@ sub start_xtics { sub end_xtics { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result = ''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_end($target,$token); } @@ -500,7 +505,7 @@ sub end_xtics { sub start_ytics { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { &get_attributes(\%ytics,\%tic_defaults,$parstack,$safeeval, $tagstack->[-1]); } elsif ($target eq 'edit') { @@ -520,7 +525,7 @@ sub start_ytics { sub end_ytics { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result = ''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_end($target,$token); } @@ -532,7 +537,7 @@ sub end_ytics { sub start_key { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { &get_attributes(\%key,\%key_defaults,$parstack,$safeeval, $tagstack->[-1]); } elsif ($target eq 'edit') { @@ -551,7 +556,7 @@ sub start_key { sub end_key { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result = ''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_end($target,$token); } @@ -562,8 +567,9 @@ sub end_key { sub start_title { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { $title = &Apache::lonxml::get_all_text("/title",$$parser[-1]); + $title =~ s/\n/ /g; if (length($title) > $max_str_len) { $title = substr($title,0,$max_str_len); } @@ -584,7 +590,7 @@ sub start_title { sub end_title { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result = ''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_end($target,$token); } @@ -594,8 +600,9 @@ sub end_title { sub start_xlabel { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { $xlabel = &Apache::lonxml::get_all_text("/xlabel",$$parser[-1]); + $xlabel =~ s/\n/ /g; if (length($xlabel) > $max_str_len) { $xlabel = substr($xlabel,0,$max_str_len); } @@ -616,7 +623,7 @@ sub start_xlabel { sub end_xlabel { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result = ''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_end($target,$token); } @@ -627,8 +634,9 @@ sub end_xlabel { sub start_ylabel { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { $ylabel = &Apache::lonxml::get_all_text("/ylabel",$$parser[-1]); + $ylabel =~ s/\n/ /g; if (length($ylabel) > $max_str_len) { $ylabel = substr($ylabel,0,$max_str_len); } @@ -649,7 +657,7 @@ sub start_ylabel { sub end_ylabel { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result = ''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_end($target,$token); } @@ -660,11 +668,12 @@ sub end_ylabel { sub start_label { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { my %label; &get_attributes(\%label,\%label_defaults,$parstack,$safeeval, $tagstack->[-1]); my $text = &Apache::lonxml::get_all_text("/label",$$parser[-1]); + $text =~ s/\n/ /g; $text = substr($text,0,$max_str_len) if (length($text) > $max_str_len); $label{'text'} = $text; push(@labels,\%label); @@ -688,7 +697,7 @@ sub start_label { sub end_label { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result = ''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_end($target,$token); } @@ -701,7 +710,7 @@ sub start_curve { my $result=''; &Apache::lonxml::register('Apache::lonplot',('function','data')); push (@Apache::lonxml::namespace,'curve'); - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { my %curve; &get_attributes(\%curve,\%curve_defaults,$parstack,$safeeval, $tagstack->[-1]); @@ -726,7 +735,7 @@ sub end_curve { my $result = ''; pop @Apache::lonxml::namespace; &Apache::lonxml::deregister('Apache::lonplot',('function','data')); - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_end($target,$token); } @@ -737,7 +746,7 @@ sub end_curve { sub start_function { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { if (exists($curves[-1]->{'data'})) { &Apache::lonxml::warning('Use of precludes use of . The will be omitted in favor of the declaration.'); delete $curves[-1]->{'data'} ; @@ -761,7 +770,7 @@ sub start_function { sub end_function { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result = ''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { } elsif ($target eq 'edit') { $result .= &Apache::edit::end_table(); } @@ -772,7 +781,7 @@ sub end_function { sub start_data { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { if (exists($curves[-1]->{'function'})) { &Apache::lonxml::warning('Use of precludes use of .'. '. The will be omitted in favor of '. @@ -785,7 +794,7 @@ sub start_data { $datatext = &Apache::run::run('return "'.$datatext.'"', $safeeval,1); } - $datatext =~ s/\s+/ /g; + $datatext =~ s/\s+/ /g; # Need to do some error checking on the @data array - # make sure it's all numbers and make sure each array # is of the same length. @@ -836,7 +845,7 @@ sub start_data { sub end_data { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result = ''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { } elsif ($target eq 'edit') { $result .= &Apache::edit::end_table(); } @@ -847,7 +856,7 @@ sub end_data { sub start_axis { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { &get_attributes(\%axis,\%axis_defaults,$parstack,$safeeval, $tagstack->[-1]); } elsif ($target eq 'edit') { @@ -866,7 +875,7 @@ sub start_axis { sub end_axis { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result = ''; - if ($target eq 'web') { + if ($target eq 'web' || $target eq 'tex') { } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_end($target,$token); } elsif ($target eq 'modified') { @@ -912,7 +921,7 @@ sub get_attributes{ ##------------------------------------------------------- write_gnuplot_file sub write_gnuplot_file { - my ($tmpdir,$filename)= @_; + my ($tmpdir,$filename,$target)= @_; my $gnuplot_input = ''; my $curve; # Collect all the colors @@ -926,13 +935,18 @@ sub write_gnuplot_file { $plot{'fgcolor'} ); } # set term - $gnuplot_input .= 'set term gif '; - $gnuplot_input .= 'transparent ' if ($plot{'transparent'} eq 'on'); - $gnuplot_input .= $plot{'font'} . ' '; - $gnuplot_input .= 'size '.$plot{'width'}.','.$plot{'height'}.' '; - $gnuplot_input .= "@Colors\n"; - # set output - $gnuplot_input .= "set output\n"; + if ($target eq 'web') { + $gnuplot_input .= 'set term gif '; + $gnuplot_input .= 'transparent ' if ($plot{'transparent'} eq 'on'); + $gnuplot_input .= $plot{'font'} . ' '; + $gnuplot_input .= 'size '.$plot{'width'}.','.$plot{'height'}.' '; + $gnuplot_input .= "@Colors\n"; + # set output + $gnuplot_input .= "set output\n"; + } elsif ($target eq 'tex') { + $gnuplot_input .= "set term postscript eps monochrome\n"; + $gnuplot_input .= "set output \"$filename.eps\"\n"; + } # grid $gnuplot_input .= 'set grid'.$/ if ($plot{'grid'} eq 'on'); # border @@ -1085,7 +1099,7 @@ sub edit_attributes { sub insert_gnuplot { my $result = ''; # plot attributes - $result .= "{'default'}\"\n"; } @@ -1097,8 +1111,8 @@ sub insert_gnuplot { # $result .= &insert_xlabel(); # $result .= &insert_ylabel(); $result .= &insert_curve(); - # close up the - $result .= "\n"; + # close up the + $result .= "\n"; return $result; }