--- loncom/xml/lonplot.pm 2007/08/04 00:01:52 1.127 +++ 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.127 2007/08/04 00:01:52 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'; } @@ -757,10 +757,45 @@ sub end_key { return $result; } -sub gnuplot_protect { - my ($string) = @_; - $string =~ s{([_^&~\{\}]|\\\\)}{\\\\$1}g; - return $string; +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 @@ -774,7 +809,7 @@ sub start_title { if (length($title) > $max_str_len) { $title = substr($title,0,$max_str_len); } - $title = &gnuplot_protect($title); + $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); @@ -806,7 +841,7 @@ sub start_xlabel { if (length($xlabel) > $max_str_len) { $xlabel = substr($xlabel,0,$max_str_len); } - $xlabel = &gnuplot_protect($xlabel); + $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); @@ -839,7 +874,7 @@ sub start_ylabel { if (length($ylabel) > $max_str_len) { $ylabel = substr($ylabel,0,$max_str_len); } - $ylabel = &gnuplot_protect($ylabel); + $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); @@ -873,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'} = &gnuplot_protect($text); + $label{'text'} = &parse_label($target,$text); push(@labels,\%label); } elsif ($target eq 'edit') { $result .= &Apache::edit::tag_start($target,$token,'Plot Label'); @@ -1224,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'}.$/; @@ -1371,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.