--- loncom/xml/lonplot.pm	2002/03/22 15:43:42	1.60
+++ loncom/xml/lonplot.pm	2002/04/25 17:25:36	1.69
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Dynamic plot
 #
-# $Id: lonplot.pm,v 1.60 2002/03/22 15:43:42 matthew Exp $
+# $Id: lonplot.pm,v 1.69 2002/04/25 17:25:36 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -97,12 +97,14 @@ my %linestyles =
 my $int_test       = sub {$_[0]=~s/\s+//g;$_[0]=~/^\d+$/};
 my $real_test      = 
     sub {$_[0]=~s/\s+//g;$_[0]=~/^[+-]?\d*\.?\d*([eE][+-]\d+)?$/};
+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-f]{6}$/};
 my $onoff_test     = sub {$_[0]=~/^(on|off)$/};
 my $key_pos_test   = sub {$_[0]=~/^(top|bottom|right|left|outside|below| )+$/};
 my $sml_test       = sub {$_[0]=~/^(small|medium|large)$/};
 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~!\@\#\$\%^&\*\(\)-=_\+\[\]\{\}:\;\'<>,\.\/\?\\]+ ?)+$/};
 
 ###################################################################
 ##                                                               ##
@@ -110,7 +112,7 @@ my $words_test     = sub {$_[0]=~s/\s+/
 ##                                                               ##
 ###################################################################
 my @gnuplot_edit_order = 
-    qw/bgcolor fgcolor height width font transparent grid border align/;
+    qw/alttag bgcolor fgcolor height width font transparent grid border align/;
 
 my $gnuplot_help_text = <<"ENDPLOTHELP";
 <p>
@@ -146,15 +148,22 @@ ENDPLOTHELP
 
 my %gnuplot_defaults = 
     (
+     alttag       => {
+	 default     => 'dynamically generated plot',
+	 test        => $words_test,
+	 description => 'brief description of the plot',
+      	 edit_type   => 'entry',
+	 size        => '40'
+	 },
      height       => {
-	 default     => 200,
+	 default     => 300,
 	 test        => $int_test,
 	 description => 'height of image (pixels)',
       	 edit_type   => 'entry',
 	 size        => '10'
 	 },
      width        => {
-	 default     => 200,
+	 default     => 400,
 	 test        => $int_test,
 	 description => 'width of image (pixels)',
 	 edit_type   => 'entry',
@@ -181,7 +190,7 @@ my %gnuplot_defaults =
 	 edit_type   => 'onoff'
 	 },
      grid         => {
-	 default     => 'off',
+	 default     => 'on',
 	 test        => $onoff_test, 
 	 description => 'Display grid',
 	 edit_type   => 'onoff'
@@ -200,7 +209,7 @@ my %gnuplot_defaults =
 	 choices     => ['small','medium','large']
 	 },
      align        => {
-	 default     => 'left',
+	 default     => 'center',
 	 test        => sub {$_[0]=~/^(left|right|center)$/},
 	 description => 'alignment for image in html',
 	 edit_type   => 'choice',
@@ -297,6 +306,7 @@ my %tic_defaults =
 	 },
      );
 
+my @axis_edit_order = ('color','xmin','xmax','ymin','ymax');
 my %axis_defaults = 
     (
      color   => {
@@ -367,7 +377,7 @@ is an error in your <b>function</b> tag.
 </dl>
 ENDCURVEHELP
 
-my @curve_edit_order = ('color','name','linestyle','pointsize');
+my @curve_edit_order = ('color','name','linestyle','pointtype','pointsize');
 
 my %curve_defaults = 
     (
@@ -402,10 +412,17 @@ my %curve_defaults =
 #         },
      pointsize => {
          default     => 1,
-         test        => $int_test,
+         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,7,8,9,10]
+         choices     => [0,1,2,3,4,5,6]
          }
      );
 
@@ -467,23 +484,22 @@ sub end_gnuplot {
 	## Determine filename
 	my $tmpdir = '/home/httpd/perl/tmp/';
 	my $filename = $ENV{'user.name'}.'_'.$ENV{'user.domain'}.
-	    '_'.time.'_'.$$.$randnumber.'_plot.data';
+	    '_'.time.'_'.$$.$randnumber.'_plot';
 	## Write the plot description to the file
 	&write_gnuplot_file($tmpdir,$filename,$target);
 	$filename = &Apache::lonnet::escape($filename);
 	## return image tag for the plot
 	if ($target eq 'web') {
 	    $result .= <<"ENDIMAGE";
-<img src    = "/cgi-bin/plot.gif?file=$filename&output=gif" 
-     width  = "$plot{'width'}" 
+<img src    = "/cgi-bin/plot.gif?file=$filename.data&output=gif" 
+     width  = "$plot{'width'}"
      height = "$plot{'height'}"
      align  = "$plot{'align'}"
-     alt    = "image should be /cgi-bin/plot.gif?$filename" />
+     alt    = "$plot{'alttag'}" />
 ENDIMAGE
         } elsif ($target eq 'tex') {
-	    &Apache::lonnet::ssi('cgi-bin/plot.gif?file=$filename'.
-				 '&output=eps');
-	    $result = "$filename.eps";
+	    &Apache::lonnet::ssi("/cgi-bin/plot.gif?file=$filename&output=eps");
+	    $result = '\\\\ \graphicspath{/home/httpd/perl/tmp/}\fbox{\includegraphics[width=9.0 cm]{'.&Apache::lonnet::unescape($filename).'.eps}} \\\\';
 	}
     } elsif ($target eq 'edit') {
 	$result.=&Apache::edit::tag_end($target,$token);
@@ -601,7 +617,7 @@ sub start_title {
 	my $text=&Apache::lonxml::get_all_text("/title",$$parser[-1]);
 	$result.=&Apache::edit::end_row().
 	    &Apache::edit::start_spanning_row().
-	    &Apache::edit::textfield('',$text,'',60);
+	    &Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {
 	my $text=$$parser[-1]->get_text("/title");
 	$result.=&Apache::edit::rebuild_tag($token);
@@ -635,7 +651,7 @@ sub start_xlabel {
 	my $text=&Apache::lonxml::get_all_text("/xlabel",$$parser[-1]);
 	$result.=&Apache::edit::end_row().
 	    &Apache::edit::start_spanning_row().
-	    &Apache::edit::textfield('',$text,'',60);
+	    &Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {
 	my $text=$$parser[-1]->get_text("/xlabel");
 	$result.=&Apache::edit::rebuild_tag($token);	
@@ -670,7 +686,7 @@ sub start_ylabel {
 	my $text = &Apache::lonxml::get_all_text("/ylabel",$$parser[-1]);
 	$result .= &Apache::edit::end_row().
 	    &Apache::edit::start_spanning_row().
-	    &Apache::edit::textfield('',$text,'',60);
+	    &Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {
 	my $text=$$parser[-1]->get_text("/ylabel");
 	$result.=&Apache::edit::rebuild_tag($token);
@@ -709,7 +725,7 @@ sub start_label {
 	my $text = &Apache::lonxml::get_all_text("/label",$$parser[-1]);
 	$result .= &Apache::edit::end_row().
 	    &Apache::edit::start_spanning_row().
-	    &Apache::edit::textfield('',$text,'',60);
+	    &Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {
 	&Apache::edit::get_new_args
 	    ($token,$parstack,$safeeval,keys(%label_defaults));
@@ -786,7 +802,7 @@ sub start_function {
 	my $text = &Apache::lonxml::get_all_text("/function",$$parser[-1]);
 	$result .= &Apache::edit::end_row().
 	    &Apache::edit::start_spanning_row().
-	    &Apache::edit::textfield('',$text,'',60);
+	    &Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {
 	$result.=&Apache::edit::rebuild_tag($token);
 	my $text=$$parser[-1]->get_text("/function");
@@ -862,7 +878,7 @@ sub start_data {
 	my $text = &Apache::lonxml::get_all_text("/data",$$parser[-1]);
 	$result .= &Apache::edit::end_row().
 	    &Apache::edit::start_spanning_row().
-	    &Apache::edit::textfield('',$text,'',60);
+	    &Apache::edit::editline('',$text,'',60);
     } elsif ($target eq 'modified') {
 	$result.=&Apache::edit::rebuild_tag($token);
 	my $text=$$parser[-1]->get_text("/data");
@@ -890,7 +906,8 @@ sub start_axis {
 			$tagstack->[-1]);
     } elsif ($target eq 'edit') {
 	$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') {
 	my $constructtag=&Apache::edit::get_new_args
 	    ($token,$parstack,$safeeval,keys(%axis_defaults));
@@ -974,14 +991,16 @@ sub write_gnuplot_file {
 	$gnuplot_input .= "set output\n";
     } elsif ($target eq 'tex') {
 	$gnuplot_input .= "set term postscript eps monochrome\n";
-	$gnuplot_input .= "set output \"$filename.eps\"\n";
+	$gnuplot_input .= "set output \"/home/httpd/perl/tmp/".
+	    &Apache::lonnet::unescape($filename).".eps\"\n";
     }
     # grid
     $gnuplot_input .= 'set grid'.$/ if ($plot{'grid'} eq 'on');
     # border
     $gnuplot_input .= ($plot{'border'} eq 'on'?
 		       'set border'.$/           :
-		       'set noborder'.$/         );    # title, xlabel, ylabel
+		       'set noborder'.$/         );
+    # title, xlabel, ylabel
     # titles
     $gnuplot_input .= "set title  \"$title\"\n"  if (defined($title)) ;
     $gnuplot_input .= "set xlabel \"$xlabel\"\n" if (defined($xlabel));
@@ -1010,7 +1029,7 @@ sub write_gnuplot_file {
     if (%key) {
 	$gnuplot_input .= 'set key '.$key{'pos'}.' ';
 	if ($key{'title'} ne '') {
-	    $gnuplot_input .= 'title " '.$key{'title'}.'" ';
+	    $gnuplot_input .= 'title "'.$key{'title'}.'" ';
 	} 
 	$gnuplot_input .= ($key{'box'} eq 'on' ? 'box ' : 'nobox ').$/;
     } else {
@@ -1042,6 +1061,7 @@ sub write_gnuplot_file {
                 ($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'})) {
@@ -1067,6 +1087,15 @@ sub write_gnuplot_file {
 	    $gnuplot_input.= '"'.$datafilename.'" title "'.
 		$curve->{'name'}.'" with '.
 		$curve->{'linestyle'};
+            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.
@@ -1140,11 +1169,11 @@ sub edit_attributes {
 sub insert_gnuplot {
     my $result = '';
     #  plot attributes
-    $result .= "<gnuplot \n";
+    $result .= "\n<gnuplot ";
     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)
     # $result .= &insert_key();
     # $result .= &insert_axis();
@@ -1153,7 +1182,7 @@ sub insert_gnuplot {
     # $result .= &insert_ylabel();    
     $result .= &insert_curve();
     # close up the <gnuplot>
-    $result .= "</gnuplot>\n";
+    $result .= "\n</gnuplot>";
     return $result;
 }
 
@@ -1167,9 +1196,9 @@ sub insert_xtics {
     my $result;
     $result .= "\n    <xtics ";
     foreach my $attr (keys(%tic_defaults)) {
-	$result .= "$attr=\"$tic_defaults{$attr}->{'default'}\" ";
+	$result .= "\n        $attr=\"$tic_defaults{$attr}->{'default'}\" ";
     }
-    $result .= "/>\n";
+    $result .= "/>";
     return $result;
 }
 
@@ -1177,19 +1206,19 @@ sub insert_ytics {
     my $result;
     $result .= "\n    <ytics ";
     foreach my $attr (keys(%tic_defaults)) {
-	$result .= "$attr=\"$tic_defaults{$attr}->{'default'}\" ";
+	$result .= "\n        $attr=\"$tic_defaults{$attr}->{'default'}\" ";
     }
-    $result .= "/>\n";
+    $result .= "/>";
     return $result;
 }
 
 sub insert_key {
     my $result;
-    $result .= "\n    <key \n";
+    $result .= "\n    <key ";
     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;
 }
 
@@ -1197,24 +1226,24 @@ sub insert_axis{
     my $result;
     $result .= "\n    <axis ";
    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;
 }
 
-sub insert_title { return "\n    <title></title>\n"; }
-sub insert_xlabel { return "\n    <xlabel></xlabel>\n"; }
-sub insert_ylabel { return "\n    <ylabel></ylabel>\n"; }
+sub insert_title  { return "\n    <title></title>"; }
+sub insert_xlabel { return "\n    <xlabel></xlabel>"; }
+sub insert_ylabel { return "\n    <ylabel></ylabel>"; }
 
 sub insert_label {
     my $result;
     $result .= "\n    <label ";
     foreach my $attr (keys(%label_defaults)) {
-	$result .= '         '.$attr.'="'.
-	    $label_defaults{$attr}->{'default'}."\"\n";
+	$result .= "\n         $attr=\"".
+            $label_defaults{$attr}->{'default'}."\"";
     }
-    $result .= "   ></label>\n";
+    $result .= "></label>";
     return $result;
 }
 
@@ -1222,22 +1251,22 @@ sub insert_curve {
     my $result;
     $result .= "\n    <curve ";
     foreach my $attr (keys(%curve_defaults)) {
-	$result .= '         '.$attr.'="'.
-	    $curve_defaults{$attr}->{'default'}."\"\n";
+	$result .= "\n         $attr=\"".
+	    $curve_defaults{$attr}->{'default'}."\"";
     }
-    $result .= "    >\n";
-    $result .= &insert_data().&insert_data()."</curve>\n";
+    $result .= " >";
+    $result .= &insert_data().&insert_data()."\n    </curve>";
 }
 
 sub insert_function {
     my $result;
-    $result .= "<function></function>\n";
+    $result .= "\n        <function></function>";
     return $result;
 }
 
 sub insert_data {
     my $result;
-    $result .= "     <data></data>\n";
+    $result .= "\n        <data></data>";
     return $result;
 }