--- loncom/xml/lonplot.pm 2007/08/04 00:01:52 1.127 +++ loncom/xml/lonplot.pm 2007/08/09 06:25:43 1.128 @@ -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.128 2007/08/09 06:25:43 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -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'); @@ -1371,7 +1406,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.