Diff for /loncom/xml/lonplot.pm between versions 1.117 and 1.135

version 1.117, 2007/05/23 22:36:28 version 1.135, 2008/03/19 21:09:09
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 LONCAPA;
     
   
 use vars qw/$weboutputformat $versionstring/;  use vars qw/$weboutputformat $version/;
   
   
   
Line 49  BEGIN { Line 48  BEGIN {
     #      #
     # Determine the version of GNUPLOT      # Determine the version of GNUPLOT
     $weboutputformat = 'gif';      $weboutputformat = 'gif';
     $versionstring = `gnuplot --version 2>/dev/null`;      my $versionstring = `gnuplot --version 2>/dev/null`;
     if ($versionstring =~ /^gnuplot 4/) {      ($version) = ($versionstring =~ /^gnuplot ([\d.]+)/);
       if ($version >= 4) {
         $weboutputformat = 'png';          $weboutputformat = 'png';
     }      }
           
Line 91  BEGIN { Line 91  BEGIN {
 my $max_str_len = 50;    # if a label, title, xlabel, or ylabel text  my $max_str_len = 50;    # if a label, title, xlabel, or ylabel text
                          # is longer than this, it will be truncated.                           # is longer than this, it will be truncated.
   
   my %linetypes =
       (
        solid          => 1,
        dashed         => 0
       );
   
 my %linestyles =   my %linestyles = 
     (      (
      lines          => 2,     # Maybe this will be used in the future       lines          => 2,     # Maybe this will be used in the future
Line 117  my $pos_real_test  = Line 123  my $pos_real_test  =
 my $color_test     = sub {$_[0]=~s/\s+//g;$_[0]=~/^x[\da-fA-F]{6}$/};  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]=~/^(\d+|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 127  my $words_test     = sub {$_[0]=~s/\s+/ Line 133  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 texwidth fontface font texfont
     border align texwidth texfont plotcolor plottype gridtype lmargin rmargin      transparent grid samples 
       border align plotcolor plottype gridtype lmargin rmargin
     tmargin bmargin major_ticscale minor_ticscale boxwidth gridlayer fillstyle      tmargin bmargin major_ticscale minor_ticscale boxwidth gridlayer fillstyle
     pattern solid/;      pattern solid/;
   
Line 139  my %gnuplot_defaults = Line 146  my %gnuplot_defaults =
      alttag       => {       alttag       => {
  default     => 'dynamically generated plot',   default     => 'dynamically generated plot',
  test        => $words_test,   test        => $words_test,
  description => 'brief description of the plot',   description => 'Brief description of the plot',
       edit_type   => 'entry',        edit_type   => 'entry',
  size        => '40'   size        => '40'
  },   },
      height       => {       height       => {
  default     => 300,   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     => 400,   default     => 400,
  test        => $int_test,   test        => $int_test,
  description => 'width of image (pixels)',   description => 'Width of image (pixels)',
  edit_type   => 'entry',   edit_type   => 'entry',
  size        => '10'   size        => '10'
  },   },
      bgcolor      => {       bgcolor      => {
  default     => 'xffffff',   default     => 'xffffff',
  test        => $color_test,    test        => $color_test, 
  description => 'background color of image (xffffff)',   description => 'Background color of image (xffffff)',
  edit_type   => 'entry',   edit_type   => 'entry',
  size        => '10'   size        => '10'
  },   },
      fgcolor      => {       fgcolor      => {
  default     => 'x000000',   default     => 'x000000',
  test        => $color_test,   test        => $color_test,
  description => 'foreground color of image (x000000)',   description => 'Foreground color of image (x000000)',
  edit_type   => 'entry',   edit_type   => 'entry',
  size        => '10'   size        => '10'
  },   },
Line 203  my %gnuplot_defaults = Line 210  my %gnuplot_defaults =
  edit_type   => 'onoff'   edit_type   => 'onoff'
  },   },
      font         => {       font         => {
  default     => 'medium',   default     => '9',
  test        => $sml_test,   test        => $sml_test,
  description => 'Size of font to use',   description => 'Font size to use in web output (pts)',
  edit_type   => 'choice',   edit_type   => 'choice',
  choices     => ['small','medium','large']   choices     => [['5','5 (small)'],'6','7','8',['9','9 (medium)'],'10',['11','11 (large)'],'12','15']
  },   },
        fontface     => {
           default     => 'sans-serif',
           test        => sub {$_[0]=~/^(sans-serif|serif|classic)$/},
           description => 'Type of font to use',
           edit_type   => 'choice',
           choices     => ['sans-serif','serif', 'classic']
           },
      samples      => {       samples      => {
  default     => '100',   default     => '100',
  test        => $int_test,   test        => $int_test,
Line 219  my %gnuplot_defaults = Line 233  my %gnuplot_defaults =
      align        => {       align        => {
  default     => 'middle',   default     => 'middle',
  test        => sub {$_[0]=~/^(left|right|middle|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','middle']   choices     => ['left','right','middle']
  },   },
Line 247  my %gnuplot_defaults = Line 261  my %gnuplot_defaults =
      pattern      => {       pattern      => {
  default     => '',   default     => '',
  test        => $int_test,   test        => $int_test,
  description => 'pattern value for boxes:',   description => 'Pattern value for boxes:',
  edit_type   => 'choice',   edit_type   => 'choice',
          choices     => [0,1,2,3,4,5,6]           choices     => [0,1,2,3,4,5,6]
          },           },
Line 274  my %gnuplot_defaults = Line 288  my %gnuplot_defaults =
          },           },
      gridtype     => {       gridtype     => {
  default     => 'Cartesian',   default     => 'Cartesian',
  test        => sub {$_[0]=~/^(Polar|Cartesian)$/},   test        => sub {$_[0]=~/^(Polar|Cartesian|Linear-Log|Log-Linear|Log-Log)$/},
  description => 'Grid type:',   description => 'Grid type:',
  edit_type   => 'choice',   edit_type   => 'choice',
          choices     => ['Cartesian','Polar']           choices     => ['Cartesian','Polar','Linear-Log','Log-Linear','Log-Log']
          },           },
      lmargin      => {       lmargin      => {
  default     => 'default',   default     => 'default',
Line 310  my %gnuplot_defaults = Line 324  my %gnuplot_defaults =
      boxwidth     => {       boxwidth     => {
  default     => '',   default     => '',
  test        => $real_test,    test        => $real_test, 
  description => 'width of boxes default auto',   description => 'Width of boxes, default is auto',
  edit_type   => 'entry',   edit_type   => 'entry',
          size        => '5'           size        => '5'
          },           },
Line 348  my %key_defaults = Line 362  my %key_defaults =
      pos   => {        pos   => { 
  default => 'top right',    default => 'top right', 
  test => $key_pos_test,    test => $key_pos_test, 
  description => 'position of the key on the plot',   description => 'Position of the key on the plot',
  edit_type   => 'choice',   edit_type   => 'choice',
  choices     => ['top left','top right','bottom left','bottom right',   choices     => ['top left','top right','bottom left','bottom right',
  'outside','below']   'outside','below']
Line 360  my %label_defaults = Line 374  my %label_defaults =
      xpos    => {       xpos    => {
  default => 0,   default => 0,
  test => $real_test,   test => $real_test,
  description => 'x position of label (graph coordinates)',   description => 'X position of label (graph coordinates)',
  edit_type   => 'entry',   edit_type   => 'entry',
  size        => '10'   size        => '10'
  },   },
      ypos    => {       ypos    => {
  default => 0,    default => 0, 
  test => $real_test,   test => $real_test,
  description => 'y position of label (graph coordinates)',   description => 'Y position of label (graph coordinates)',
  edit_type   => 'entry',   edit_type   => 'entry',
  size        => '10'   size        => '10'
  },   },
Line 377  my %label_defaults = Line 391  my %label_defaults =
  description => 'justification of the label text on the plot',   description => 'justification of the label text on the plot',
  edit_type   => 'choice',   edit_type   => 'choice',
  choices     => ['left','right','center']   choices     => ['left','right','center']
        },
        rotate => {
            default => 0,
            test => $real_test,
            description => 'Rotation of label (degrees)',
            edit_type   => 'entry',
            size        => '10',
      }       }
      );       );
   
Line 394  my %tic_defaults = Line 415  my %tic_defaults =
      mirror => {       mirror => {
  default => 'on',    default => 'on', 
  test => $onoff_test,   test => $onoff_test,
  description => 'mirror tics on opposite axis?',   description => 'Mirror tics on opposite axis?',
  edit_type   => 'onoff'   edit_type   => 'onoff'
  },   },
      start => {       start => {
Line 427  my %tic_defaults = Line 448  my %tic_defaults =
  },            },         
      );       );
   
 my @axis_edit_order = ('color','xmin','xmax','ymin','ymax');  my @axis_edit_order = ('color','xmin','xmax','ymin','ymax','xformat', 'yformat');
 my %axis_defaults =   my %axis_defaults = 
     (      (
      color   => {       color   => {
  default => 'x000000',    default => 'x000000', 
  test => $color_test,   test => $color_test,
  description => 'color of grid lines (x000000)',   description => 'Color of grid lines (x000000)',
  edit_type   => 'entry',   edit_type   => 'entry',
  size        => '10'   size        => '10'
  },   },
      xmin      => {       xmin      => {
  default => '-10.0',   default => '-10.0',
  test => $real_test,   test => $real_test,
  description => 'minimum x-value shown in plot',   description => 'Minimum x-value shown in plot',
  edit_type   => 'entry',   edit_type   => 'entry',
  size        => '10'   size        => '10'
  },   },
      xmax      => {       xmax      => {
  default => ' 10.0',   default => ' 10.0',
  test => $real_test,   test => $real_test,
  description => 'maximum x-value shown in plot',     description => 'Maximum x-value shown in plot',  
  edit_type   => 'entry',   edit_type   => 'entry',
  size        => '10'   size        => '10'
  },   },
      ymin      => {       ymin      => {
  default => '-10.0',   default => '-10.0',
  test => $real_test,   test => $real_test,
  description => 'minimum y-value shown in plot',     description => 'Minimum y-value shown in plot',  
  edit_type   => 'entry',   edit_type   => 'entry',
  size        => '10'   size        => '10'
  },   },
      ymax      => {       ymax      => {
  default => ' 10.0',   default => ' 10.0',
  test => $real_test,   test => $real_test,
  description => 'maximum y-value shown in plot',     description => 'Maximum y-value shown in plot',  
  edit_type   => 'entry',   edit_type   => 'entry',
  size        => '10'   size        => '10'
  }          },
        xformat      => {
            default     => 'on',
            test        => sub {$_[0]=~/^(on|off|\d+(f|F|e|E))$/},
            description => 'X-axis number formatting',
            edit_type   => 'choice',
            choices     => ['on', 'off', '2e', '2f'],
            },
        yformat      => {
            default     => 'on',
            test        => sub {$_[0]=~/^(on|off|\d+(f|F|e|E))$/},
            description => 'X-axis number formatting',
            edit_type   => 'choice',
            choices     => ['on', 'off', '2e', '2f'],
            },
   
      );       );
   
 my @curve_edit_order = ('color','name','linestyle','pointtype','pointsize','limit');  my @curve_edit_order = ('color','name','linestyle','linewidth','linetype','pointtype','pointsize','limit');
   
 my %curve_defaults =   my %curve_defaults = 
     (      (
      color     => {       color     => {
  default => 'x000000',   default => 'x000000',
  test => $color_test,   test => $color_test,
  description => 'color of curve (x000000)',   description => 'Color of curve (x000000)',
  edit_type   => 'entry',   edit_type   => 'entry',
  size        => '10'   size        => '10'
  },   },
      name      => {       name      => {
  default => '',   default => '',
  test => $words_test,   test => $words_test,
  description => 'name of curve to appear in key',   description => 'Name of curve to appear in key',
  edit_type   => 'entry',   edit_type   => 'entry',
  size        => '20'   size        => '20'
  },   },
      linestyle => {       linestyle => {
  default => 'lines',   default => 'lines',
  test => $linestyle_test,   test => $linestyle_test,
  description => 'Line style',   description => 'Plot with:',
  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 plot 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]           },
 #         },       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 => {       pointsize => {
          default     => 1,           default     => 1,
          test        => $pos_real_test,           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',           edit_type   => 'entry',
          size        => '5'           size        => '5'
          },           },
      pointtype => {       pointtype => {
          default     => 1,           default     => 1,
          test        => $int_test,           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',           edit_type   => 'choice',
          choices     => [0,1,2,3,4,5,6]           choices     => [0,1,2,3,4,5,6]
          },           },
      limit     => {       limit     => {
          default     => 'closed',           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',           description => 'Point to fill -- for filledcurves',
          edit_type   => 'choice',           edit_type   => 'choice',
          choices     => ['closed','x1','x2','y1','y2']           choices     => ['above', 'below', 'closed','x1','x2','y1','y2']
          },           },
      );       );
   
Line 674  sub end_ytics { Line 716  sub end_ytics {
     return $result;      return $result;
 }  }
   
   ##-----------------------------------------------------------------font
   my %font_properties =
       (
        'classic'    => {
    face       => 'classic',
    file       => 'DejaVuSansMono-Bold',
    printname  => 'Helvetica',
    tex_no_file => 1,
        },
        'sans-serif' => {
    face       => 'sans-serif',
    file       => 'DejaVuSans',
    printname  => 'DejaVuSans',
        },
        'serif'      => {
    face       => 'serif',
    file       => 'DejaVuSerif',
    printname  => 'DejaVuSerif',
        },
        );
   
   sub get_font {
       my ($target) = @_;
       my ($size, $selected_font);
   
       if ( $Apache::lonplot::plot{'font'} =~ /^(small|medium|large)/) {
    $selected_font = $font_properties{'classic'};
    if ( $Apache::lonplot::plot{'font'} eq 'small') {
       $size = '5';
    } elsif ( $Apache::lonplot::plot{'font'} eq 'medium') {
       $size = '9';
    } elsif ( $Apache::lonplot::plot{'font'} eq 'large') {
       $size = '11';
    } else {
       $size = '9';
    }
       } else {
    $size = $Apache::lonplot::plot{'font'};
    $selected_font = $font_properties{$Apache::lonplot::plot{'fontface'}};
       }
       if ($target eq 'tex' && defined($Apache::lonplot::plot{'texfont'})) {
    $size = $Apache::lonplot::plot{'texfont'};
       }
       return ($size, $selected_font);
   }
   
 ##----------------------------------------------------------------- key  ##----------------------------------------------------------------- key
 sub start_key {  sub start_key {
Line 705  sub end_key { Line 792  sub end_key {
     return $result;      return $result;
 }  }
   
   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 = 
      ('(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}"},
        '(Phi|#934)'     => {'tex' => '{/Symbol F}', 'web' => "\x{3A6}"},
        '(Gamma|#915)'   => {'tex' => '{/Symbol G}', 'web' => "\x{393}"},
        '(Eta|#919)'     => {'tex' => '{/Symbol H}', 'web' => "\x{397}"},
        '(Iota|#921)'    => {'tex' => '{/Symbol I}', 'web' => "\x{399}"},
        '(Kappa|#922)'   => {'tex' => '{/Symbol K}', 'web' => "\x{39A}"},
        '(Lambda|#923)'  => {'tex' => '{/Symbol L}', 'web' => "\x{39B}"},
        '(Mu|#924)'      => {'tex' => '{/Symbol M}', 'web' => "\x{39C}"},
        '(Nu|#925)'      => {'tex' => '{/Symbol N}', 'web' => "\x{39D}"},
        '(Omicron|#927)' => {'tex' => '{/Symbol O}', 'web' => "\x{39F}"},
        '(Pi|#928)'      => {'tex' => '{/Symbol P}', 'web' => "\x{3A0}"},
        '(Theta|#920)'   => {'tex' => '{/Symbol Q}', 'web' => "\x{398}"},
        '(Rho|#929)'     => {'tex' => '{/Symbol R}', 'web' => "\x{3A1}"},
        '(Sigma|#931)'   => {'tex' => '{/Symbol S}', 'web' => "\x{3A3}"},
        '(Tau|#932)'     => {'tex' => '{/Symbol T}', 'web' => "\x{3A4}"},
        '(Upsilon|#933)' => {'tex' => '{/Symbol U}', 'web' => "\x{3A5}"},
        '(Omega|#937)'   => {'tex' => '{/Symbol W}', 'web' => "\x{3A9}"},
        '(Xi|#926)'      => {'tex' => '{/Symbol X}', 'web' => "\x{39E}"},
        '(Psi|#936)'     => {'tex' => '{/Symbol Y}', 'web' => "\x{3A8}"},
        '(Zeta|#918)'    => {'tex' => '{/Symbol Z}', 'web' => "\x{396}"},
        '(alpha|#945)'   => {'tex' => '{/Symbol a}', 'web' => "\x{3B1}"},
        '(beta|#946)'    => {'tex' => '{/Symbol b}', 'web' => "\x{3B2}"},
        '(chi|#967)'     => {'tex' => '{/Symbol c}', 'web' => "\x{3C7}"},
        '(delta|#948)'   => {'tex' => '{/Symbol d}', 'web' => "\x{3B4}"},
        '(epsilon|#949)' => {'tex' => '{/Symbol e}', 'web' => "\x{3B5}"},
        '(phi|#966)'     => {'tex' => '{/Symbol f}', 'web' => "\x{3C6}"},
        '(gamma|#947)'   => {'tex' => '{/Symbol g}', 'web' => "\x{3B3}"},
        '(eta|#951)'     => {'tex' => '{/Symbol h}', 'web' => "\x{3B7}"},
        '(iota|#953)'    => {'tex' => '{/Symbol i}', 'web' => "\x{3B9}"},
        '(kappa|#954)'   => {'tex' => '{/Symbol k}', 'web' => "\x{3BA}"},
        '(lambda|#955)'  => {'tex' => '{/Symbol k}', 'web' => "\x{3BB}"},
        '(mu|#956)'      => {'tex' => '{/Symbol m}', 'web' => "\x{3BC}"},
        '(nu|#957)'      => {'tex' => '{/Symbol n}', 'web' => "\x{3BD}"},
        '(omicron|#959)' => {'tex' => '{/Symbol o}', 'web' => "\x{3BF}"},
        '(pi|#960)'      => {'tex' => '{/Symbol p}', 'web' => "\x{3C0}"},
        '(theta|#952)'   => {'tex' => '{/Symbol q}', 'web' => "\x{3B8}"},
        '(rho|#961)'     => {'tex' => '{/Symbol r}', 'web' => "\x{3C1}"},
        '(sigma|#963)'   => {'tex' => '{/Symbol s}', 'web' => "\x{3C3}"},
        '(tau|#964)'     => {'tex' => '{/Symbol t}', 'web' => "\x{3C4}"},
        '(upsilon|#965)' => {'tex' => '{/Symbol u}', 'web' => "\x{3C5}"},
        '(omega|#969)'   => {'tex' => '{/Symbol w}', 'web' => "\x{3C9}"},
        '(xi|#958)'      => {'tex' => '{/Symbol x}', 'web' => "\x{3BE}"},
        '(psi|#968)'     => {'tex' => '{/Symbol y}', 'web' => "\x{3C8}"},
        '(zeta|#950)'    => {'tex' => '{/Symbol z}', 'web' => "\x{3B6}"},
       );
   
   
   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  ##------------------------------------------------------------------- title
 sub start_title {  sub start_title {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
Line 716  sub start_title { Line 893  sub start_title {
  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);
  }   }
    $title = &parse_label($target,$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,$style);   my $text=&Apache::lonxml::get_all_text("/title",$parser,$style);
Line 747  sub start_xlabel { Line 925  sub start_xlabel {
  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);
  }   }
    $xlabel = &parse_label($target,$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,$style);   my $text=&Apache::lonxml::get_all_text("/xlabel",$parser,$style);
Line 779  sub start_ylabel { Line 958  sub start_ylabel {
  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);
  }   }
    $ylabel = &parse_label($target,$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,$style);   my $text = &Apache::lonxml::get_all_text("/ylabel",$parser,$style);
Line 812  sub start_label { Line 992  sub start_label {
  $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);
  $label{'text'} = $text;   $label{'text'} = &parse_label($target,$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');
Line 1069  sub get_attributes{ Line 1249  sub get_attributes{
 ##------------------------------------------------------- write_gnuplot_file  ##------------------------------------------------------- write_gnuplot_file
 sub write_gnuplot_file {  sub write_gnuplot_file {
     my ($tmpdir,$filename,$target)= @_;      my ($tmpdir,$filename,$target)= @_;
       my ($fontsize, $font_properties) =  &get_font($target);
     my $gnuplot_input = '';      my $gnuplot_input = '';
     my $curve;      my $curve;
     my $pt = $Apache::lonplot::plot{'texfont'};  
     #      #
     # Check to be sure we do not have any empty curves      # Check to be sure we do not have any empty curves
     my @curvescopy;      my @curvescopy;
Line 1102  sub write_gnuplot_file { Line 1282  sub write_gnuplot_file {
     }      }
     # set term      # set term
     if ($target eq 'web') {      if ($target eq 'web') {
  $gnuplot_input .= 'set term '.$weboutputformat .' ';   $gnuplot_input .= 'set terminal png enhanced nocrop ';
  $gnuplot_input .= 'transparent ' if ($Apache::lonplot::plot{'transparent'} eq 'on');   $gnuplot_input .= 'transparent ' if ($Apache::lonplot::plot{'transparent'} eq 'on');
  $gnuplot_input .= $Apache::lonplot::plot{'font'} . ' ';   $gnuplot_input .= 'font "'.$Apache::lonnet::perlvar{'lonFontsDir'}.
  $gnuplot_input .= 'size '.$Apache::lonplot::plot{'width'}.','.$Apache::lonplot::plot{'height'}.' ';      '/'.$font_properties->{'file'}.'.ttf" ';
    $gnuplot_input .= $fontsize;
    $gnuplot_input .= ' size '.$Apache::lonplot::plot{'width'}.','.$Apache::lonplot::plot{'height'}.' ';
  $gnuplot_input .= "@Colors\n";   $gnuplot_input .= "@Colors\n";
  # set output   # set output
  $gnuplot_input .= "set output\n";   $gnuplot_input .= "set output\n";
     } 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 enhanced $Apache::lonplot::plot{'plotcolor'} solid ";
  $gnuplot_input .= "set output \"/home/httpd/perl/tmp/".   if (!$font_properties->{'tex_no_file'}) {
       $gnuplot_input .=
    'fontfile "'.$Apache::lonnet::perlvar{'lonFontsDir'}.
    '/'.$font_properties->{'file'}.'.pfb" ';
    }
    $gnuplot_input .= ' "'.$font_properties->{'printname'}.'" ';
    $gnuplot_input .= $fontsize;
    $gnuplot_input .= "\nset output \"/home/httpd/perl/tmp/".
     &unescape($filename).".eps\"\n";      &unescape($filename).".eps\"\n";
     }      }
     # cartesian or polar plot?      # cartesian or polar plot?
Line 1123  sub write_gnuplot_file { Line 1312  sub write_gnuplot_file {
     # cartesian or polar grid?      # cartesian or polar grid?
     if (lc($Apache::lonplot::plot{'gridtype'}) eq 'polar') {      if (lc($Apache::lonplot::plot{'gridtype'}) eq 'polar') {
         $gnuplot_input .= 'set grid 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 {      } else {
         # Assume Cartesian          # Assume Cartesian
     }      }
Line 1147  sub write_gnuplot_file { Line 1343  sub write_gnuplot_file {
     if (lc($Apache::lonplot::plot{'bmargin'}) ne 'default') {      if (lc($Apache::lonplot::plot{'bmargin'}) ne 'default') {
         $gnuplot_input .= 'set bmargin '.$Apache::lonplot::plot{'bmargin'}.$/;          $gnuplot_input .= 'set bmargin '.$Apache::lonplot::plot{'bmargin'}.$/;
     }      }
   
     # tic scales      # tic scales
     $gnuplot_input .= 'set ticscale '.      if ($version > 4) {
         $Apache::lonplot::plot{'major_ticscale'}.' '.$Apache::lonplot::plot{'minor_ticscale'}.$/;   $gnuplot_input .= 'set tics scale '.
       $Apache::lonplot::plot{'major_ticscale'}.', '.$Apache::lonplot::plot{'minor_ticscale'}.$/;
       } else {
       $gnuplot_input .= 'set ticscale '.
       $Apache::lonplot::plot{'major_ticscale'}.' '.$Apache::lonplot::plot{'minor_ticscale'}.$/;
       }
     #boxwidth      #boxwidth
     if (lc($Apache::lonplot::plot{'boxwidth'}) ne '') {      if (lc($Apache::lonplot::plot{'boxwidth'}) ne '') {
  $gnuplot_input .= 'set boxwidth '.$Apache::lonplot::plot{'boxwidth'}.$/;   $gnuplot_input .= 'set boxwidth '.$Apache::lonplot::plot{'boxwidth'}.$/;
Line 1168  sub write_gnuplot_file { Line 1370  sub write_gnuplot_file {
     $gnuplot_input .= "set samples $Apache::lonplot::plot{'samples'}\n";      $gnuplot_input .= "set samples $Apache::lonplot::plot{'samples'}\n";
     # title, xlabel, ylabel      # title, xlabel, ylabel
     # titles      # titles
       my $extra_space_x = ($xtics{'location'} eq 'axis') ? ' 0, -0.5 ' : '';
       my $extra_space_y = ($ytics{'location'} eq 'axis') ? ' -0.5, 0 ' : '';
   
     if ($target eq 'tex') {      if ($target eq 'tex') {
         $gnuplot_input .= "set title  \"$title\" font \"Helvetica,".$pt."pt\"\n"  if (defined($title)) ;   $gnuplot_input .= "set title  \"$title\"          font \"".$font_properties->{'printname'}.",".$fontsize."pt\"\n" if (defined($title)) ;
         $gnuplot_input .= "set xlabel \"$xlabel\" font \"Helvetica,".$pt."pt\" \n" if (defined($xlabel));   $gnuplot_input .= "set xlabel \"$xlabel\" $extra_space_x font \"".$font_properties->{'printname'}.",".$fontsize."pt\"\n" if (defined($xlabel));
         $gnuplot_input .= "set ylabel \"$ylabel\" font \"Helvetica,".$pt."pt\"\n" if (defined($ylabel));   $gnuplot_input .= "set ylabel \"$ylabel\" $extra_space_y font \"".$font_properties->{'printname'}.",".$fontsize."pt\"\n" if (defined($ylabel));
     } else {      } else {
         $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\" $extra_space_x \n" if (defined($xlabel));
         $gnuplot_input .= "set ylabel \"$ylabel\" \n" if (defined($ylabel));          $gnuplot_input .= "set ylabel \"$ylabel\" $extra_space_y \n" if (defined($ylabel));
     }      }
     # tics      # tics
     if (%xtics) {          if (%xtics) {    
Line 1200  sub write_gnuplot_file { Line 1405  sub write_gnuplot_file {
     }      }
     # axis      # axis
     if (%axis) {      if (%axis) {
           if ($axis{'xformat'} ne 'on') {
               $gnuplot_input .= "set format x ";
               if ($axis{'xformat'} eq 'off') {
                   $gnuplot_input .= "\"\"\n";
               } else {
                   $gnuplot_input .= "\"\%.".$axis{'xformat'}."\"\n";
               }
           }
           if ($axis{'yformat'} ne 'on') {
               $gnuplot_input .= "set format y ";
               if ($axis{'yformat'} eq 'off') {
                   $gnuplot_input .= "\"\"\n";
               } else {
                   $gnuplot_input .= "\"\%.".$axis{'yformat'}."\"\n";
               }
           }
  $gnuplot_input .= "set xrange \[$axis{'xmin'}:$axis{'xmax'}\]\n";   $gnuplot_input .= "set xrange \[$axis{'xmin'}:$axis{'xmax'}\]\n";
  $gnuplot_input .= "set yrange \[$axis{'ymin'}:$axis{'ymax'}\]\n";   $gnuplot_input .= "set yrange \[$axis{'ymin'}:$axis{'ymax'}\]\n";
     }      }
Line 1217  sub write_gnuplot_file { Line 1438  sub write_gnuplot_file {
     my $label;      my $label;
     foreach $label (@labels) {      foreach $label (@labels) {
  $gnuplot_input .= 'set label "'.$label->{'text'}.'" at '.   $gnuplot_input .= 'set label "'.$label->{'text'}.'" at '.
     $label->{'xpos'}.','.$label->{'ypos'}.' '.$label->{'justify'};                            $label->{'xpos'}.','.$label->{'ypos'};
           if ($label->{'rotate'} ne '') {
               $gnuplot_input .= ' rotate by '.$label->{'rotate'};
           }
           $gnuplot_input .= ' '.$label->{'justify'};
   
         if ($target eq 'tex') {          if ($target eq 'tex') {
             $gnuplot_input .=' font "Helvetica,'.$pt.'pt"' ;      $gnuplot_input .=' font "'.$font_properties->{'printname'}.','.$fontsize.'pt"' ;
         }          }
         $gnuplot_input .= $/;          $gnuplot_input .= $/;
     }      }
     if ($target eq 'tex') {      if ($target eq 'tex') {
         $gnuplot_input .="set size 1,".$Apache::lonplot::plot{'height'}/$Apache::lonplot::plot{'width'}*1.38;          $gnuplot_input .="set size 1,".$Apache::lonplot::plot{'height'}/$Apache::lonplot::plot{'width'}*1.38;
         $gnuplot_input .="\n";          $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++) {
  $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');  
             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 1248  sub write_gnuplot_file { Line 1477  sub write_gnuplot_file {
                 $gnuplot_input.=' pointsize '.$curve->{'pointsize'};                  $gnuplot_input.=' pointsize '.$curve->{'pointsize'};
             } elsif ($curve->{'linestyle'} eq 'filledcurves') {               } elsif ($curve->{'linestyle'} eq 'filledcurves') { 
                 $gnuplot_input.= ' '.$curve->{'limit'};                  $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'};
   
  } elsif (exists($curve->{'data'})) {   } elsif (exists($curve->{'data'})) {
     # Store data values in $datatext      # Store data values in $datatext
     my $datatext = '';      my $datatext = '';
Line 1267  sub write_gnuplot_file { Line 1506  sub write_gnuplot_file {
     }      }
     #   write file      #   write file
     print $fh $datatext;      print $fh $datatext;
     close ($fh);      close($fh);
     #   generate gnuplot text      #   generate gnuplot text
     $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')      ||              if (($curve->{'linestyle'} eq 'points')      ||
                 ($curve->{'linestyle'} eq 'linespoints') ||                  ($curve->{'linestyle'} eq 'linespoints') ||
                 ($curve->{'linestyle'} eq 'errorbars')   ||                  ($curve->{'linestyle'} eq 'errorbars')   ||
Line 1283  sub write_gnuplot_file { Line 1521  sub write_gnuplot_file {
                 $gnuplot_input.=' pointsize '.$curve->{'pointsize'};                  $gnuplot_input.=' pointsize '.$curve->{'pointsize'};
             } elsif ($curve->{'linestyle'} eq 'filledcurves') {               } elsif ($curve->{'linestyle'} eq 'filledcurves') { 
                 $gnuplot_input.= ' '.$curve->{'limit'};                  $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'}; 
  }   }
     }      }
     # Write the output to a 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;      print $fh $gnuplot_input;
     close($fh);      close($fh);
     # That's all folks.      # That's all folks.

Removed from v.1.117  
changed lines
  Added in v.1.135


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