--- loncom/xml/lonplot.pm 2008/01/20 02:47:06 1.134 +++ loncom/xml/lonplot.pm 2008/05/12 11:13:28 1.137 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Dynamic plot # -# $Id: lonplot.pm,v 1.134 2008/01/20 02:47:06 raeburn Exp $ +# $Id: lonplot.pm,v 1.137 2008/05/12 11:13:28 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -91,6 +91,12 @@ BEGIN { my $max_str_len = 50; # if a label, title, xlabel, or ylabel text # is longer than this, it will be truncated. +my %linetypes = + ( + solid => 1, + dashed => 0 + ); + my %linestyles = ( lines => 2, # Maybe this will be used in the future @@ -497,7 +503,7 @@ my %axis_defaults = ); -my @curve_edit_order = ('color','name','linestyle','linewidth','pointtype','pointsize','limit'); +my @curve_edit_order = ('color','name','linestyle','linewidth','linetype','pointtype','pointsize','limit'); my %curve_defaults = ( @@ -518,37 +524,44 @@ my %curve_defaults = linestyle => { default => 'lines', test => $linestyle_test, - description => 'Line style', + description => 'Plot with:', edit_type => 'choice', choices => [keys(%linestyles)] }, linewidth => { default => 1, test => $int_test, - description => 'Line width (may not apply to all line styles)', + description => 'Line width (may not apply to all plot styles)', edit_type => 'choice', choices => [1,2,3,4,5,6,7,8,9,10] }, + linetype => { + default => 'solid', + test => sub {$_[0]=~/^(solid|dashed)$/}, + description => 'Line type (may not apply to all plot styles)', + edit_type => 'choice', + choices => ['solid', 'dashed'] + }, pointsize => { default => 1, test => $pos_real_test, - description => 'Point size (may not apply to all line styles)', + description => 'Point size (may not apply to all plot styles)', edit_type => 'entry', size => '5' }, pointtype => { default => 1, test => $int_test, - description => 'Point type (may not apply to all line styles)', + description => 'Point type (may not apply to all plot styles)', edit_type => 'choice', choices => [0,1,2,3,4,5,6] }, limit => { default => 'closed', - test => sub {$_[0]=~/^(closed|x1|x2|y1|y2)$/}, + test => sub {$_[0]=~/^(above|below|closed|x1|x2|y1|y2)$/}, description => 'Point to fill -- for filledcurves', edit_type => 'choice', - choices => ['closed','x1','x2','y1','y2'] + choices => ['above', 'below', 'closed','x1','x2','y1','y2'] }, ); @@ -808,8 +821,10 @@ sub parse_label { my %lookup = - ('(Alpha|#913)' => {'tex' => '{/Symbol A}', 'web' => "\x{391}"}, - '(Beta|#914)' => {'tex' => '{/Symbol B}', 'web' => "\x{392}"}, + ( # Greek alphabet: + + '(Alpha|#913)' => {'tex' => '{/Symbol A}', 'web' => "\x{391}"}, + '(Beta|#914)' => {'tex' => '{/Symbol B}', 'web' => "\x{392}"}, '(Chi|#935)' => {'tex' => '{/Symbol C}', 'web' => "\x{3A7}"}, '(Delta|#916)' => {'tex' => '{/Symbol D}', 'web' => "\x{394}"}, '(Epsilon|#917)' => {'tex' => '{/Symbol E}', 'web' => "\x{395}"}, @@ -856,6 +871,29 @@ my %lookup = '(xi|#958)' => {'tex' => '{/Symbol x}', 'web' => "\x{3BE}"}, '(psi|#968)' => {'tex' => '{/Symbol y}', 'web' => "\x{3C8}"}, '(zeta|#950)' => {'tex' => '{/Symbol z}', 'web' => "\x{3B6}"}, + + # Punctuation: + + '(quot|#034)' => {'tex' => '\42', 'web' => '\42'}, + '(amp|#038)' => {'tex' => '\46', 'web' => '\46'}, + '(lt|#060)' => {'tex' => '\74', 'web' => '\74'}, + '(gt|#062)' => {'tex' => '\76', 'web' => '\76'}, + '#131' => {'tex' => '{/Symbol \246}', 'web' => "\x{192}"}, + '#132' => {'tex' => '{/Text \271}', 'web' => "\x{201e}"}, + '#133' => {'tex' => '{/Symbol \274}', 'web'=> "\x{2026}"}, + '#134' => {'tex' => '{/Text \262}', 'web' => "\x{2020}"}, + '#135' => {'tex' => '{/Text \263}', 'web' => "\x{2021}"}, + '#136' => {'tex' => '\\\\^', 'web' => '\\\\^'}, + '#137' => {'tex' => '{/Text \275}', 'web' => "\x{2030}"}, + '#138' => {'tex' => 'S', 'web' => "\x{160}"}, # no S-caron in ps fonts. + '#139' => {'tex' => '<', 'web' => '<'}, + '#140' => {'tex' => '{/Text \352}','web' => "\x{152}"}, + '#145' => {'tex' => '\140', 'web' => "\x{2018}"}, + '#146' => {'tex' => '\47', 'web' => "\x{2019}"}, + '#147' => {'tex' => '{/Text \252}','web' => "\x{201c}"}, + '#148' => {'tex' => '{/Text \315}','web' => '\\"'}, + '#149' => {'tex' => '{/Symbol \267}', 'web' => "\x{2022}"}, + ); @@ -863,6 +901,7 @@ sub replace_entities { my ($target,$text) = @_; $text =~ s{([_^~\{\}]|\\\\)}{\\\\$1}g; while (my ($re, $replace) = each(%lookup)) { + my $repl = $replace->{$target}; $text =~ s/&$re;/$replace->{$target}/g; } $text =~ s{(&)}{\\\\$1}g; @@ -1464,6 +1503,14 @@ sub write_gnuplot_file { $gnuplot_input.=' pointsize '.$curve->{'pointsize'}; } elsif ($curve->{'linestyle'} eq 'filledcurves') { $gnuplot_input.= ' '.$curve->{'limit'}; + } elsif ($curve->{'linetype'} ne '' && + $curve->{'linestyle'} eq 'lines') { + $gnuplot_input.= ' linetype '; + $gnuplot_input.= $linetypes{$curve->{'linetype'}}; + $gnuplot_input.= ' linecolor rgb "'; + # convert color from xaaaaaa to #aaaaaa + $curve->{'color'} =~ s/^x/#/; + $gnuplot_input.= $curve->{'color'}.'"'; } $gnuplot_input.= ' linewidth '.$curve->{'linewidth'}; @@ -1500,8 +1547,16 @@ sub write_gnuplot_file { $gnuplot_input.=' pointsize '.$curve->{'pointsize'}; } elsif ($curve->{'linestyle'} eq 'filledcurves') { $gnuplot_input.= ' '.$curve->{'limit'}; + } elsif ($curve->{'linetype'} ne '' && + $curve->{'linestyle'} eq 'lines') { + $gnuplot_input.= ' linetype '; + $gnuplot_input.= $linetypes{$curve->{'linetype'}}; + $gnuplot_input.= ' linecolor rgb "'; + # convert color from xaaaaaa to #aaaaaa + $curve->{'color'} =~ s/^x/#/; + $gnuplot_input.= $curve->{'color'}.'"'; } - $gnuplot_input.= ' linewidth '.$curve->{'linewidth'}; + $gnuplot_input.= ' linewidth '.$curve->{'linewidth'}; } } # Write the output to a file.