--- loncom/xml/lonplot.pm 2020/01/30 15:59:15 1.183 +++ loncom/xml/lonplot.pm 2020/02/02 20:12:31 1.184 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Dynamic plot # -# $Id: lonplot.pm,v 1.183 2020/01/30 15:59:15 raeburn Exp $ +# $Id: lonplot.pm,v 1.184 2020/02/02 20:12:31 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -39,8 +39,8 @@ use Apache::response; use Apache::lonxml; use Apache::edit; use Apache::lonnet; +use Apache::lonlocal; use LONCAPA; - use vars qw/$weboutputformat $version $colorprefix/; @@ -56,8 +56,8 @@ BEGIN { if ($version >= 4) { $weboutputformat = 'png'; } - $colorprefix = 'x'; - if ($version > 4.6) { + $colorprefix = 'x'; + if ($version >= 4.6) { $colorprefix = '#'; } } @@ -137,9 +137,9 @@ my $pos_real_test = sub {$_[0]=~s/\s+//g;$_[0]=~/^[+]?\d*\.?\d*([eE][+-]\d+)?$/}; my $color_test; if ($version < 4.6) { - $color_test = sub {$_[0]=~s/\s+//g;$_[0]=~s/^\#/x/;$_[0]=~/^x[\da-fA-F]{6}$/}; + $color_test = sub {$_[0]=~s/\s+//g;$_[0]=~s/^\#/x/;$_[0]=~s/^x+/x/;$_[0]=~/^x[\da-fA-F]{6}$/}; } else { - $color_test = sub {$_[0]=~s/\s+//g;$_[0]=~s/^x/#/;$_[0]=~/^\#[\da-fA-F]{6}$/}; + $color_test = sub {$_[0]=~s/\s+//g;$_[0]=~s/^x/#/;$_[0]=~s/^\#+/#/;$_[0]=~/^\#[\da-fA-F]{6}$/}; } my $onoff_test = sub {$_[0]=~/^(on|off)$/}; my $key_pos_test = sub {$_[0]=~/^(top|bottom|right|left|outside|below| )+$/}; @@ -682,6 +682,7 @@ sub start_gnuplot { # my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; + &Apache::lonxml::register('Apache::lonplot', ('title','xlabel','ylabel','key','axis','label','curve', 'xtics','ytics')); @@ -690,6 +691,7 @@ sub start_gnuplot { &get_attributes(\%Apache::lonplot::plot,\%gnuplot_defaults,$parstack,$safeeval, $tagstack->[-1]); } elsif ($target eq 'edit') { + &fixup_colors($token,['bgcolor','fgcolor']); $result .= &Apache::edit::tag_start($target,$token,'GnuPlot'); $result .= &edit_attributes($target,$token,\%gnuplot_defaults, \@gnuplot_edit_order) @@ -698,18 +700,8 @@ sub start_gnuplot { } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args ($token,$parstack,$safeeval,keys(%gnuplot_defaults)); - - if ($constructtag) { - # - # Color chooser does not prepend x (or #) to the color values - # Do that here: - # - foreach my $attribute ('bgcolor', 'fgcolor') { - my $value = $token->[2]{$attribute}; - if (defined $value && ($value !~ /^\Q$colorprefix\E/)) { - $token->[2]{$attribute} = $colorprefix . $value; - } - } + my $fixed = &fixup_colors($token,['bgcolor','fgcolor']); + if ($constructtag || $fixed) { $result = &Apache::edit::rebuild_tag($token); } } @@ -1490,6 +1482,7 @@ sub start_curve { $tagstack->[-1]); push (@curves,\%curve); } elsif ($target eq 'edit') { + &fixup_colors($token); $result .= &Apache::edit::tag_start($target,$token,'Curve'); $result .= &edit_attributes($target,$token,\%curve_defaults, \@curve_edit_order) @@ -1499,15 +1492,8 @@ sub start_curve { } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args ($token,$parstack,$safeeval,keys(%curve_defaults)); - if ($constructtag) { - # - # Fix up the color attribute as jcolor does not prepend an x - # (or #) - # - my $value = $token->[2]{'color'}; - if (defined $value && ($value !~ /^\Q$colorprefix\E/)) { - $token->[2]{'color'} = $colorprefix . $value; - } + my $fixed = &fixup_colors($token); + if ($constructtag || $fixed) { $result = &Apache::edit::rebuild_tag($token); } } @@ -1650,23 +1636,15 @@ sub start_axis { &get_attributes(\%axis,\%axis_defaults,$parstack,$safeeval, $tagstack->[-1]); } elsif ($target eq 'edit') { + &fixup_colors($token); $result .= &Apache::edit::tag_start($target,$token,'Plot Axes'); $result .= &edit_attributes($target,$token,\%axis_defaults, \@axis_edit_order); } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args ($token,$parstack,$safeeval,keys(%axis_defaults)); - - if ($constructtag) { - # - # Fix up the color attribute since jchooser does not - # prepend an x (or #) to the color: - # - my $value = $token->[2]{'color'}; - if (defined $value && ($value !~ /^\Q$colorprefix\E/)) { - $token->[2]{'color'} = $colorprefix . $value; - } - + my $fixed = &fixup_colors($token); + if ($constructtag || $fixed) { $result = &Apache::edit::rebuild_tag($token); } } @@ -1716,10 +1694,26 @@ sub get_attributes{ } my $test = $defaults->{$attr}->{'test'}; if (! &$test($values->{$attr})) { + my $warning = &mt('Replacing your value with: [_1].', + $defaults->{$attr}->{'default'}); + my $missingprefix; + if (($env{'form.problemmode'} eq 'editxml') || + ($env{'form.problemmode'} eq 'edit')) { + $warning = &mt('On display your value will be replaced with: [_1].', + $defaults->{$attr}->{'default'}); + if (($env{'form.problemmode'} eq 'edit') && + ($attr =~ /^(|fg|bg)color$/) && ($values->{$attr} =~ /^[\da-fA-F]{6}$/)) { + $missingprefix = 1; + $warning = &mt('The current value is missing the prefix: [_1].', + $colorprefix).' '. + &mt('As the color picker entry adds the prefix, saving will fix this issue.'); + } + } + unless ($missingprefix) { + $values->{$attr} = $defaults->{$attr}->{'default'}; + } &Apache::lonxml::warning - ($tag.':'.$attr.': Bad value.'.'Replacing your value with : ' - .$defaults->{$attr}->{'default'} ); - $values->{$attr} = $defaults->{$attr}->{'default'}; + ($tag.':'.$attr.': '.&mt('Bad value').'. '.$warning); } } return ; @@ -1810,13 +1804,15 @@ sub write_gnuplot_file { @curves = @curvescopy; # Collect all the colors my @Colors; - push @Colors, $Apache::lonplot::plot{'bgcolor'}; - push @Colors, $Apache::lonplot::plot{'fgcolor'}; - push @Colors, (defined($axis{'color'})?$axis{'color'}:$Apache::lonplot::plot{'fgcolor'}); - foreach $curve (@curves) { - push @Colors, ($curve->{'color'} ne '' ? - $curve->{'color'} : - $Apache::lonplot::plot{'fgcolor'} ); + if ($version < 4.6) { + push(@Colors,$Apache::lonplot::plot{'bgcolor'}); + push(@Colors,$Apache::lonplot::plot{'fgcolor'}); + push(@Colors,(defined($axis{'color'})?$axis{'color'}:$Apache::lonplot::plot{'fgcolor'})); + foreach $curve (@curves) { + push(@Colors,($curve->{'color'} ne '' ? + $curve->{'color'} : + $Apache::lonplot::plot{'fgcolor'})); + } } # set term @@ -1827,7 +1823,7 @@ sub write_gnuplot_file { '/'.$font_properties->{'file'}.'.ttf" '; $gnuplot_input .= $fontsize; $gnuplot_input .= ' size '.$Apache::lonplot::plot{'width'}.','.$Apache::lonplot::plot{'height'}.' '; - if ($version > 4.6) { + if ($version >= 4.6) { if ($Apache::lonplot::plot{'bgcolor'}) { $gnuplot_input .= "background '$Apache::lonplot::plot{'bgcolor'}'\n"; } @@ -1843,6 +1839,10 @@ sub write_gnuplot_file { 'fontfile "'.$Apache::lonnet::perlvar{'lonFontsDir'}. '/'.$font_properties->{'file'}.'.pfb" '; } + if (($version >= 4.6) && ($Apache::lonplot::plot{'plotcolor'} =~ /^colou?r$/) && + ($Apache::lonplot::plot{'bgcolor'} ne '')) { + $gnuplot_input .= "background '$Apache::lonplot::plot{'bgcolor'}' "; + } $gnuplot_input .= ' "'.$font_properties->{'printname'}.'" '; $gnuplot_input .= $fontsize; $gnuplot_input .= "\nset output \"".$tmpdir. @@ -1909,19 +1909,32 @@ sub write_gnuplot_file { if ($Apache::lonplot::plot{'gridlayer'} eq 'on'); # grid - if (($version > 4.6) && ($Apache::lonplot::plot{'fgcolor'} ne '')) { - $gnuplot_input .= 'set grid linecolor "'.$Apache::lonplot::plot{'fgcolor'}.'"'.$/ - if ($Apache::lonplot::plot{'grid'} eq 'on'); - } else { - $gnuplot_input .= 'set grid'.$/ if ($Apache::lonplot::plot{'grid'} eq 'on'); - } + if ($Apache::lonplot::plot{'grid'} eq 'on') { + if (($version >= 4.6) && (($axis{'color'} ne '') || ($Apache::lonplot::plot{'fgcolor'} ne ''))) { + if (($target eq 'web') || (($target eq 'tex') && + ($Apache::lonplot::plot{'plotcolor'} =~ /^colou?r$/))) { + $gnuplot_input .= 'set grid linecolor rgb "'. + (($axis{'color'} ne '')?$axis{'color'}: + $Apache::lonplot::plot{'fgcolor'}). + '" '.$/; + + } else { + $gnuplot_input .= 'set grid'.$/; + } + } else { + $gnuplot_input .= 'set grid'.$/; + } + } # border if ($Apache::lonplot::plot{'border'} eq 'on') { - if (($version > 4.6) && (($axis{'color'} ne '') || ($Apache::lonplot::plot{'fgcolor'} ne ''))) { - $gnuplot_input .= 'set border linecolor "'. - (($axis{'color'} ne '')?$axis{'color'}: - $Apache::lonplot::plot{'fgcolor'}). - '" '.$/; + if (($version >= 4.6) && ($Apache::lonplot::plot{'fgcolor'} ne '')) { + if (($target eq 'web') || (($target eq 'tex') && + ($Apache::lonplot::plot{'plotcolor'} =~ /^colou?r$/))) { + $gnuplot_input .= 'set border linecolor rgb "'. + $Apache::lonplot::plot{'fgcolor'}.'" '.$/; + } else { + $gnuplot_input .= 'set border '.$/; + } } else { $gnuplot_input .= 'set border '.$/; } @@ -2191,7 +2204,7 @@ sub check_inputs { } } -#------------------------------------------------ make_edit +#------------------------------------------ edit_attributes sub edit_attributes { my ($target,$token,$defaults,$keys) = @_; my ($result,@keys); @@ -2221,6 +2234,46 @@ sub edit_attributes { return $result; } +#------------------------------------------ fixup_colors + +sub fixup_colors { + my ($token,$attribref) = @_; + my @attributes; + if (ref($attribref) eq 'ARRAY') { + @attributes = @{$attribref}; + } else { + @attributes = ('color'); + } + +# +# Fix up the color attribute since jchooser does not +# prepend an x (or #) to the color: +# + my $had_changes; + if ((ref($token) eq 'ARRAY') && (ref($token->[2]) eq 'HASH')) { + foreach my $attribute (@attributes) { + if ($attribute =~ /^(|bg|fg)color$/) { + my $value = $token->[2]{$attribute}; + if (defined($value)) { + if ($version < 4.6) { + $value=~s/^\#/x/; + } else { + $value=~s/^x/#/; + } + if ($value ne $token->[2]{$attribute}) { + $token->[2]{$attribute} = $value; + $had_changes = 1; + } + if ($value !~ /^\Q$colorprefix\E/) { + $token->[2]{$attribute} = $colorprefix . $value; + $had_changes = 1; + } + } + } + } + } + return $had_changes; +} ################################################################### ## ## @@ -2419,6 +2472,8 @@ described at http://www.lon-capa.org. =item edit_attributes() +=item fixup_colors() + =back =head1 SUBROUTINES (Insertion functions for editing plots)