Diff for /loncom/xml/lonplot.pm between versions 1.111 and 1.118.2.2

version 1.111, 2005/07/05 15:05:13 version 1.118.2.2, 2007/09/18 23:30:25
Line 36  use Apache::response; Line 36  use Apache::response;
 use Apache::lonxml;  use Apache::lonxml;
 use Apache::edit;  use Apache::edit;
 use Apache::lonnet;  use Apache::lonnet;
   use lib '/home/httpd/lib/perl/';
   use LONCAPA;
    
   
 use vars qw/$weboutputformat $versionstring/;  use vars qw/$weboutputformat $versionstring/;
   
Line 125  my $words_test     = sub {$_[0]=~s/\s+/ Line 128  my $words_test     = sub {$_[0]=~s/\s+/
 ###################################################################  ###################################################################
 my @gnuplot_edit_order =   my @gnuplot_edit_order = 
     qw/alttag bgcolor fgcolor height width font transparent grid samples       qw/alttag bgcolor fgcolor height width font transparent grid samples 
     border align texwidth texfont plotcolor plottype lmargin rmargin tmargin      border align texwidth texfont plotcolor plottype gridtype lmargin rmargin
     bmargin major_ticscale minor_ticscale boxwidth gridlayer fillstyle      tmargin bmargin major_ticscale minor_ticscale boxwidth gridlayer fillstyle
     pattern solid/;      pattern solid/;
   
 my $margin_choices = ['default',0..20];  my $margin_choices = ['default',0..20];
Line 214  my %gnuplot_defaults = Line 217  my %gnuplot_defaults =
  choices     => ['100','200','500','1000','2000','5000']   choices     => ['100','200','500','1000','2000','5000']
  },   },
      align        => {       align        => {
  default     => 'center',   default     => 'middle',
  test        => sub {$_[0]=~/^(left|right|center)$/},   test        => sub {$_[0]=~/^(left|right|middle|center)$/},
  description => 'alignment for image in html',   description => 'alignment for image in html',
  edit_type   => 'choice',   edit_type   => 'choice',
  choices     => ['left','right','center']   choices     => ['left','right','middle']
  },   },
      texwidth     => {       texwidth     => {
          default     => '93',           default     => '93',
Line 269  my %gnuplot_defaults = Line 272  my %gnuplot_defaults =
  edit_type   => 'choice',   edit_type   => 'choice',
          choices     => ['Cartesian','Polar']           choices     => ['Cartesian','Polar']
          },           },
        gridtype     => {
    default     => 'Cartesian',
    test        => sub {$_[0]=~/^(Polar|Cartesian|Linear-Log|Log-Linear|Log-Log)$/},
    description => 'Grid type:',
    edit_type   => 'choice',
            choices     => ['Cartesian','Polar','Linear-Log','Log-Linear','Log-Log']
            },
      lmargin      => {       lmargin      => {
  default     => 'default',   default     => 'default',
  test        => sub {$_[0]=~/^(default|\d+)$/},   test        => sub {$_[0]=~/^(default|\d+)$/},
Line 457  my %axis_defaults = Line 467  my %axis_defaults =
  }   }
      );       );
   
 my @curve_edit_order = ('color','name','linestyle','pointtype','pointsize','limit');  my @curve_edit_order = ('color','name','linestyle','linewidth','pointtype','pointsize','limit');
   
 my %curve_defaults =   my %curve_defaults = 
     (      (
Line 482  my %curve_defaults = Line 492  my %curve_defaults =
  edit_type   => 'choice',   edit_type   => 'choice',
  choices     => [keys(%linestyles)]   choices     => [keys(%linestyles)]
  },   },
 # gnuplots term=gif driver does not handle linewidth :(       linewidth => {
 #     linewidth => {           default     => 1,
 #         default     => 1,           test        => $int_test,
 #         test        => $int_test,           description => 'Line width (may not apply to all line styles)',
 #         description => 'Line width (may not apply to all line styles)',           edit_type   => 'choice',
 #         edit_type   => 'choice',           choices     => [1,2,3,4,5,6,7,8,9,10]
 #         choices     => [1,2,3,4,5,6,7,8,9,10]           },
 #         },  
      pointsize => {       pointsize => {
          default     => 1,           default     => 1,
          test        => $pos_real_test,           test        => $pos_real_test,
Line 540  sub start_gnuplot { Line 549  sub start_gnuplot {
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result .= &Apache::edit::tag_start($target,$token,'GnuPlot');   $result .= &Apache::edit::tag_start($target,$token,'GnuPlot');
  $result .= &edit_attributes($target,$token,\%gnuplot_defaults,   $result .= &edit_attributes($target,$token,\%gnuplot_defaults,
     \@gnuplot_edit_order);      \@gnuplot_edit_order)
       .&Apache::edit::end_row()
       .&Apache::edit::start_spanning_row();
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  my $constructtag=&Apache::edit::get_new_args   my $constructtag=&Apache::edit::get_new_args
     ($token,$parstack,$safeeval,keys(%gnuplot_defaults));      ($token,$parstack,$safeeval,keys(%gnuplot_defaults));
Line 574  sub end_gnuplot { Line 585  sub end_gnuplot {
     '_'.time.'_'.$$.$randnumber.'_plot';      '_'.time.'_'.$$.$randnumber.'_plot';
  ## Write the plot description to the file   ## Write the plot description to the file
  &write_gnuplot_file($tmpdir,$filename,$target);   &write_gnuplot_file($tmpdir,$filename,$target);
  $filename = &Apache::lonnet::escape($filename);   $filename = &escape($filename);
  ## return image tag for the plot   ## return image tag for the plot
  if ($target eq 'web') {   if ($target eq 'web') {
     $result .= <<"ENDIMAGE";      $result .= <<"ENDIMAGE";
 <img src    = "/cgi-bin/plot.gif?file=$filename.data&output=$weboutputformat"   <img src    = "/cgi-bin/plot.$weboutputformat?file=$filename.data" 
      width  = "$Apache::lonplot::plot{'width'}"       width  = "$Apache::lonplot::plot{'width'}"
      height = "$Apache::lonplot::plot{'height'}"       height = "$Apache::lonplot::plot{'height'}"
      align  = "$Apache::lonplot::plot{'align'}"       align  = "$Apache::lonplot::plot{'align'}"
Line 591  ENDIMAGE Line 602  ENDIMAGE
     &Apache::lonxml::register_ssi("/cgi-bin/plot.gif?file=$filename.data&output=eps");      &Apache::lonxml::register_ssi("/cgi-bin/plot.gif?file=$filename.data&output=eps");
     $result  = "%DYNAMICIMAGE:$Apache::lonplot::plot{'width'}:$Apache::lonplot::plot{'height'}:$Apache::lonplot::plot{'texwidth'}\n";      $result  = "%DYNAMICIMAGE:$Apache::lonplot::plot{'width'}:$Apache::lonplot::plot{'height'}:$Apache::lonplot::plot{'texwidth'}\n";
     $result .= '\graphicspath{{/home/httpd/perl/tmp/}}'."\n";      $result .= '\graphicspath{{/home/httpd/perl/tmp/}}'."\n";
     $result .= '\includegraphics[width='.$Apache::lonplot::plot{'texwidth'}.' mm]{'.&Apache::lonnet::unescape($filename).'.eps}';      $result .= '\includegraphics[width='.$Apache::lonplot::plot{'texwidth'}.' mm]{'.&unescape($filename).'.eps}';
  }   }
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result.=&Apache::edit::tag_end($target,$token);   $result.=&Apache::edit::tag_end($target,$token);
Line 698  sub start_title { Line 709  sub start_title {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';      my $result='';
     if ($target eq 'web' || $target eq 'tex') {      if ($target eq 'web' || $target eq 'tex') {
  $title = &Apache::lonxml::get_all_text("/title",$parser);   $title = &Apache::lonxml::get_all_text("/title",$parser,$style);
  $title=&Apache::run::evaluate($title,$safeeval,$$parstack[-1]);   $title=&Apache::run::evaluate($title,$safeeval,$$parstack[-1]);
  $title =~ s/\n/ /g;   $title =~ s/\n/ /g;
  if (length($title) > $max_str_len) {   if (length($title) > $max_str_len) {
Line 706  sub start_title { Line 717  sub start_title {
  }   }
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result.=&Apache::edit::tag_start($target,$token,'Plot Title');   $result.=&Apache::edit::tag_start($target,$token,'Plot Title');
  my $text=&Apache::lonxml::get_all_text("/title",$parser);   my $text=&Apache::lonxml::get_all_text("/title",$parser,$style);
  $result.=&Apache::edit::end_row().   $result.=&Apache::edit::editline('',$text,'',60);
     &Apache::edit::start_spanning_row().  
     &Apache::edit::editline('',$text,'',60);  
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  $result.=&Apache::edit::rebuild_tag($token);   $result.=&Apache::edit::rebuild_tag($token);
  $result.=&Apache::edit::modifiedfield("/title",$parser);   $result.=&Apache::edit::modifiedfield("/title",$parser);
Line 731  sub start_xlabel { Line 740  sub start_xlabel {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';      my $result='';
     if ($target eq 'web' || $target eq 'tex') {      if ($target eq 'web' || $target eq 'tex') {
  $xlabel = &Apache::lonxml::get_all_text("/xlabel",$parser);   $xlabel = &Apache::lonxml::get_all_text("/xlabel",$parser,$style);
  $xlabel=&Apache::run::evaluate($xlabel,$safeeval,$$parstack[-1]);   $xlabel=&Apache::run::evaluate($xlabel,$safeeval,$$parstack[-1]);
  $xlabel =~ s/\n/ /g;   $xlabel =~ s/\n/ /g;
  if (length($xlabel) > $max_str_len) {   if (length($xlabel) > $max_str_len) {
Line 739  sub start_xlabel { Line 748  sub start_xlabel {
  }   }
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result.=&Apache::edit::tag_start($target,$token,'Plot Xlabel');   $result.=&Apache::edit::tag_start($target,$token,'Plot Xlabel');
  my $text=&Apache::lonxml::get_all_text("/xlabel",$parser);   my $text=&Apache::lonxml::get_all_text("/xlabel",$parser,$style);
  $result.=&Apache::edit::end_row().   $result.=&Apache::edit::editline('',$text,'',60);
     &Apache::edit::start_spanning_row().  
     &Apache::edit::editline('',$text,'',60);  
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  $result.=&Apache::edit::rebuild_tag($token);   $result.=&Apache::edit::rebuild_tag($token);
  $result.=&Apache::edit::modifiedfield("/xlabel",$parser);   $result.=&Apache::edit::modifiedfield("/xlabel",$parser);
Line 765  sub start_ylabel { Line 772  sub start_ylabel {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';      my $result='';
     if ($target eq 'web' || $target eq 'tex') {      if ($target eq 'web' || $target eq 'tex') {
  $ylabel = &Apache::lonxml::get_all_text("/ylabel",$parser);   $ylabel = &Apache::lonxml::get_all_text("/ylabel",$parser,$style);
  $ylabel = &Apache::run::evaluate($ylabel,$safeeval,$$parstack[-1]);   $ylabel = &Apache::run::evaluate($ylabel,$safeeval,$$parstack[-1]);
  $ylabel =~ s/\n/ /g;   $ylabel =~ s/\n/ /g;
  if (length($ylabel) > $max_str_len) {   if (length($ylabel) > $max_str_len) {
Line 773  sub start_ylabel { Line 780  sub start_ylabel {
  }   }
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result .= &Apache::edit::tag_start($target,$token,'Plot Ylabel');   $result .= &Apache::edit::tag_start($target,$token,'Plot Ylabel');
  my $text = &Apache::lonxml::get_all_text("/ylabel",$parser);   my $text = &Apache::lonxml::get_all_text("/ylabel",$parser,$style);
  $result .= &Apache::edit::end_row().   $result .= &Apache::edit::editline('',$text,'',60);
     &Apache::edit::start_spanning_row().  
     &Apache::edit::editline('',$text,'',60);  
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  $result.=&Apache::edit::rebuild_tag($token);   $result.=&Apache::edit::rebuild_tag($token);
  $result.=&Apache::edit::modifiedfield("/ylabel",$parser);   $result.=&Apache::edit::modifiedfield("/ylabel",$parser);
Line 802  sub start_label { Line 807  sub start_label {
  my %label;   my %label;
  &get_attributes(\%label,\%label_defaults,$parstack,$safeeval,   &get_attributes(\%label,\%label_defaults,$parstack,$safeeval,
     $tagstack->[-1]);      $tagstack->[-1]);
  my $text = &Apache::lonxml::get_all_text("/label",$parser);   my $text = &Apache::lonxml::get_all_text("/label",$parser,$style);
  $text = &Apache::run::evaluate($text,$safeeval,$$parstack[-1]);   $text = &Apache::run::evaluate($text,$safeeval,$$parstack[-1]);
  $text =~ s/\n/ /g;   $text =~ s/\n/ /g;
  $text = substr($text,0,$max_str_len) if (length($text) > $max_str_len);   $text = substr($text,0,$max_str_len) if (length($text) > $max_str_len);
Line 811  sub start_label { Line 816  sub start_label {
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result .= &Apache::edit::tag_start($target,$token,'Plot Label');   $result .= &Apache::edit::tag_start($target,$token,'Plot Label');
  $result .= &edit_attributes($target,$token,\%label_defaults);   $result .= &edit_attributes($target,$token,\%label_defaults);
  my $text = &Apache::lonxml::get_all_text("/label",$parser);   my $text = &Apache::lonxml::get_all_text("/label",$parser,$style);
  $result .= &Apache::edit::end_row().   $result .= &Apache::edit::end_row().
     &Apache::edit::start_spanning_row().      &Apache::edit::start_spanning_row().
     &Apache::edit::editline('',$text,'',60);      &Apache::edit::editline('',$text,'',60);
Line 848  sub start_curve { Line 853  sub start_curve {
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result .= &Apache::edit::tag_start($target,$token,'Curve');   $result .= &Apache::edit::tag_start($target,$token,'Curve');
  $result .= &edit_attributes($target,$token,\%curve_defaults,   $result .= &edit_attributes($target,$token,\%curve_defaults,
                                     \@curve_edit_order);                                      \@curve_edit_order)
       .&Apache::edit::end_row()
       .&Apache::edit::start_spanning_row();
   
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  my $constructtag=&Apache::edit::get_new_args   my $constructtag=&Apache::edit::get_new_args
     ($token,$parstack,$safeeval,keys(%curve_defaults));      ($token,$parstack,$safeeval,keys(%curve_defaults));
  if ($constructtag) {   if ($constructtag) {
     $result = &Apache::edit::rebuild_tag($token);      $result = &Apache::edit::rebuild_tag($token);
     $result.= &Apache::edit::handle_insert();  
  }   }
     }      }
     return $result;      return $result;
Line 885  sub start_function { Line 892  sub start_function {
                  'curve function declaration.');                   'curve function declaration.');
     delete $curves[-1]->{'data'} ;      delete $curves[-1]->{'data'} ;
  }   }
         my $function = &Apache::lonxml::get_all_text("/function",$parser);          my $function = &Apache::lonxml::get_all_text("/function",$parser,
        $style);
  $function = &Apache::run::evaluate($function,$safeeval,$$parstack[-1]);   $function = &Apache::run::evaluate($function,$safeeval,$$parstack[-1]);
  $curves[-1]->{'function'} = $function;    $curves[-1]->{'function'} = $function; 
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result .= &Apache::edit::tag_start($target,$token,'Gnuplot compatible curve function');   $result .= &Apache::edit::tag_start($target,$token,'Gnuplot compatible curve function');
  my $text = &Apache::lonxml::get_all_text("/function",$parser);   my $text = &Apache::lonxml::get_all_text("/function",$parser,$style);
  $result .= &Apache::edit::end_row().   $result .= &Apache::edit::editline('',$text,'',60);
     &Apache::edit::start_spanning_row().  
     &Apache::edit::editline('',$text,'',60);  
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  $result.=&Apache::edit::rebuild_tag($token);   $result.=&Apache::edit::rebuild_tag($token);
  $result.=&Apache::edit::modifiedfield("/function",$parser);   $result.=&Apache::edit::modifiedfield("/function",$parser);
Line 924  sub start_data { Line 930  sub start_data {
                  'curve data declaration.');                   'curve data declaration.');
     delete($curves[-1]->{'function'});      delete($curves[-1]->{'function'});
  }   }
  my $datatext = &Apache::lonxml::get_all_text("/data",$parser);   my $datatext = &Apache::lonxml::get_all_text("/data",$parser,$style);
  $datatext=&Apache::run::evaluate($datatext,$safeeval,$$parstack[-1]);   $datatext=&Apache::run::evaluate($datatext,$safeeval,$$parstack[-1]);
  # Deal with cases where we're given an array...   # Deal with cases where we're given an array...
  if ($datatext =~ /^\@/) {   if ($datatext =~ /^\@/) {
Line 967  sub start_data { Line 973  sub start_data {
  push  @{$curves[-1]->{'data'}},\@data;   push  @{$curves[-1]->{'data'}},\@data;
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result .= &Apache::edit::tag_start($target,$token,'Comma or space deliminated curve data');   $result .= &Apache::edit::tag_start($target,$token,'Comma or space deliminated curve data');
  my $text = &Apache::lonxml::get_all_text("/data",$parser);   my $text = &Apache::lonxml::get_all_text("/data",$parser,$style);
  $result .= &Apache::edit::end_row().   $result .= &Apache::edit::editline('',$text,'',60);
     &Apache::edit::start_spanning_row().  
     &Apache::edit::editline('',$text,'',60);  
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  $result.=&Apache::edit::rebuild_tag($token);   $result.=&Apache::edit::rebuild_tag($token);
  $result.=&Apache::edit::modifiedfield("/data",$parser);   $result.=&Apache::edit::modifiedfield("/data",$parser);
Line 1107  sub write_gnuplot_file { Line 1111  sub write_gnuplot_file {
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $gnuplot_input .= "set term postscript eps $Apache::lonplot::plot{'plotcolor'} solid \"Helvetica\" $pt \n";   $gnuplot_input .= "set term postscript eps $Apache::lonplot::plot{'plotcolor'} solid \"Helvetica\" $pt \n";
  $gnuplot_input .= "set output \"/home/httpd/perl/tmp/".   $gnuplot_input .= "set output \"/home/httpd/perl/tmp/".
     &Apache::lonnet::unescape($filename).".eps\"\n";      &unescape($filename).".eps\"\n";
     }      }
     # cartesian or polar?      # cartesian or polar plot?
     if (lc($Apache::lonplot::plot{'plottype'}) eq 'polar') {      if (lc($Apache::lonplot::plot{'plottype'}) eq 'polar') {
         $gnuplot_input .= 'set polar'.$/;          $gnuplot_input .= 'set polar'.$/;
     } else {      } else {
         # Assume Cartesian          # Assume Cartesian
     }      }
       # cartesian or polar grid?
       if (lc($Apache::lonplot::plot{'gridtype'}) eq 'polar') {
           $gnuplot_input .= 'set grid polar'.$/;
       } elsif (lc($Apache::lonplot::plot{'gridtype'}) eq 'linear-log') {
           $gnuplot_input .= 'set logscale x'.$/;
       } elsif (lc($Apache::lonplot::plot{'gridtype'}) eq 'log-linear') {
           $gnuplot_input .= 'set logscale y'.$/;
       } elsif (lc($Apache::lonplot::plot{'gridtype'}) eq 'log-log') {
           $gnuplot_input .= 'set logscale x'.$/;
           $gnuplot_input .= 'set logscale y'.$/;
       } else {
           # Assume Cartesian
       }
     # solid or pattern for boxes?      # solid or pattern for boxes?
     if (lc($Apache::lonplot::plot{'fillstyle'}) eq 'solid') {      if (lc($Apache::lonplot::plot{'fillstyle'}) eq 'solid') {
         $gnuplot_input .= 'set style fill solid '.          $gnuplot_input .= 'set style fill solid '.
Line 1221  sub write_gnuplot_file { Line 1238  sub write_gnuplot_file {
     for (my $i = 0;$i<=$#curves;$i++) {      for (my $i = 0;$i<=$#curves;$i++) {
  $curve = $curves[$i];   $curve = $curves[$i];
  $gnuplot_input.= ', ' if ($i > 0);   $gnuplot_input.= ', ' if ($i > 0);
    if ($target eq 'tex') {
       $curve->{'linewidth'} *= 2;
    }
  if (exists($curve->{'function'})) {   if (exists($curve->{'function'})) {
     $gnuplot_input.=       $gnuplot_input.= 
  $curve->{'function'}.' title "'.   $curve->{'function'}.' title "'.
  $curve->{'name'}.'" with '.   $curve->{'name'}.'" with '.
                 $curve->{'linestyle'};                  $curve->{'linestyle'};
             $gnuplot_input.= ' linewidth 4 ' if ($target eq 'tex');              $gnuplot_input.= ' linewidth '.$curve->{'linewidth'};
   
             if (($curve->{'linestyle'} eq 'points')      ||              if (($curve->{'linestyle'} eq 'points')      ||
                 ($curve->{'linestyle'} eq 'linespoints') ||                  ($curve->{'linestyle'} eq 'linespoints') ||
                 ($curve->{'linestyle'} eq 'errorbars')   ||                  ($curve->{'linestyle'} eq 'errorbars')   ||
Line 1261  sub write_gnuplot_file { Line 1282  sub write_gnuplot_file {
     $gnuplot_input.= '"'.$datafilename.'" title "'.      $gnuplot_input.= '"'.$datafilename.'" title "'.
  $curve->{'name'}.'" with '.   $curve->{'name'}.'" with '.
  $curve->{'linestyle'};   $curve->{'linestyle'};
             $gnuplot_input.= ' linewidth 4 ' if ($target eq 'tex');              $gnuplot_input.= ' linewidth '.$curve->{'linewidth'};
             if (($curve->{'linestyle'} eq 'points')      ||              if (($curve->{'linestyle'} eq 'points')      ||
                 ($curve->{'linestyle'} eq 'linespoints') ||                  ($curve->{'linestyle'} eq 'linespoints') ||
                 ($curve->{'linestyle'} eq 'errorbars')   ||                  ($curve->{'linestyle'} eq 'errorbars')   ||

Removed from v.1.111  
changed lines
  Added in v.1.118.2.2


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>