--- loncom/xml/lonplot.pm 2007/08/03 06:08:06 1.124 +++ loncom/xml/lonplot.pm 2007/08/28 23:48:39 1.129 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Dynamic plot # -# $Id: lonplot.pm,v 1.124 2007/08/03 06:08:06 albertel Exp $ +# $Id: lonplot.pm,v 1.129 2007/08/28 23:48:39 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -36,11 +36,10 @@ use Apache::response; use Apache::lonxml; use Apache::edit; use Apache::lonnet; -use lib '/home/httpd/lib/perl/'; use LONCAPA; -use vars qw/$weboutputformat $versionstring/; +use vars qw/$weboutputformat $version/; @@ -49,8 +48,9 @@ BEGIN { # # Determine the version of GNUPLOT $weboutputformat = 'gif'; - $versionstring = `gnuplot --version 2>/dev/null`; - if ($versionstring =~ /^gnuplot 4/) { + my $versionstring = `gnuplot --version 2>/dev/null`; + ($version) = ($versionstring =~ /^gnuplot ([\d.]+)/); + if ($version >= 4) { $weboutputformat = 'png'; } @@ -206,9 +206,9 @@ my %gnuplot_defaults = font => { default => '9', test => $sml_test, - description => 'Size of font to use', + description => 'Font size to use in web output (pts)', edit_type => 'choice', - choices => [['5','5 (small)'],'7',['9','9 (medium)'],'10','12',['15','15 (large)']] + choices => [['5','5 (small)'],'6','7','8',['9','9 (medium)'],'10',['11','11 (large)'],'12','15'] }, fontface => { default => 'sans-serif', @@ -501,7 +501,7 @@ my %curve_defaults = choices => [keys(%linestyles)] }, linewidth => { - default => 4, + default => 2, test => $int_test, description => 'Line width (may not apply to all line styles)', edit_type => 'choice', @@ -713,7 +713,7 @@ sub get_font { } elsif ( $Apache::lonplot::plot{'font'} eq 'medium') { $size = '9'; } elsif ( $Apache::lonplot::plot{'font'} eq 'large') { - $size = '15'; + $size = '11'; } else { $size = '9'; } @@ -757,6 +757,47 @@ sub end_key { return $result; } +sub parse_label { + my ($target,$text) = @_; + my $parser=HTML::LCParser->new(\$text); + my $result; + while (my $token=$parser->get_token) { + if ($token->[0] eq 'S') { + if ($token->[1] eq 'sub') { + $result .= '_{'; + } elsif ($token->[1] eq 'sup') { + $result .= '^{'; + } else { + $result .= $token->[4]; + } + } elsif ($token->[0] eq 'E') { + if ($token->[1] eq 'sub' + || $token->[1] eq 'sup') { + $result .= '}'; + } else { + $result .= $token->[2]; + } + } elsif ($token->[0] eq 'T') { + $result .= &replace_entities($target,$token->[1]); + } + } + return $result; +} + + +my %lookup = + ('(pi|#960)' => {'tex' => '{/Symbol p}', 'web' => "\x{3C0}"},); + +sub replace_entities { + my ($target,$text) = @_; + $text =~ s{([_^~\{\}]|\\\\)}{\\\\$1}g; + while (my ($re, $replace) = each(%lookup)) { + $text =~ s/&$re;/$replace->{$target}/g; + } + $text =~ s{(&)}{\\\\$1}g; + return $text; +} + ##------------------------------------------------------------------- title sub start_title { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; @@ -768,6 +809,7 @@ sub start_title { if (length($title) > $max_str_len) { $title = substr($title,0,$max_str_len); } + $title = &parse_label($target,$title); } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_start($target,$token,'Plot Title'); my $text=&Apache::lonxml::get_all_text("/title",$parser,$style); @@ -799,6 +841,7 @@ sub start_xlabel { if (length($xlabel) > $max_str_len) { $xlabel = substr($xlabel,0,$max_str_len); } + $xlabel = &parse_label($target,$xlabel); } elsif ($target eq 'edit') { $result.=&Apache::edit::tag_start($target,$token,'Plot Xlabel'); my $text=&Apache::lonxml::get_all_text("/xlabel",$parser,$style); @@ -831,6 +874,7 @@ sub start_ylabel { if (length($ylabel) > $max_str_len) { $ylabel = substr($ylabel,0,$max_str_len); } + $ylabel = &parse_label($target,$ylabel); } elsif ($target eq 'edit') { $result .= &Apache::edit::tag_start($target,$token,'Plot Ylabel'); my $text = &Apache::lonxml::get_all_text("/ylabel",$parser,$style); @@ -864,7 +908,7 @@ sub start_label { $text = &Apache::run::evaluate($text,$safeeval,$$parstack[-1]); $text =~ s/\n/ /g; $text = substr($text,0,$max_str_len) if (length($text) > $max_str_len); - $label{'text'} = $text; + $label{'text'} = &parse_label($target,$text); push(@labels,\%label); } elsif ($target eq 'edit') { $result .= &Apache::edit::tag_start($target,$token,'Plot Label'); @@ -1215,9 +1259,15 @@ sub write_gnuplot_file { if (lc($Apache::lonplot::plot{'bmargin'}) ne 'default') { $gnuplot_input .= 'set bmargin '.$Apache::lonplot::plot{'bmargin'}.$/; } + # tic scales - $gnuplot_input .= 'set ticscale '. - $Apache::lonplot::plot{'major_ticscale'}.' '.$Apache::lonplot::plot{'minor_ticscale'}.$/; + if ($version > 4) { + $gnuplot_input .= 'set tics scale '. + $Apache::lonplot::plot{'major_ticscale'}.', '.$Apache::lonplot::plot{'minor_ticscale'}.$/; + } else { + $gnuplot_input .= 'set ticscale '. + $Apache::lonplot::plot{'major_ticscale'}.' '.$Apache::lonplot::plot{'minor_ticscale'}.$/; + } #boxwidth if (lc($Apache::lonplot::plot{'boxwidth'}) ne '') { $gnuplot_input .= 'set boxwidth '.$Apache::lonplot::plot{'boxwidth'}.$/; @@ -1236,14 +1286,17 @@ sub write_gnuplot_file { $gnuplot_input .= "set samples $Apache::lonplot::plot{'samples'}\n"; # title, xlabel, ylabel # titles + my $extra_space_x = ($xtics{'location'} eq 'axis') ? ' 0, -0.5 ' : ''; + my $extra_space_y = ($ytics{'location'} eq 'axis') ? ' -0.5, 0 ' : ''; + if ($target eq 'tex') { - $gnuplot_input .= "set title \"$title\" font \"".$font_properties->{'printname'}.",".$fontsize."pt\"\n" if (defined($title)) ; - $gnuplot_input .= "set xlabel \"$xlabel\" font \"".$font_properties->{'printname'}.",".$fontsize."pt\"\n" if (defined($xlabel)); - $gnuplot_input .= "set ylabel \"$ylabel\" font \"".$font_properties->{'printname'}.",".$fontsize."pt\"\n" if (defined($ylabel)); + $gnuplot_input .= "set title \"$title\" font \"".$font_properties->{'printname'}.",".$fontsize."pt\"\n" if (defined($title)) ; + $gnuplot_input .= "set xlabel \"$xlabel\" $extra_space_x font \"".$font_properties->{'printname'}.",".$fontsize."pt\"\n" if (defined($xlabel)); + $gnuplot_input .= "set ylabel \"$ylabel\" $extra_space_y font \"".$font_properties->{'printname'}.",".$fontsize."pt\"\n" if (defined($ylabel)); } else { - $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)); + $gnuplot_input .= "set title \"$title\" \n" if (defined($title)) ; + $gnuplot_input .= "set xlabel \"$xlabel\" $extra_space_x \n" if (defined($xlabel)); + $gnuplot_input .= "set ylabel \"$ylabel\" $extra_space_y \n" if (defined($ylabel)); } # tics if (%xtics) { @@ -1359,7 +1412,8 @@ sub write_gnuplot_file { } } # Write the output to a file. - my $fh=Apache::File->new(">$tmpdir$filename.data"); + open (my $fh,">$tmpdir$filename.data"); + binmode($fh, ":utf8"); print $fh $gnuplot_input; close($fh); # That's all folks.