Diff for /loncom/xml/lonplot.pm between versions 1.121 and 1.139

version 1.121, 2007/08/03 05:56:00 version 1.139, 2008/05/19 11:49:48
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 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 fontface 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 205  my %gnuplot_defaults = Line 212  my %gnuplot_defaults =
      font         => {       font         => {
  default     => '9',   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     => [['5','5 (small)'],'7',['9','9 (medium)'],'10','12',['15','15 (large)']]   choices     => [['5','5 (small)'],'6','7','8',['9','9 (medium)'],'10',['11','11 (large)'],'12','15']
  },   },
      fontface     => {       fontface     => {
         default     => 'sans-serif',          default     => 'sans-serif',
Line 384  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 434  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   => {
Line 471  my %axis_defaults = Line 485  my %axis_defaults =
  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','linewidth','pointtype','pointsize','limit');  my @curve_edit_order = ('color','name','linestyle','linewidth','linetype','pointtype','pointsize','limit');
   
 my %curve_defaults =   my %curve_defaults = 
     (      (
Line 495  my %curve_defaults = Line 524  my %curve_defaults =
      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)]
  },   },
      linewidth => {       linewidth => {
          default     => 4,           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 plot 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 702  my %font_properties = Line 738  my %font_properties =
      );       );
   
 sub get_font {  sub get_font {
       my ($target) = @_;
     my ($size, $selected_font);      my ($size, $selected_font);
   
     if ( $Apache::lonplot::plot{'font'} =~ /^(small|medium|large)/) {      if ( $Apache::lonplot::plot{'font'} =~ /^(small|medium|large)/) {
Line 711  sub get_font { Line 748  sub get_font {
  } elsif ( $Apache::lonplot::plot{'font'} eq 'medium') {   } elsif ( $Apache::lonplot::plot{'font'} eq 'medium') {
     $size = '9';      $size = '9';
  } elsif ( $Apache::lonplot::plot{'font'} eq 'large') {   } elsif ( $Apache::lonplot::plot{'font'} eq 'large') {
     $size = '15';      $size = '11';
  } else {   } else {
     $size = '9';      $size = '9';
  }   }
     } else {      } else {
    $size = $Apache::lonplot::plot{'font'};
  $selected_font = $font_properties{$Apache::lonplot::plot{'fontface'}};   $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);      return ($size, $selected_font);
 }  }
   
Line 751  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 = 
      (  # Greek alphabet:
         
         '(Alpha|#913)'    => {'tex' => '{/Symbol A}', 'web' => "\x{391}"},
         '(Beta|#914)'    => {'tex' => '{/Symbol B}', 'web' => "\x{392}"},
         '(Chi|#935)'     => {'tex' => '{/Symbol C}', 'web' => "\x{3A7}"},
         '(Delta|#916)'   => {'tex' => '{/Symbol D}', 'web' => "\x{394}"},
         '(Epsilon|#917)' => {'tex' => '{/Symbol E}', 'web' => "\x{395}"},
         '(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}"},
         '(thetasym|#977)' => {'tex' => '{/Symbol \165}', 'web' => "\x{3d1}"},
         '(upsih|#978)'   => {'tex' => '{/Symbol \241}', 'web' => "\x{3d2}"},
         '(piv|#982)'     => {'tex' => '{/Symbol \166}', 'web' => "\x{3d6}"},
   
   
         # Punctuation:
         
         '(quot|#034)'   => {'tex' =>  '\42',            'web' => '\42'},
         '(amp|#038)'    => {'tex' =>  '\46',            'web' => '\46'},
         '(lt|#060)'     => {'tex' =>  '\74',            'web' => '\74'},
         '(gt|#062)'     => {'tex' =>  '\76',            'web' => '\76'},
         '#131'          => {'tex' =>  '{/Symbol \246}', 'web' => "\x{192}"},
         '#132'          => {'tex' => '{/Text \271}',    'web' => "\x{201e}"},
         '#133'          => {'tex' => '{/Symbol \274}',  'web'=> "\x{2026}"},
         '#134'          => {'tex' => '{/Text \262}',    'web' => "\x{2020}"},
         '#135'          => {'tex' => '{/Text \263}',    'web' => "\x{2021}"},
         '#136'          => {'tex' => '\\\\^',           'web' => '\\\\^'},
         '#137'          => {'tex' => '{/Text \275}',    'web' => "\x{2030}"},
         '#138'          => {'tex' => 'S',               'web' => "\x{160}"}, # no S-caron in ps fonts.
         '#139'          => {'tex' => '<',               'web' => '<'},
         '#140'          => {'tex' => '{/Text \352}',    'web' => "\x{152}"},
         '#145'          => {'tex' => '\140',            'web' => "\x{2018}"},
         '#146'          => {'tex' => '\47',             'web' => "\x{2019}"},
         '#147'          => {'tex' => '{/Text \252}',    'web' => "\x{201c}"},
         '#148'          => {'tex' => '{/Text \315}',    'web' => '\\"'},
         '#149'          => {'tex' => '{/Symbol \267}',  'web' => "\x{2022}"},
         '#150'          => {'tex' => '{/Text \55}',     'web' => "\x{2013}"},  #Untested here en dash
         '#151'          => {'tex' => '{/Symbol \55}',   'web' => "\x{2014}"},  # em dash
         '#152'          => {'tex' => '~',               'web' => '~'},
         '#153'          => {'tex' => '{/Text \324}',    'web' => "\x{2122}"}, # trademark
   
         # Accented letters, and other furreign language glyphs.
   
         '#154'          => {'tex' => 's',               'web' => "\x{161}"}, # small s-caron no ps.
         '#155'          => {'tex' => '>',               'web' => '\76'},     # >
         '#156'          => {'tex' => '{/Text \372}',    'web' => "\x{153}"}, # oe ligature.
         '#159',         => {'tex' => 'Y',               'web' => "\x{178}"}, # Y-umlaut - can't print
         '(nbsp|#160)'   => {'tex' => ' ',               'web' => ' '},       # non breaking space.
         '(iexcl|#161)'  => {'tex' => '{/Text \241}',    'web' => "\x{a1}"},  # inverted !
         '(cent|#162)'   => {'tex' => '{/Text \242}',    'web' => "\x{a2}"},  # Cent currency.
         '(pound|#163}'  => {'tex' => '{/Text \243}',    'web' => "\x{a3}"},  # GB Pound currency.
         '(curren|#164)' => {'tex' => '{/Text \250}',    'web' => "\x{a4}"},  # Generic currency symb.
         '(yen|#165)'    => {'tex' => '{/Text \245}',    'web' => "\x{a5}"},  # Yen currency.
         '(brvbar|#166)' => {'tex' => '{/Symbol \174}',  'web' => "\x{a6}"},  # Broken vert bar no print.
         '(sect|#167)'   => {'tex' => '{\247}',          'web' => "\x{a7}"},  # Section symbol.
         '(uml|#168)'    => {'tex' => '{\250}',          'web' => "\x{a8}"},  # 'naked' umlaut.
         '(copy|#169)'   => {'tex' => '{/Symbol \343}',  'web' => "\x{a9}"},  # Copyright symbol.
         '(ordf|#170)'   => {'tex' => '{/Text \343}',    'web' => "\x{aa}"},  # Feminine ordinal.
         '(laquo|#171)'  => {'tex' => '{/Text \253}',    'web' => "\x{ab}"},  # << quotes.
         '(not|#172)'    => {'tex' => '\254',            'web' => "\x{ac}"},  # Logical not.
         '(shy|#173)'    => {'tex' => '-',               'web' => "\x{ad}"},  # soft hyphen.
         '(reg|#174)'    => {'tex' => '{/Symbol \342}',  'web' => "\x{ae}"},  # Registered tm.
         '(macr|#175)'   => {'tex' => '^{-}',            'web' => "\x{af}"},  # 'naked' macron (overbar).
         '(deg|#176)'    => {'tex' => '{/Text \312}',    'web' => "\x{b0}"},  # Degree symbo..
         '(plusmn|#177)' => {'tex' => '{/Symbol \261}',  'web' => "\x{b1}"},  # +/- symbol.
         '(sup2|#178)'   => {'tex' => '^2',              'web' => "\x{b2}"},  # Superscript 2.
         '(sup3|#179)'   => {'tex' => '^3',              'web' => "\x{b3}"},  # Superscript 3.
         '(acute|#180)'  => {'tex' => '{/Text \302}',    'web' => "\x{b4}"},  # 'naked' acute accent.
         '(micro|#181)'  => {'tex' => '{/Symbol \155}',  'web' => "\x{b5}"},  # Micro (small mu).
         '(para|#182)'   => {'tex' => '{/Text \266}',    'web' => "\x{b6}"},  # Paragraph symbol.
         '(middot|#183)' => {'tex' => '^.',              'web' => "\x{b7}"},  # middle dot (maybe text 267 is better)?
         '(cedil|#184)'  => {'tex' => '\233',            'web' => "\x{b8}"},  # 'naked' cedilla.
         '(sup1|#185)'   => {'tex' => '^1',              'web' => "\x{b9}"},  # superscript 1.
         '(ordm|#186)'   => {'tex' => '\353',            'web' => "\x{ba}"},  # masculine ordinal.
         '(raquo|#187)', => {'tex' => '\273',            'web' => "\x{bb}"},  # Right angle quotes.
         '(frac14|#188)' => {'tex' => '\274',            'web' => "\x{bc}"},  # 1/4.
         '(frac12|#189)' => {'tex' => '\275',            'web' => "\x{bd}"},  # 1/2.
         '(frac34|#190)' => {'tex' => '\276',            'web' => "\x{be}"},  # 3/4
         '(iquest|#191)' => {'tex' => '{/Text \277}',    'web' => "\x{bf}"},  # Inverted ?
         '(Agrave|#192)' => {'tex' => '\300',            'web' => "\x{c0}"},  # A Grave.
         '(Aacute|#193)' => {'tex' => '\301',            'web' => "\x{c1}"},  # A Acute.
         '(Acirc|#194)'  => {'tex' => '\302',            'web' => "\x{c2}"},  # A Circumflex.
         '(Atilde|#195)' => {'tex' => '\303',            'web' => "\x{c3}"},  # A tilde.
         '(Auml|#196)'   => {'tex' => '\304',            'web' => "\x{c4}"},  # A umlaut.
         '(Aring|#197)'  => {'tex' => '\305',            'web' => "\x{c5}"},  # A ring.
         '(AElig|#198)'  => {'tex' => '\306',            'web' => "\x{c6}"},  # AE ligature.
         '(Ccedil|#199)' => {'tex' => '\307',            'web' => "\x{c7}"},  # C cedilla
         '(Egrave|#200)' => {'tex' => '\310',            'web' => "\x{c8}"},  # E Accent grave.
         '(Eacute|#201)' => {'tex' => '\311',            'web' => "\x{c9}"},  # E acute accent.
         '(Ecirc|#202)'  => {'tex' => '\312',            'web' => "\x{ca}"},  # E Circumflex.
         '(Euml|#203)'   => {'tex' => '\313',            'web' => "\x{cb}"},  # E umlaut.
         '(Igrave|#204)' => {'tex' => '\314',            'web' => "\x{cc}"},  # I grave accent.
         '(Iacute|#205)' => {'tex' => '\315',            'web' => "\x{cd}"},  # I acute accent.
         '(Icirc|#206)'  => {'tex' => '\316',            'web' => "\x{ce}"},  # I circumflex.
         '(Iuml|#207)'   => {'tex' => '\317',            'web' => "\x{cf}"},  # I umlaut.
         '(ETH|#208)'    => {'tex' => '\320',            'web' => "\x{d0}"},  # Icelandic Cap eth.
         '(Ntilde|#209)' => {'tex' => '\321',            'web' => "\x{d1}"},  # Ntilde (enyan).
         '(Ograve|#210)' => {'tex' => '\322',            'web' => "\x{d2}"},  # O accent grave.
         '(Oacute|#211)' => {'tex' => '\323',            'web' => "\x{d3}"},  # O accent acute.
         '(Ocirc|#212)'  => {'tex' => '\324',            'web' => "\x{d4}"},  # O circumflex.
         '(Otilde|#213)' => {'tex' => '\325',            'web' => "\x{d5}"},  # O tilde.
         '(Ouml|#214)'   => {'tex' => '\326',            'web' => "\x{d6}"},  # O umlaut.
         '(times|#215)'  => {'tex' => '\327',            'web' => "\x{d7}"},  # Times symbol.
         '(Oslash|#216)' => {'tex' => '\330',            'web' => "\x{d8}"},  # O slash.
         '(Ugrave|#217)' => {'tex' => '\331',            'web' => "\x{d9}"},  # U accent grave.
         '(Uacute|#218)' => {'tex' => '\332',            'web' => "\x{da}"},  # U accent acute.
         '(Ucirc|#219)'  => {'tex' => '\333',            'web' => "\x{db}"},  # U circumflex.
         '(Uuml|#220)'   => {'tex' => '\334',            'web' => "\x{dc}"},  # U umlaut.
         '(Yacute|#221)' => {'tex' => '\335',            'web' => "\x{dd}"},  # Y accent acute.
         '(THORN|#222)'  => {'tex' => '\336',            'web' => "\x{de}"},  # Icelandic thorn.
         '(szlig|#223)'  => {'tex' => '\337',            'web' => "\x{df}"},  # German sharfes s.
         '(agrave|#224)' => {'tex' => '\340',            'web' => "\x{e0}"},  # a accent grave.
         '(aacute|#225)' => {'tex' => '\341',            'web' => "\x{e1}"},  # a grave.
         '(acirc|#226)'  => {'tex' => '\342',            'web' => "\x{e2}"},  # a circumflex.
         '(atilde|#227)' => {'tex' => '\343',            'web' => "\x{e3}"},  # a tilde.
         '(auml|#228)'   => {'tex' => '\344',            'web' => "\x{e4}"},  # a umlaut
         '(aring|#229)'  => {'tex' => '\345',            'web' => "\x{e5}"},  # a ring on top.
         '(aelig|#230)'  => {'tex' => '\346',            'web' => "\x{e6}"},  # ae ligature.
         '{ccedil|#231)' => {'tex' => '\347',            'web' => "\x{e7}"},  # C cedilla
         '(egrave|#232)' => {'tex' => '\350',            'web' => "\x{e8}"},  # e accent grave.
         '(eacute|#233)' => {'tex' => '\351',            'web' => "\x{e9}"},  # e accent acute.
         '(ecirc|#234)'  => {'tex' => '\352',            'web' => "\x{ea}" }, # e circumflex.
         '(euml|#235)'   => {'tex' => '\353',            'web' => "\x{eb}"},  # e umlaut.
         '(igrave|#236)' => {'tex' => '\354',            'web' => "\x{ec}"},  # i grave.
         '(iacute|#237}' => {'tex' => '\355',            'web' => "\x{ed}"},  # i acute.
         '(icirc|#238}'  => {'tex' => '\356',            'web' => "\x{ee}"},  # i circumflex.
         '(iuml|#239)'   => {'tex' => '\357',            'web' => "\x{ef}"},  # i umlaut.
         '(eth|#240)'    => {'tex' => '\360',            'web' => "\x{f0}"},  # Icelandic eth.
         '(ntilde|#241)' => {'tex' => '\361',            'web' => "\x{f1}"},  # n tilde.
         '(ograve|#242)' => {'tex' => '\362',            'web' => "\x{f2}"},  # o grave.
         '(oacute|#243)' => {'tex' => '\363',            'web' => "\x{f3}"},  # o acute.
         '(ocirc'|#244)' => {'tex' => '\364',            'web' => "\x{f4}"},  # o circumflex.
         '(otilde|#245)' => {'tex' => '\365',            'web' => "\x{f5}"},  # o tilde.
         '(ouml|#246)'   => {'tex' => '\366',            'web' => "\x{f6}"},  # o umlaut.
         '(divide|#247)' => {'tex' => '\367',            'web' => "\x{f7}"},  # division symbol
         '(oslash|#248)' => {'tex' => '\370',            'web' => "\x{f8}"},  # o slashed.
         '(ugrave|#249)' => {'tex' => '\371',            'web' => "\x{f9}"},  # u accent grave.
         '(uacute|#250)' => {'tex' => '\372',            'web' => "\x{fa}"},  # u acute.
         '(ucirc|#251)'  => {'tex' => '\373',            'web' => "\x{fb}"},  # u circumflex.
         '(uuml|#252)'   => {'tex' => '\374',            'web' => "\x{fc}"},  # u umlaut.
         '(yacute|#253)' => {'tex' => '\375',            'web' => "\x{fd}"},  # y acute accent.
         '(thorn|#254)'  => {'tex' => '\376',            'web' => "\x{fe}"},  # small thorn (icelandic).
         '(yuml|#255)'   => {'tex' => '\377',            'web' => "\x{ff}"},  # y umlaut.
         
         # Latin extended A entities:
   
         '(OElig|#338)'  => {'tex' => '{/Text \352}',   'web' => "\x{152}"},  # OE ligature.
         '(oelig|#339)'  => {'tex' => '{/Text \372}',   'web' => "\x{153}"},  # oe ligature.
         '(Scaron|#352)' => {'tex' => 'S',              'web' => "\x{160}"},  # S caron no printable.
         '(scaron|#353)' => {'tex' => 's',              'web' => "\x{161}"},  # s caron no printable.
         '(Yuml|#376)'   => {'tex' => 'Y',              'web' => "\x{178}"},  # Y umlaut - no printable.
   
         # Latin extended B.
   
         '(fnof|#402)'  => {'tex' =>'{/Symbol 246}',    'web' => "\x{192}"},  # f with little hook.
   
         # Standalon accents:
   
         '(circ|#710)'  => {'tex' => '^',               'web' => '^'},        # circumflex.
         '(tilde|#732)' => {'tex' => '~',               'web' => '~'},        # tilde.
   
         
   
       );
   
   
   sub replace_entities {
       my ($target,$text) = @_;
       $text =~ s{([_^~\{\}]|\\\\)}{\\\\$1}g;
       while (my ($re, $replace) = each(%lookup)) {
    my $repl = $replace->{$target};
    $text =~ s/&$re;/$replace->{$target}/g;
       }
       $text =~ s{(&)}{\\\\$1}g;
       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 762  sub start_title { Line 1049  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 793  sub start_xlabel { Line 1081  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 825  sub start_ylabel { Line 1114  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 858  sub start_label { Line 1148  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 1115  sub get_attributes{ Line 1405  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();      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 1210  sub write_gnuplot_file { Line 1499  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 1231  sub write_gnuplot_file { Line 1526  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 \"".$font_properties->{'printname'}.",".$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 \"".$font_properties->{'printname'}.",".$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 \"".$font_properties->{'printname'}.",".$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 1263  sub write_gnuplot_file { Line 1561  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 1280  sub write_gnuplot_file { Line 1594  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 "'.$font_properties->{'printname'}.','.$pt.'pt"' ;      $gnuplot_input .=' font "'.$font_properties->{'printname'}.','.$fontsize.'pt"' ;
         }          }
         $gnuplot_input .= $/;          $gnuplot_input .= $/;
     }      }
Line 1303  sub write_gnuplot_file { Line 1622  sub write_gnuplot_file {
  $curve->{'function'}.' title "'.   $curve->{'function'}.' title "'.
  $curve->{'name'}.'" with '.   $curve->{'name'}.'" with '.
                 $curve->{'linestyle'};                  $curve->{'linestyle'};
             $gnuplot_input.= ' linewidth '.$curve->{'linewidth'};  
   
             if (($curve->{'linestyle'} eq 'points')      ||              if (($curve->{'linestyle'} eq 'points')      ||
                 ($curve->{'linestyle'} eq 'linespoints') ||                  ($curve->{'linestyle'} eq 'linespoints') ||
Line 1315  sub write_gnuplot_file { Line 1633  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 1339  sub write_gnuplot_file { Line 1667  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 '.$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 1350  sub write_gnuplot_file { Line 1677  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.121  
changed lines
  Added in v.1.139


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