Diff for /loncom/xml/lonplot.pm between versions 1.48 and 1.81

version 1.48, 2002/02/06 10:24:55 version 1.81, 2003/02/07 22:03:21
Line 29 Line 29
 # 12/17 12/18 12/19 12/20 12/21 12/27 12/28 12/30 12/31 Matthew  # 12/17 12/18 12/19 12/20 12/21 12/27 12/28 12/30 12/31 Matthew
 # 01/01/02 Matthew  # 01/01/02 Matthew
 # 01/02 01/03 01/04 01/07 01/08 01/09 Matthew  # 01/02 01/03 01/04 01/07 01/08 01/09 Matthew
 # 01/21 02/05 Matthew  # 01/21 02/05 02/06 2/28Matthew
   
 package Apache::lonplot;  package Apache::lonplot;
   
Line 91  my %linestyles = Line 91  my %linestyles =
      yerrorbars    => [3,4],       yerrorbars    => [3,4],
      xyerrorbars    => [4,6],       xyerrorbars    => [4,6],
      boxes          => 3,       boxes          => 3,
 #     boxerrorbars   => [3,4,5],  
 #     boxxyerrorbars => [4,6,7],  
 #     financebars    => 5,  
 #     candlesticks   => 5,  
      vector    => 4       vector    => 4
     );          );    
   
 my $int_test       = sub {$_[0]=~s/\s+//g;$_[0]=~/^\d+$/};  my $int_test       = sub {$_[0]=~s/\s+//g;$_[0]=~/^\d+$/};
 my $real_test      =   my $real_test      = 
     sub {$_[0]=~s/\s+//g;$_[0]=~/^[+-]?\d*\.?\d*([eE][+-]\d+)?$/};      sub {$_[0]=~s/\s+//g;$_[0]=~/^[+-]?\d*\.?\d*([eE][+-]\d+)?$/};
 my $color_test     = sub {$_[0]=~s/\s+//g;$_[0]=~/^x[\da-f]{6}$/};  my $pos_real_test  =
       sub {$_[0]=~s/\s+//g;$_[0]=~/^[+]?\d*\.?\d*([eE][+-]\d+)?$/};
   my $color_test     = sub {$_[0]=~s/\s+//g;$_[0]=~/^x[\da-fA-F]{6}$/};
 my $onoff_test     = sub {$_[0]=~/^(on|off)$/};  my $onoff_test     = sub {$_[0]=~/^(on|off)$/};
 my $key_pos_test   = sub {$_[0]=~/^(top|bottom|right|left|outside|below| )+$/};  my $key_pos_test   = sub {$_[0]=~/^(top|bottom|right|left|outside|below| )+$/};
 my $sml_test       = sub {$_[0]=~/^(small|medium|large)$/};  my $sml_test       = sub {$_[0]=~/^(small|medium|large)$/};
 my $linestyle_test = sub {exists($linestyles{$_[0]})};  my $linestyle_test = sub {exists($linestyles{$_[0]})};
 my $words_test     = sub {$_[0]=~s/\s+/ /g;$_[0]=~/^([\w\(\)]+ ?)+$/};  my $words_test     = sub {$_[0]=~s/\s+/ /g;$_[0]=~/^([\w~!\@\#\$\%^&\*\(\)-=_\+\[\]\{\}:\;\'<>,\.\/\?\\]+ ?)+$/};
   
 ###################################################################  ###################################################################
 ##                                                               ##  ##                                                               ##
Line 114  my $words_test     = sub {$_[0]=~s/\s+/ Line 112  my $words_test     = sub {$_[0]=~s/\s+/
 ##                                                               ##  ##                                                               ##
 ###################################################################  ###################################################################
 my @gnuplot_edit_order =   my @gnuplot_edit_order = 
     qw/bgcolor fgcolor height width font transparent grid border align/;      qw/alttag bgcolor fgcolor height width font transparent grid samples border align/;
   
 my $gnuplot_help_text = <<"ENDPLOTHELP";  my $gnuplot_help_text = <<"ENDPLOTHELP";
 <p>  <p>
Line 144  A <b>gnuplot</b> tag can contain the fol Line 142  A <b>gnuplot</b> tag can contain the fol
     <dd> Allows specification of the x and y coordinate 'tics' on the axes.      <dd> Allows specification of the x and y coordinate 'tics' on the axes.
 This is mostly used to adjust the grid lines when a grid is displayed.  This is mostly used to adjust the grid lines when a grid is displayed.
 </dl>  </dl>
   If you are having trouble with your plot, please read the help
   available on Plot Curve.
 ENDPLOTHELP  ENDPLOTHELP
   
 my %gnuplot_defaults =   my %gnuplot_defaults = 
     (      (
        alttag       => {
    default     => 'dynamically generated plot',
    test        => $words_test,
    description => 'brief description of the plot',
         edit_type   => 'entry',
    size        => '40'
    },
      height       => {       height       => {
  default     => 200,   default     => 300,
  test        => $int_test,   test        => $int_test,
  description => 'height of image (pixels)',   description => 'height of image (pixels)',
       edit_type   => 'entry',        edit_type   => 'entry',
  size        => '10'   size        => '10'
  },   },
      width        => {       width        => {
  default     => 200,   default     => 400,
  test        => $int_test,   test        => $int_test,
  description => 'width of image (pixels)',   description => 'width of image (pixels)',
  edit_type   => 'entry',   edit_type   => 'entry',
Line 183  my %gnuplot_defaults = Line 190  my %gnuplot_defaults =
  edit_type   => 'onoff'   edit_type   => 'onoff'
  },   },
      grid         => {       grid         => {
  default     => 'off',   default     => 'on',
  test        => $onoff_test,    test        => $onoff_test, 
  description => 'Display grid',   description => 'Display grid',
  edit_type   => 'onoff'   edit_type   => 'onoff'
Line 201  my %gnuplot_defaults = Line 208  my %gnuplot_defaults =
  edit_type   => 'choice',   edit_type   => 'choice',
  choices     => ['small','medium','large']   choices     => ['small','medium','large']
  },   },
        samples         => {
    default     => '100',
    test        => $int_test,
    description => 'Number of samples for non-data plots',
    edit_type   => 'choice',
    choices     => ['100','200','500','1000','2000','5000']
    },
      align        => {       align        => {
  default     => 'left',   default     => 'center',
  test        => sub {$_[0]=~/^(left|right|center)$/},   test        => sub {$_[0]=~/^(left|right|center)$/},
  description => 'alignment for image in html',   description => 'alignment for image in html',
  edit_type   => 'choice',   edit_type   => 'choice',
Line 299  my %tic_defaults = Line 313  my %tic_defaults =
  },   },
      );       );
   
   my @axis_edit_order = ('color','xmin','xmax','ymin','ymax');
 my %axis_defaults =   my %axis_defaults = 
     (      (
      color   => {       color   => {
  default => 'x000000',    default => 'x000000', 
  test => $color_test,   test => $color_test,
  description => 'color of axes (x000000)',   description => 'color of grid lines (x000000)',
  edit_type   => 'entry',   edit_type   => 'entry',
  size        => '10'   size        => '10'
  },   },
Line 360  first tag will be the X data and the sec Line 375  first tag will be the X data and the sec
 </p>  </p>
     <dt> Curve Function      <dt> Curve Function
     <dd> The <b>function</b> tag allows you to specify the curve to be       <dd> The <b>function</b> tag allows you to specify the curve to be 
 plotted as a formula that gnuplot can understand.  Be careful using this  plotted as a formula that gnuplot can understand.  <b>Be careful using this
 tag - it is surprisingly easy to give gnuplot a function it cannot deal  tag.</b>  It is surprisingly easy to give gnuplot a function it cannot deal
 with properly.  Be explicit: 2*sin(2*3.141592*x/4) will work but  with properly.  Be explicit: 2*sin(2*3.141592*x/4) will work but
 2sin(2*3.141592x/4) will not.  If you do not receive any errors in the  2sin(2*3.141592x/4) will not.  If you do not receive any errors in the
 gnuplot data but still do not have an image produced, it is likely there  gnuplot data but still do not have an image produced, it is likely there
Line 369  is an error in your <b>function</b> tag. Line 384  is an error in your <b>function</b> tag.
 </dl>  </dl>
 ENDCURVEHELP  ENDCURVEHELP
   
   my @curve_edit_order = ('color','name','linestyle','pointtype','pointsize');
   
 my %curve_defaults =   my %curve_defaults = 
     (      (
      color     => {       color     => {
Line 391  my %curve_defaults = Line 408  my %curve_defaults =
  description => 'Line style',   description => 'Line style',
  edit_type   => 'choice',   edit_type   => 'choice',
  choices     => [keys(%linestyles)]   choices     => [keys(%linestyles)]
  }   },
   # gnuplots term=gif driver does not handle linewidth :(
   #     linewidth => {
   #         default     => 1,
   #         test        => $int_test,
   #         description => 'Line width (may not apply to all line styles)',
   #         edit_type   => 'choice',
   #         choices     => [1,2,3,4,5,6,7,8,9,10]
   #         },
        pointsize => {
            default     => 1,
            test        => $pos_real_test,
            description => 'point size (may not apply to all line styles)',
            edit_type   => 'entry',
            size        => '5'
            },
        pointtype => {
            default     => 1,
            test        => $int_test,
            description => 'point type (may not apply to all line styles)',
            edit_type   => 'choice',
            choices     => [0,1,2,3,4,5,6]
            }
      );       );
   
 ###################################################################  ###################################################################
Line 413  sub start_gnuplot { Line 452  sub start_gnuplot {
      ('title','xlabel','ylabel','key','axis','label','curve',       ('title','xlabel','ylabel','key','axis','label','curve',
       'xtics','ytics'));        'xtics','ytics'));
     push (@Apache::lonxml::namespace,'lonplot');      push (@Apache::lonxml::namespace,'lonplot');
     if ($target eq 'web') {      if ($target eq 'web' || $target eq 'tex') {
  my $inside = &Apache::lonxml::get_all_text("/gnuplot",$$parser[-1]);  
  $inside=&Apache::run::evaluate($inside,$safeeval,$$parstack[-1]);  
  &Apache::lonxml::newparser($parser,\$inside);  
  &get_attributes(\%plot,\%gnuplot_defaults,$parstack,$safeeval,   &get_attributes(\%plot,\%gnuplot_defaults,$parstack,$safeeval,
  $tagstack->[-1]);   $tagstack->[-1]);
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
Line 441  sub end_gnuplot { Line 477  sub end_gnuplot {
     &Apache::lonxml::deregister('Apache::lonplot',      &Apache::lonxml::deregister('Apache::lonplot',
  ('title','xlabel','ylabel','key','axis','label','curve'));   ('title','xlabel','ylabel','key','axis','label','curve'));
     my $result = '';      my $result = '';
     if ($target eq 'web') {      my $randnumber;
       # need to call rand everytime start_script would evaluate, as the
       # safe space rand number generator and the global rand generator 
       # are not seperate
       if ($target eq 'web' || $target eq 'tex' || $target eq 'grade' ||
    $target eq 'answer') {
         $randnumber=int(rand(1000));
       }
       if ($target eq 'web' || $target eq 'tex') {
  &check_inputs(); # Make sure we have all the data we need   &check_inputs(); # Make sure we have all the data we need
  ##   ##
  ## Determine filename   ## Determine filename
  my $tmpdir = '/home/httpd/perl/tmp/';   my $tmpdir = '/home/httpd/perl/tmp/';
  my $filename = $ENV{'user.name'}.'_'.$ENV{'user.domain'}.   my $filename = $ENV{'user.name'}.'_'.$ENV{'user.domain'}.
     '_'.time.'_'.$$.int(rand(1000)).'_plot.data';      '_'.time.'_'.$$.$randnumber.'_plot';
  ## Write the plot description to the file   ## Write the plot description to the file
  &write_gnuplot_file($tmpdir,$filename);   &write_gnuplot_file($tmpdir,$filename,$target);
    $filename = &Apache::lonnet::escape($filename);
  ## return image tag for the plot   ## return image tag for the plot
  $result .= <<"ENDIMAGE";   if ($target eq 'web') {
 <img src    = "/cgi-bin/plot.gif?$filename"       $result .= <<"ENDIMAGE";
      width  = "$plot{'width'}"   <img src    = "/cgi-bin/plot.gif?file=$filename.data&output=gif" 
        width  = "$plot{'width'}"
      height = "$plot{'height'}"       height = "$plot{'height'}"
      align  = "$plot{'align'}"       align  = "$plot{'align'}"
      alt    = "image should be /cgi-bin/plot.gif?$filename" />       alt    = "$plot{'alttag'}" />
 ENDIMAGE  ENDIMAGE
           } elsif ($target eq 'tex') {
       &Apache::lonnet::ssi("/cgi-bin/plot.gif?file=$filename.data&output=eps");
       $result = '\graphicspath{{/home/httpd/perl/tmp/}}\includegraphics{'.&Apache::lonnet::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 469  ENDIMAGE Line 519  ENDIMAGE
 sub start_xtics {  sub start_xtics {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';      my $result='';
     if ($target eq 'web') {      if ($target eq 'web' || $target eq 'tex') {
  &get_attributes(\%xtics,\%tic_defaults,$parstack,$safeeval,   &get_attributes(\%xtics,\%tic_defaults,$parstack,$safeeval,
     $tagstack->[-1]);      $tagstack->[-1]);
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
Line 489  sub start_xtics { Line 539  sub start_xtics {
 sub end_xtics {  sub end_xtics {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result = '';      my $result = '';
     if ($target eq 'web') {      if ($target eq 'web' || $target eq 'tex') {
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result.=&Apache::edit::tag_end($target,$token);   $result.=&Apache::edit::tag_end($target,$token);
     }      }
Line 500  sub end_xtics { Line 550  sub end_xtics {
 sub start_ytics {  sub start_ytics {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';      my $result='';
     if ($target eq 'web') {      if ($target eq 'web' || $target eq 'tex') {
  &get_attributes(\%ytics,\%tic_defaults,$parstack,$safeeval,   &get_attributes(\%ytics,\%tic_defaults,$parstack,$safeeval,
     $tagstack->[-1]);      $tagstack->[-1]);
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
Line 520  sub start_ytics { Line 570  sub start_ytics {
 sub end_ytics {  sub end_ytics {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result = '';      my $result = '';
     if ($target eq 'web') {      if ($target eq 'web' || $target eq 'tex') {
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result.=&Apache::edit::tag_end($target,$token);   $result.=&Apache::edit::tag_end($target,$token);
     }      }
Line 532  sub end_ytics { Line 582  sub end_ytics {
 sub start_key {  sub start_key {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';      my $result='';
     if ($target eq 'web') {      if ($target eq 'web' || $target eq 'tex') {
  &get_attributes(\%key,\%key_defaults,$parstack,$safeeval,   &get_attributes(\%key,\%key_defaults,$parstack,$safeeval,
     $tagstack->[-1]);      $tagstack->[-1]);
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
Line 551  sub start_key { Line 601  sub start_key {
 sub end_key {  sub end_key {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result = '';      my $result = '';
     if ($target eq 'web') {      if ($target eq 'web' || $target eq 'tex') {
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result.=&Apache::edit::tag_end($target,$token);   $result.=&Apache::edit::tag_end($target,$token);
     }      }
Line 562  sub end_key { Line 612  sub end_key {
 sub start_title {  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') {      if ($target eq 'web' || $target eq 'tex') {
  $title = &Apache::lonxml::get_all_text("/title",$$parser[-1]);   $title = &Apache::lonxml::get_all_text("/title",$parser);
    $title=&Apache::run::evaluate($title,$safeeval,$$parstack[-1]);
    $title =~ s/\n/ /g;
  if (length($title) > $max_str_len) {   if (length($title) > $max_str_len) {
     $title = substr($title,0,$max_str_len);      $title = substr($title,0,$max_str_len);
  }   }
     } 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[-1]);   my $text=&Apache::lonxml::get_all_text("/title",$parser);
  $result.=&Apache::edit::end_row().   $result.=&Apache::edit::end_row().
     &Apache::edit::start_spanning_row().      &Apache::edit::start_spanning_row().
     &Apache::edit::editfield('',$text,'',60,1);      &Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  my $text=$$parser[-1]->get_text("/title");   my $text=$$parser[-1]->get_text("/title");
  $result.=&Apache::edit::rebuild_tag($token);   $result.=&Apache::edit::rebuild_tag($token);
Line 584  sub start_title { Line 636  sub start_title {
 sub end_title {  sub end_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') {      if ($target eq 'web' || $target eq 'tex') {
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result.=&Apache::edit::tag_end($target,$token);   $result.=&Apache::edit::tag_end($target,$token);
     }      }
Line 594  sub end_title { Line 646  sub end_title {
 sub start_xlabel {  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') {      if ($target eq 'web' || $target eq 'tex') {
  $xlabel = &Apache::lonxml::get_all_text("/xlabel",$$parser[-1]);   $xlabel = &Apache::lonxml::get_all_text("/xlabel",$parser);
    $xlabel=&Apache::run::evaluate($xlabel,$safeeval,$$parstack[-1]);
    $xlabel =~ s/\n/ /g;
  if (length($xlabel) > $max_str_len) {   if (length($xlabel) > $max_str_len) {
     $xlabel = substr($xlabel,0,$max_str_len);      $xlabel = substr($xlabel,0,$max_str_len);
  }   }
     } 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[-1]);   my $text=&Apache::lonxml::get_all_text("/xlabel",$parser);
  $result.=&Apache::edit::end_row().   $result.=&Apache::edit::end_row().
     &Apache::edit::start_spanning_row().      &Apache::edit::start_spanning_row().
     &Apache::edit::editfield('',$text,'',60,1);      &Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  my $text=$$parser[-1]->get_text("/xlabel");   my $text=$$parser[-1]->get_text("/xlabel");
  $result.=&Apache::edit::rebuild_tag($token);   $result.=&Apache::edit::rebuild_tag($token);
Line 616  sub start_xlabel { Line 670  sub start_xlabel {
 sub end_xlabel {  sub end_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') {      if ($target eq 'web' || $target eq 'tex') {
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result.=&Apache::edit::tag_end($target,$token);   $result.=&Apache::edit::tag_end($target,$token);
     }      }
Line 627  sub end_xlabel { Line 681  sub end_xlabel {
 sub start_ylabel {  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') {      if ($target eq 'web' || $target eq 'tex') {
  $ylabel = &Apache::lonxml::get_all_text("/ylabel",$$parser[-1]);   $ylabel = &Apache::lonxml::get_all_text("/ylabel",$parser);
    $ylabel = &Apache::run::evaluate($ylabel,$safeeval,$$parstack[-1]);
    $ylabel =~ s/\n/ /g;
  if (length($ylabel) > $max_str_len) {   if (length($ylabel) > $max_str_len) {
     $ylabel = substr($ylabel,0,$max_str_len);      $ylabel = substr($ylabel,0,$max_str_len);
  }   }
     } 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[-1]);   my $text = &Apache::lonxml::get_all_text("/ylabel",$parser);
  $result .= &Apache::edit::end_row().   $result .= &Apache::edit::end_row().
     &Apache::edit::start_spanning_row().      &Apache::edit::start_spanning_row().
     &Apache::edit::editfield('',$text,'',60,1);      &Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  my $text=$$parser[-1]->get_text("/ylabel");   my $text=$$parser[-1]->get_text("/ylabel");
  $result.=&Apache::edit::rebuild_tag($token);   $result.=&Apache::edit::rebuild_tag($token);
Line 649  sub start_ylabel { Line 705  sub start_ylabel {
 sub end_ylabel {  sub end_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') {      if ($target eq 'web' || $target eq 'tex') {
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result.=&Apache::edit::tag_end($target,$token);   $result.=&Apache::edit::tag_end($target,$token);
     }      }
Line 660  sub end_ylabel { Line 716  sub end_ylabel {
 sub start_label {  sub start_label {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';      my $result='';
     if ($target eq 'web') {      if ($target eq 'web' || $target eq 'tex') {
  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[-1]);   my $text = &Apache::lonxml::get_all_text("/label",$parser);
    $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);   $text = substr($text,0,$max_str_len) if (length($text) > $max_str_len);
  $label{'text'} = $text;   $label{'text'} = $text;
  push(@labels,\%label);   push(@labels,\%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[-1]);   my $text = &Apache::lonxml::get_all_text("/label",$parser);
  $result .= &Apache::edit::end_row().   $result .= &Apache::edit::end_row().
     &Apache::edit::start_spanning_row().      &Apache::edit::start_spanning_row().
     &Apache::edit::editfield('',$text,'',60,1);      &Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  &Apache::edit::get_new_args   &Apache::edit::get_new_args
     ($token,$parstack,$safeeval,keys(%label_defaults));      ($token,$parstack,$safeeval,keys(%label_defaults));
Line 688  sub start_label { Line 746  sub start_label {
 sub end_label {  sub end_label {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result = '';      my $result = '';
     if ($target eq 'web') {      if ($target eq 'web' || $target eq 'tex') {
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result.=&Apache::edit::tag_end($target,$token);   $result.=&Apache::edit::tag_end($target,$token);
     }      }
Line 701  sub start_curve { Line 759  sub start_curve {
     my $result='';      my $result='';
     &Apache::lonxml::register('Apache::lonplot',('function','data'));      &Apache::lonxml::register('Apache::lonplot',('function','data'));
     push (@Apache::lonxml::namespace,'curve');      push (@Apache::lonxml::namespace,'curve');
     if ($target eq 'web') {      if ($target eq 'web' || $target eq 'tex') {
  my %curve;   my %curve;
  &get_attributes(\%curve,\%curve_defaults,$parstack,$safeeval,   &get_attributes(\%curve,\%curve_defaults,$parstack,$safeeval,
     $tagstack->[-1]);      $tagstack->[-1]);
Line 709  sub start_curve { Line 767  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 .= &help_win($curve_help_text);   $result .= &help_win($curve_help_text);
  $result .= &edit_attributes($target,$token,\%curve_defaults);   $result .= &edit_attributes($target,$token,\%curve_defaults,
                                       \@curve_edit_order);
     } 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));
Line 726  sub end_curve { Line 785  sub end_curve {
     my $result = '';      my $result = '';
     pop @Apache::lonxml::namespace;      pop @Apache::lonxml::namespace;
     &Apache::lonxml::deregister('Apache::lonplot',('function','data'));      &Apache::lonxml::deregister('Apache::lonplot',('function','data'));
     if ($target eq 'web') {      if ($target eq 'web' || $target eq 'tex') {
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result.=&Apache::edit::tag_end($target,$token);   $result.=&Apache::edit::tag_end($target,$token);
     }      }
Line 737  sub end_curve { Line 796  sub end_curve {
 sub start_function {  sub start_function {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';      my $result='';
     if ($target eq 'web') {      if ($target eq 'web' || $target eq 'tex') {
  if (exists($curves[-1]->{'data'})) {   if (exists($curves[-1]->{'data'})) {
     &Apache::lonxml::warning('Use of <function> precludes use of <data>.  The <data> will be omitted in favor of the <function> declaration.');      &Apache::lonxml::warning('Use of <function> precludes use of <data>.  The <data> will be omitted in favor of the <function> declaration.');
     delete $curves[-1]->{'data'} ;      delete $curves[-1]->{'data'} ;
  }   }
  $curves[-1]->{'function'} =           my $function = &Apache::lonxml::get_all_text("/function",$parser);
     &Apache::lonxml::get_all_text("/function",$$parser[-1]);   $function = &Apache::run::evaluate($function,$safeeval,$$parstack[-1]);
    $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[-1]);   my $text = &Apache::lonxml::get_all_text("/function",$parser);
  $result .= &Apache::edit::end_row().   $result .= &Apache::edit::end_row().
     &Apache::edit::start_spanning_row().      &Apache::edit::start_spanning_row().
     &Apache::edit::editfield('',$text,'',60,1);      &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);
  my $text=$$parser[-1]->get_text("/function");   my $text=$$parser[-1]->get_text("/function");
Line 761  sub start_function { Line 821  sub start_function {
 sub end_function {  sub end_function {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result = '';      my $result = '';
     if ($target eq 'web') {      if ($target eq 'web' || $target eq 'tex') {
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result .= &Apache::edit::end_table();   $result .= &Apache::edit::end_table();
     }      }
Line 772  sub end_function { Line 832  sub end_function {
 sub start_data {  sub start_data {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';      my $result='';
     if ($target eq 'web') {      if ($target eq 'web' || $target eq 'tex') {
  if (exists($curves[-1]->{'function'})) {   if (exists($curves[-1]->{'function'})) {
     &Apache::lonxml::warning('Use of <data> precludes use of .'.      &Apache::lonxml::warning('Use of <data> precludes use of .'.
     '<function>.  The <function> will be omitted in favor of '.      '<function>.  The <function> will be omitted in favor of '.
             'the <data> declaration.');              'the <data> declaration.');
     delete($curves[-1]->{'function'});      delete($curves[-1]->{'function'});
  }   }
  my $datatext = &Apache::lonxml::get_all_text("/data",$$parser[-1]);   my $datatext = &Apache::lonxml::get_all_text("/data",$parser);
    $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 =~ /^\@/) {
     $datatext = &Apache::run::run('return "'.$datatext.'"',      $datatext = &Apache::run::run('return "'.$datatext.'"',
   $safeeval,1);    $safeeval,1);
  }   }
  $datatext =~ s/\s+/ /g;     $datatext =~ s/\s+/ /g;
  # Need to do some error checking on the @data array -    # Need to do some error checking on the @data array - 
  # make sure it's all numbers and make sure each array    # make sure it's all numbers and make sure each array 
  # is of the same length.   # is of the same length.
Line 821  sub start_data { Line 882  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[-1]);   my $text = &Apache::lonxml::get_all_text("/data",$parser);
  $result .= &Apache::edit::end_row().   $result .= &Apache::edit::end_row().
     &Apache::edit::start_spanning_row().      &Apache::edit::start_spanning_row().
     &Apache::edit::editfield('',$text,'',60,1);      &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);
  my $text=$$parser[-1]->get_text("/data");   my $text=$$parser[-1]->get_text("/data");
Line 836  sub start_data { Line 897  sub start_data {
 sub end_data {  sub end_data {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result = '';      my $result = '';
     if ($target eq 'web') {      if ($target eq 'web' || $target eq 'tex') {
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result .= &Apache::edit::end_table();   $result .= &Apache::edit::end_table();
     }      }
Line 847  sub end_data { Line 908  sub end_data {
 sub start_axis {  sub start_axis {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';      my $result='';
     if ($target eq 'web') {      if ($target eq 'web' || $target eq 'tex') {
  &get_attributes(\%axis,\%axis_defaults,$parstack,$safeeval,   &get_attributes(\%axis,\%axis_defaults,$parstack,$safeeval,
  $tagstack->[-1]);   $tagstack->[-1]);
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result .= &Apache::edit::tag_start($target,$token,'Plot Axes');   $result .= &Apache::edit::tag_start($target,$token,'Plot Axes');
  $result .= &edit_attributes($target,$token,\%axis_defaults);   $result .= &edit_attributes($target,$token,\%axis_defaults,
       \@axis_edit_order);
     } 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(%axis_defaults));      ($token,$parstack,$safeeval,keys(%axis_defaults));
Line 866  sub start_axis { Line 928  sub start_axis {
 sub end_axis {  sub end_axis {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result = '';      my $result = '';
     if ($target eq 'web') {      if ($target eq 'web' || $target eq 'tex') {
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result.=&Apache::edit::tag_end($target,$token);   $result.=&Apache::edit::tag_end($target,$token);
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
Line 912  sub get_attributes{ Line 974  sub get_attributes{
   
 ##------------------------------------------------------- write_gnuplot_file  ##------------------------------------------------------- write_gnuplot_file
 sub write_gnuplot_file {  sub write_gnuplot_file {
     my ($tmpdir,$filename)= @_;      my ($tmpdir,$filename,$target)= @_;
     my $gnuplot_input = '';      my $gnuplot_input = '';
     my $curve;      my $curve;
     # Collect all the colors      # Collect all the colors
Line 926  sub write_gnuplot_file { Line 988  sub write_gnuplot_file {
        $plot{'fgcolor'}        );         $plot{'fgcolor'}        );
     }      }
     # set term      # set term
     $gnuplot_input .= 'set term gif ';      if ($target eq 'web') {
     $gnuplot_input .= 'transparent ' if ($plot{'transparent'} eq 'on');   $gnuplot_input .= 'set term gif ';
     $gnuplot_input .= $plot{'font'} . ' ';   $gnuplot_input .= 'transparent ' if ($plot{'transparent'} eq 'on');
     $gnuplot_input .= 'size '.$plot{'width'}.','.$plot{'height'}.' ';   $gnuplot_input .= $plot{'font'} . ' ';
     $gnuplot_input .= "@Colors\n";   $gnuplot_input .= 'size '.$plot{'width'}.','.$plot{'height'}.' ';
     # set output   $gnuplot_input .= "@Colors\n";
     $gnuplot_input .= "set output\n";   # set output
    $gnuplot_input .= "set output\n";
       } elsif ($target eq 'tex') {
    $gnuplot_input .= "set term postscript eps monochrome solid\n";
    $gnuplot_input .= "set output \"/home/httpd/perl/tmp/".
       &Apache::lonnet::unescape($filename).".eps\"\n";
       }
     # grid      # grid
     $gnuplot_input .= 'set grid'.$/ if ($plot{'grid'} eq 'on');      $gnuplot_input .= 'set grid'.$/ if ($plot{'grid'} eq 'on');
     # border      # border
     $gnuplot_input .= ($plot{'border'} eq 'on'?      $gnuplot_input .= ($plot{'border'} eq 'on'?
        'set border'.$/           :         'set border'.$/           :
        'set noborder'.$/         );    # title, xlabel, ylabel         'set noborder'.$/         );
       # sampling rate for non-data curves
       $gnuplot_input .= "set samples $plot{'samples'}\n";
       # title, xlabel, ylabel
     # titles      # titles
     $gnuplot_input .= "set title  \"$title\"\n"  if (defined($title)) ;      $gnuplot_input .= "set title  \"$title\"\n"  if (defined($title)) ;
     $gnuplot_input .= "set xlabel \"$xlabel\"\n" if (defined($xlabel));      $gnuplot_input .= "set xlabel \"$xlabel\"\n" if (defined($xlabel));
Line 967  sub write_gnuplot_file { Line 1038  sub write_gnuplot_file {
     if (%key) {      if (%key) {
  $gnuplot_input .= 'set key '.$key{'pos'}.' ';   $gnuplot_input .= 'set key '.$key{'pos'}.' ';
  if ($key{'title'} ne '') {   if ($key{'title'} ne '') {
     $gnuplot_input .= 'title " '.$key{'title'}.'" ';      $gnuplot_input .= 'title "'.$key{'title'}.'" ';
  }    } 
  $gnuplot_input .= ($key{'box'} eq 'on' ? 'box ' : 'nobox ').$/;   $gnuplot_input .= ($key{'box'} eq 'on' ? 'box ' : 'nobox ').$/;
     } else {      } else {
Line 979  sub write_gnuplot_file { Line 1050  sub write_gnuplot_file {
  $gnuplot_input .= 'set label "'.$label->{'text'}.'" at '.   $gnuplot_input .= 'set label "'.$label->{'text'}.'" at '.
     $label->{'xpos'}.','.$label->{'ypos'}.' '.$label->{'justify'}.$/ ;      $label->{'xpos'}.','.$label->{'ypos'}.' '.$label->{'justify'}.$/ ;
     }      }
       if ($target eq 'tex') {
           $gnuplot_input .="set size 1,".$plot{'height'}/$plot{'width'}*1.38;
           $gnuplot_input .="\n";
           }
     # curves      # curves
     $gnuplot_input .= 'plot ';      $gnuplot_input .= 'plot ';
     for (my $i = 0;$i<=$#curves;$i++) {      for (my $i = 0;$i<=$#curves;$i++) {
Line 988  sub write_gnuplot_file { Line 1063  sub write_gnuplot_file {
     $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');
               if (($curve->{'linestyle'} eq 'points')      ||
                   ($curve->{'linestyle'} eq 'linespoints') ||
                   ($curve->{'linestyle'} eq 'errorbars')   ||
                   ($curve->{'linestyle'} eq 'xerrorbars')  ||
                   ($curve->{'linestyle'} eq 'yerrorbars')  ||
                   ($curve->{'linestyle'} eq 'xyerrorbars')) {
                   $gnuplot_input.=' pointtype '.$curve->{'pointtype'};
                   $gnuplot_input.=' pointsize '.$curve->{'pointsize'};
               }
  } elsif (exists($curve->{'data'})) {   } elsif (exists($curve->{'data'})) {
     # Store data values in $datatext      # Store data values in $datatext
     my $datatext = '';      my $datatext = '';
     #   get new filename      #   get new filename
     my $datafilename = "$tmpdir/$filename.$i";      my $datafilename = "$tmpdir/$filename.data.$i";
     my $fh=Apache::File->new(">$datafilename");      my $fh=Apache::File->new(">$datafilename");
     # Compile data      # Compile data
     my @Data = @{$curve->{'data'}};      my @Data = @{$curve->{'data'}};
Line 1012  sub write_gnuplot_file { Line 1097  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');
               if (($curve->{'linestyle'} eq 'points')      ||
                   ($curve->{'linestyle'} eq 'linespoints') ||
                   ($curve->{'linestyle'} eq 'errorbars')   ||
                   ($curve->{'linestyle'} eq 'xerrorbars')  ||
                   ($curve->{'linestyle'} eq 'yerrorbars')  ||
                   ($curve->{'linestyle'} eq 'xyerrorbars')) {
                   $gnuplot_input.=' pointtype '.$curve->{'pointtype'};
                   $gnuplot_input.=' pointsize '.$curve->{'pointsize'};
               }
  }   }
     }      }
     # Write the output to a file.      # Write the output to a file.
     my $fh=Apache::File->new(">$tmpdir$filename");      my $fh=Apache::File->new(">$tmpdir$filename.data");
     print $fh $gnuplot_input;      print $fh $gnuplot_input;
     close($fh);      close($fh);
     # That's all folks.      # That's all folks.
Line 1085  sub edit_attributes { Line 1180  sub edit_attributes {
 sub insert_gnuplot {  sub insert_gnuplot {
     my $result = '';      my $result = '';
     #  plot attributes      #  plot attributes
     $result .= "<plot \n";      $result .= "\n<gnuplot ";
     foreach my $attr (keys(%gnuplot_defaults)) {      foreach my $attr (keys(%gnuplot_defaults)) {
  $result .= "     $attr=\"$gnuplot_defaults{$attr}->{'default'}\"\n";   $result .= "\n     $attr=\"$gnuplot_defaults{$attr}->{'default'}\"";
     }      }
     $result .= ">\n";      $result .= ">";
     # Add the components (most are commented out for simplicity)      # Add the components (most are commented out for simplicity)
     # $result .= &insert_key();      # $result .= &insert_key();
     # $result .= &insert_axis();      # $result .= &insert_axis();
Line 1097  sub insert_gnuplot { Line 1192  sub insert_gnuplot {
     # $result .= &insert_xlabel();          # $result .= &insert_xlabel();    
     # $result .= &insert_ylabel();          # $result .= &insert_ylabel();    
     $result .= &insert_curve();      $result .= &insert_curve();
     # close up the <plot>      # close up the <gnuplot>
     $result .= "</plot>\n";      $result .= "\n</gnuplot>";
     return $result;      return $result;
 }  }
   
Line 1112  sub insert_xtics { Line 1207  sub insert_xtics {
     my $result;      my $result;
     $result .= "\n    <xtics ";      $result .= "\n    <xtics ";
     foreach my $attr (keys(%tic_defaults)) {      foreach my $attr (keys(%tic_defaults)) {
  $result .= "$attr=\"$tic_defaults{$attr}->{'default'}\" ";   $result .= "\n        $attr=\"$tic_defaults{$attr}->{'default'}\" ";
     }      }
     $result .= "/>\n";      $result .= "/>";
     return $result;      return $result;
 }  }
   
Line 1122  sub insert_ytics { Line 1217  sub insert_ytics {
     my $result;      my $result;
     $result .= "\n    <ytics ";      $result .= "\n    <ytics ";
     foreach my $attr (keys(%tic_defaults)) {      foreach my $attr (keys(%tic_defaults)) {
  $result .= "$attr=\"$tic_defaults{$attr}->{'default'}\" ";   $result .= "\n        $attr=\"$tic_defaults{$attr}->{'default'}\" ";
     }      }
     $result .= "/>\n";      $result .= "/>";
     return $result;      return $result;
 }  }
   
 sub insert_key {  sub insert_key {
     my $result;      my $result;
     $result .= "\n    <key \n";      $result .= "\n    <key ";
     foreach my $attr (keys(%key_defaults)) {      foreach my $attr (keys(%key_defaults)) {
  $result .= "         $attr=\"$key_defaults{$attr}->{'default'}\"\n";   $result .= "\n         $attr=\"$key_defaults{$attr}->{'default'}\"";
     }      }
     $result .= "   />\n";      $result .= " />";
     return $result;      return $result;
 }  }
   
Line 1142  sub insert_axis{ Line 1237  sub insert_axis{
     my $result;      my $result;
     $result .= "\n    <axis ";      $result .= "\n    <axis ";
    foreach my $attr (keys(%axis_defaults)) {     foreach my $attr (keys(%axis_defaults)) {
  $result .= "         $attr=\"$axis_defaults{$attr}->{'default'}\"\n";   $result .= "\n         $attr=\"$axis_defaults{$attr}->{'default'}\"";
     }      }
     $result .= "   />\n";      $result .= " />";
     return $result;      return $result;
 }  }
   
 sub insert_title { return "\n    <title></title>\n"; }  sub insert_title  { return "\n    <title></title>"; }
 sub insert_xlabel { return "\n    <xlabel></xlabel>\n"; }  sub insert_xlabel { return "\n    <xlabel></xlabel>"; }
 sub insert_ylabel { return "\n    <ylabel></ylabel>\n"; }  sub insert_ylabel { return "\n    <ylabel></ylabel>"; }
   
 sub insert_label {  sub insert_label {
     my $result;      my $result;
     $result .= "\n    <label ";      $result .= "\n    <label ";
     foreach my $attr (keys(%label_defaults)) {      foreach my $attr (keys(%label_defaults)) {
  $result .= '         '.$attr.'="'.   $result .= "\n         $attr=\"".
     $label_defaults{$attr}->{'default'}."\"\n";              $label_defaults{$attr}->{'default'}."\"";
     }      }
     $result .= "   ></label>\n";      $result .= "></label>";
     return $result;      return $result;
 }  }
   
Line 1167  sub insert_curve { Line 1262  sub insert_curve {
     my $result;      my $result;
     $result .= "\n    <curve ";      $result .= "\n    <curve ";
     foreach my $attr (keys(%curve_defaults)) {      foreach my $attr (keys(%curve_defaults)) {
  $result .= '         '.$attr.'="'.   $result .= "\n         $attr=\"".
     $curve_defaults{$attr}->{'default'}."\"\n";      $curve_defaults{$attr}->{'default'}."\"";
     }      }
     $result .= "    >\n";      $result .= " >";
     $result .= &insert_data().&insert_data()."</curve>\n";      $result .= &insert_data().&insert_data()."\n    </curve>";
 }  }
   
 sub insert_function {  sub insert_function {
     my $result;      my $result;
     $result .= "<function></function>\n";      $result .= "\n        <function></function>";
     return $result;      return $result;
 }  }
   
 sub insert_data {  sub insert_data {
     my $result;      my $result;
     $result .= "     <data></data>\n";      $result .= "\n        <data></data>";
     return $result;      return $result;
 }  }
   

Removed from v.1.48  
changed lines
  Added in v.1.81


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