--- loncom/xml/lonxml.pm	2003/02/19 14:55:27	1.236
+++ loncom/xml/lonxml.pm	2003/05/21 20:41:55	1.255
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # XML Parser Module 
 #
-# $Id: lonxml.pm,v 1.236 2003/02/19 14:55:27 www Exp $
+# $Id: lonxml.pm,v 1.255 2003/05/21 20:41:55 sakharuk Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -145,7 +145,7 @@ $Apache::lonxml::registered=0;
 $Apache::lonxml::request='';
 
 # a problem number counter, and check on ether it is used
-$Apache::lonxml::counter=4;
+$Apache::lonxml::counter=1;
 $Apache::lonxml::counter_changed=0;
 
 #internal check on whether to look at style defs
@@ -196,6 +196,13 @@ sub xmlend {
                  my $message=$contrib{$idx.':message'};
                  $message=~s/\n/\<br \/\>/g;
 		 $message=&Apache::lontexconvert::msgtexconverted($message);
+                 if ($contrib{$idx.':attachmenturl'}) {
+                     my ($fname,$ft)
+                        =($contrib{$idx.':attachmenturl'}=~/\/(\w+)\.(\w+)$/);
+		     $message.='<p>Attachment: <a href="'.
+	       &Apache::lonnet::tokenwrapper($contrib{$idx.':attachmenturl'}).
+                     '"><tt>'.$fname.'.'.$ft.'</tt></a>';
+                 }
                  if ($message) {
                   if ($hidden) {
 		      $message='<font color="#888888">'.$message.'</font>';
@@ -248,7 +255,7 @@ sub xmlend {
           }
           if ($discussiononly) {
 	      $discussion.=(<<ENDDISCUSS);
-<form action="/adm/feedback" method="post" name="mailform">
+<form action="/adm/feedback" method="post" name="mailform" enctype="multipart/form-data">
 <input type="submit" name="discuss" value="Post Discussion" />
 <input type="submit" name="anondiscuss" value="Post Anonymous Discussion" />
 <input type="hidden" name="symb" value="$symb" />
@@ -257,6 +264,9 @@ sub xmlend {
 <font size="1">Note: in anonymous discussion, your name is visible only to
 course faculty</font><br />
 <textarea name=comment cols=60 rows=10 wrap=hard></textarea>
+<p>
+Attachment (128 KB max size): <input type="file" name="attachment" />
+</p>
 </form>
 ENDDISCUSS
              $discussion.=&Apache::lonfeedback::generate_preview_button();
@@ -370,8 +380,11 @@ sub printtokenheader {
 sub fontsettings() {
     my $headerstring='';
     if (($ENV{'browser.os'} eq 'mac') && (!$ENV{'browser.mathml'})) { 
-         $headerstring.=
-             '<meta Content-Type="text/html; charset=x-mac-roman">';
+	$headerstring.=
+	    '<meta Content-Type="text/html; charset=x-mac-roman">';
+    } elsif (!$ENV{'browser.mathml'}) {
+	$headerstring.=
+	    '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
     }
     return $headerstring;
 }
@@ -391,6 +404,7 @@ sub xmlparse {
  &Apache::inputtags::initialize_inputtags();
  &Apache::outputtags::initialize_outputtags();
  &Apache::edit::initialize_edit();
+
 #
 # do we have a course style file?
 #
@@ -407,8 +421,7 @@ sub xmlparse {
        }
     }
  }
-
- #&printalltags();
+#&printalltags();
  my @pars = ();
  my $pwd=$ENV{'request.filename'};
  $pwd =~ s:/[^/]*$::;
@@ -427,6 +440,7 @@ sub xmlparse {
 
  my $finaloutput = &inner_xmlparse($target,\@stack,\@parstack,\@pars,
 				   $safeeval,\%style_for_target);
+
  if ($ENV{'request.uri'}) {
     &writeallows($ENV{'request.uri'});
  }
@@ -458,27 +472,19 @@ sub htmlclean {
 sub latex_special_symbols {
     my ($current_token,$stack,$parstack,$where)=@_;
     if ($where eq 'header') {
-      $current_token =~ s/\\/ /g;
-      $current_token =~ s/\{/\\\{/g;
-      $current_token =~ s/\}/\\\}/g;
-      $current_token =~ s/_/ /g;
-      $current_token =~ s/\^/ /g;
-      $current_token =~ s/&/\\&/g;
-      $current_token =~ s/\#/\\\#/g;
-      $current_token =~ s/%/\\%/g;
-      $current_token =~ s/\$/\\\$/g;
+	$current_token =~ s/(\\|_|\^)/ /g;
+	$current_token =~ s/(\$|%|\#|&|\{|\})/\\$1/g;
     } else {
-     $current_token=~s/\\ /\\char92 /g;
-     $current_token=~s/\^/\\char94 /g;
-     $current_token=~s/\~/\\char126 /g;
-     $current_token=~s/(&[^a-z\#])/\\$1/g;
-     $current_token=~s/([^&])\#/$1\\#/g;
-     $current_token=~s/(\$|_|{|})/\\$1/g;
-     $current_token=~s/\\char92 /\\texttt{\\char92}/g;
-     $current_token=~s/>/\$>\$/g; #more
-     $current_token=~s/</\$<\$/g; #less
-     if ($current_token=~m/\d%/) {$current_token =~ s/(\d)%/$1\\%/g;} #percent after digit
-     if ($current_token=~m/\s%/) {$current_token =~ s/(\s)%/$1\\%/g;} #persent after space
+	$current_token=~s/\\ /\\char92 /g;
+	$current_token=~s/\^/\\char94 /g;
+	$current_token=~s/\~/\\char126 /g;
+	$current_token=~s/(&[^A-Za-z\#])/\\$1/g;
+	$current_token=~s/([^&])\#/$1\\#/g;
+	$current_token=~s/(\$|_|{|})/\\$1/g;
+	$current_token=~s/\\char92 /\\texttt{\\char92}/g;
+	$current_token=~s/(>|<)/\$$1\$/g; #more or less
+	if ($current_token=~m/\d%/) {$current_token =~ s/(\d)%/$1\\%/g;} #percent after digit
+	if ($current_token=~m/\s%/) {$current_token =~ s/(\s)%/$1\\%/g;} #persent after space
     }
     return $current_token;
 }
@@ -494,7 +500,8 @@ sub inner_xmlparse {
 	if ($metamode<1) {
 	    my $text=$token->[1];
 	    if ($token->[0] eq 'C' && $target eq 'tex') {
-		$text = '%'.$text."\n";
+		$text = '';
+#		$text = '%'.$text."\n";
 	    }
 	    $result.=$text;
 	}
@@ -513,6 +520,12 @@ sub inner_xmlparse {
 	    $Apache::lonxml::usestyle=0;
 	    my $string=$$style_for_target{$token->[1]}.
 	      '<LONCAPA_INTERNAL_TURN_STYLE_ON />';
+##### LETS TRY VARIABLE INTERPOLATION (it may be stupid but at least it works)
+	    my %localhash=%{$token->[2]};
+	    foreach my $localkey (keys %localhash) {
+		$string=~s/\$$localkey/$localhash{$localkey}/g;
+	    }
+#####
 	    &Apache::lonxml::newparser($pars,\$string);
 	} else {
 	  $result = &callsub("start_$token->[1]", $target, $token, $stack,
@@ -523,10 +536,10 @@ sub inner_xmlparse {
 	while ($token->[1] ne $$stack['-1'] && ($#$stack > -1)) {
 	  my $lasttag=$$stack[-1];
 	  if ($token->[1] =~ /^$lasttag$/i) {
-	    &Apache::lonxml::warning('Using tag &lt;/'.$token->[1].'&gt; as end tag to &lt;'.$$stack[-1].'&gt;');
+	    &Apache::lonxml::warning('Using tag &lt;/'.$token->[1].'&gt; on line '.$token->[3].' as end tag to &lt;'.$$stack[-1].'&gt;');
 	    last;
 	  } else {
-	    &Apache::lonxml::warning('Found tag &lt;/'.$token->[1].'&gt; when looking for &lt;/'.$$stack[-1].'&gt; in file');
+	    &Apache::lonxml::warning('Found tag &lt;/'.$token->[1].'&gt; on line '.$token->[3].' when looking for &lt;/'.$$stack[-1].'&gt; in file');
 	    &end_tag($stack,$parstack,$token);
 	  }
 	}
@@ -536,6 +549,14 @@ sub inner_xmlparse {
 	    $Apache::lonxml::usestyle=0;
 	    my $string=$$style_for_target{'/'.$token->[1]}.
 	      '<LONCAPA_INTERNAL_TURN_STYLE_ON />';
+##### LETS TRY VARIABLE INTERPOLATION (it may be stupid but at least it works)
+	    my @localarray = split /;/, $$parstack[-1];
+	    foreach my $localelement (@localarray) {
+		$localelement=~/my\s+\$([^=]+)=\"(.*)\"$/;
+		my ($whatchange,$tochange) = ($1,$2);
+		$string=~s/\$$whatchange/$tochange/g;
+	    }
+#####
 	    &Apache::lonxml::newparser($pars,\$string);
 	} else {
 	  $result = &callsub("end_$token->[1]", $target, $token, $stack,
@@ -553,9 +574,10 @@ sub inner_xmlparse {
 	}
       }
       if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {
-	if ($target eq 'tex') {
-	    $result=&latex_special_symbols($result,$stack,$parstack);
-	}
+	  #Style file definitions should be correct
+	  if ($target eq 'tex' && ($Apache::lonxml::usestyle)) {
+	      $result=&latex_special_symbols($result,$stack,$parstack);
+	  }
       }
 
       # Encode any high ASCII characters
@@ -714,6 +736,7 @@ sub init_safespace {
   $safeeval->permit("sort");
   $safeeval->deny(":base_io");
   $safehole->wrap(\&Apache::scripttag::xmlparse,$safeeval,'&xmlparse');
+  $safehole->wrap(\&Apache::outputtags::multipart,$safeeval,'&multipart');
   $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT');
   
   $safehole->wrap(\&Math::Cephes::asin,$safeeval,'&asin');
@@ -795,6 +818,7 @@ sub init_safespace {
   my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
   $rndseed=&Apache::lonnet::rndseed($symb,$courseid,$domain,$name);
   $safeinit .= ';$external::randomseed='.$rndseed.';';
+  &Apache::lonxml::debug("Setting rndseed to $rndseed");
   &Apache::run::run($safeinit,$safeeval);
 }
 
@@ -802,7 +826,7 @@ sub default_homework_load {
     my ($safeeval)=@_;
     &Apache::lonxml::debug('Loading default_homework');
     my $default=&Apache::lonnet::getfile('/home/httpd/html/res/adm/includes/default_homework.lcpm');
-    if ($default == -1) {
+    if ($default eq -1) {
 	&Apache::lonxml::error("<b>Unable to find <i>default_homework.lcpm</i></b>");
     } else {
 	&Apache::run::run($default,$safeeval);
@@ -894,18 +918,23 @@ sub get_all_text_unbalanced {
 }
 
 sub increment_counter {
-    $Apache::lonxml::counter++;
+    my ($increment) = @_;
+    if (defined($increment) && $increment gt 0) {
+	$Apache::lonxml::counter+=$increment;
+    } else {
+	$Apache::lonxml::counter++;
+    }
     $Apache::lonxml::counter_changed=1;
 }
 
 sub init_counter {
     if (defined($ENV{'form.counter'})) {
 	$Apache::lonxml::counter=$ENV{'form.counter'};
-    } elsif (not defined($Apache::lonxml::counter)) {
+	$Apache::lonxml::counter_changed=0;
+    } else {
 	$Apache::lonxml::counter=1;
-	&store_counter();
+	$Apache::lonxml::counter_changed=1;
     }
-    $Apache::lonxml::counter_changed=0;
 }
 
 sub store_counter {
@@ -1107,6 +1136,14 @@ sub inserteditinfo {
       my ($result,$filecontents)=@_;
       $filecontents = &HTML::Entities::encode($filecontents);
 #      my $editheader='<a href="#editsection">Edit below</a><hr />';
+      my $xml_help = '<table><tr><td>'.
+	  &Apache::loncommon::help_open_topic("Greek_Symbols",'Greek Symbols',
+					      undef,undef,600)
+	      .'</td><td>'.
+          &Apache::loncommon::help_open_topic("Other_Symbols",'Other Symbols',
+					      undef,undef,600)
+	      .'</td></tr></table>';
+      my $titledisplay=&display_title();
       my $buttons=(<<BUTTONS);
 <input type="submit" name="attemptclean" 
        value="Save and then attempt to clean HTML" />
@@ -1117,12 +1154,14 @@ BUTTONS
 <hr />
 <a name="editsection" />
 <form method="post">
+$xml_help
 <input type="hidden" name="editmode" value="Edit" />
 $buttons<br />
 <textarea cols="80" rows="40" name="filecont">$filecontents</textarea>
 <br />$buttons
 <br />
 </form>
+$titledisplay
 ENDFOOTER
 #      $result=~s/(\<body[^\>]*\>)/$1$editheader/is;
       $result=~s/(\<\/body\>)/$editfooter/is;
@@ -1157,37 +1196,37 @@ sub get_target {
 }
 
 sub handler {
-  my $request=shift;
-
-  my $target=&get_target();
-
-  $Apache::lonxml::debug=0;
-
-  if ($ENV{'browser.mathml'}) {
-    $request->content_type('text/xml');
-  } else {
-    $request->content_type('text/html');
-  }
-  &Apache::loncommon::no_cache($request);
-  $request->send_http_header;
-
-  return OK if $request->header_only;
+    my $request=shift;
+    
+    my $target=&get_target();
+    
+    $Apache::lonxml::debug=0;
+    
+    if ($ENV{'browser.mathml'}) {
+	$request->content_type('text/xml');
+    } else {
+	$request->content_type('text/html');
+    }
+    &Apache::loncommon::no_cache($request);
+    $request->send_http_header;
+    
+    return OK if $request->header_only;
 
 
-  my $file=&Apache::lonnet::filelocation("",$request->uri);
+    my $file=&Apache::lonnet::filelocation("",$request->uri);
 #
 # Edit action? Save file.
 #
-  unless ($ENV{'request.state'} eq 'published') {
-      if (($ENV{'form.savethisfile'}) || ($ENV{'form.attemptclean'})) {
-	  &storefile($file,$ENV{'form.filecont'});
-      }
-  }
-  my %mystyle;
-  my $result = '';
-  my $filecontents=&Apache::lonnet::getfile($file);
-  if ($filecontents == -1) {
-    $result=(<<ENDNOTFOUND);
+    unless ($ENV{'request.state'} eq 'published') {
+	if (($ENV{'form.savethisfile'}) || ($ENV{'form.attemptclean'})) {
+	    &storefile($file,$ENV{'form.filecont'});
+	}
+    }
+    my %mystyle;
+    my $result = '';
+    my $filecontents=&Apache::lonnet::getfile($file);
+    if ($filecontents eq -1) {
+	$result=(<<ENDNOTFOUND);
 <html>
 <head>
 <title>File not found</title>
@@ -1198,40 +1237,54 @@ sub handler {
 </html>
 ENDNOTFOUND
     $filecontents='';
-    if ($ENV{'request.state'} ne 'published') {
-      $filecontents=&createnewhtml();
-      $ENV{'form.editmode'}='Edit'; #force edit mode
-    }
-  } else {
-    unless ($ENV{'request.state'} eq 'published') {
-      if ($ENV{'form.attemptclean'}) {
-	$filecontents=&htmlclean($filecontents,1);
-      }
-    }
-    if (!$ENV{'form.editmode'} || $ENV{'form.viewmode'}) {
-      $result = &Apache::lonxml::xmlparse($request,$target,$filecontents,
-					  '',%mystyle);
+	if ($ENV{'request.state'} ne 'published') {
+	    $filecontents=&createnewhtml();
+	    $ENV{'form.editmode'}='Edit'; #force edit mode
+	}
+    } else {
+	unless ($ENV{'request.state'} eq 'published') {
+	    if ($ENV{'form.attemptclean'}) {
+		$filecontents=&htmlclean($filecontents,1);
+	    }
+	}
+	if (!$ENV{'form.editmode'} || $ENV{'form.viewmode'}) {
+	    $result = &Apache::lonxml::xmlparse($request,$target,$filecontents,
+						'',%mystyle);
+	}
     }
-  }
-
+    
 #
 # Edit action? Insert editing commands
 #
-  unless ($ENV{'request.state'} eq 'published') {
-    if ($ENV{'form.editmode'} && (!($ENV{'form.viewmode'}))) {
-	my $displayfile=$request->uri;
-        $displayfile=~s/^\/[^\/]*//;
-      $result='<html><body bgcolor="#FFFFFF"><h3>'.$displayfile.
-              '</h3></body></html>';
-      $result=&inserteditinfo($result,$filecontents);
+    unless ($ENV{'request.state'} eq 'published') {
+	if ($ENV{'form.editmode'} && (!($ENV{'form.viewmode'}))) {
+	    my $displayfile=$request->uri;
+	    $displayfile=~s/^\/[^\/]*//;
+	    $result='<html><body bgcolor="#FFFFFF"><h3>'.$displayfile.
+		'</h3></body></html>';
+	    $result=&inserteditinfo($result,$filecontents);
+	}
     }
-  }
-
-  writeallows($request->uri);
-
-  $request->print($result);
-
-  return OK;
+    
+    writeallows($request->uri);
+    
+
+    $request->print($result);
+    
+    return OK;
+}
+
+sub display_title {
+    my $result;
+    if ($ENV{'request.state'} eq 'construct') {
+	my $title=&Apache::lonnet::gettitle();
+	if (!defined($title) || $title eq '') {
+	    $title = $ENV{'request.filename'};
+	    $title = substr($title, rindex($title, '/') + 1);
+	}
+	$result = "<script type='text/javascript'>top.document.title = '$title - LON-CAPA Construction Space';</script>";
+    }
+    return $result;
 }
 
 sub debug {
@@ -1379,7 +1432,7 @@ sub description {
 # calls to lonnet functions for this setup.
 # - looks for form.grade_ parameters
 sub whichuser {
-  my ($symb,$courseid,$domain,$name);
+  my ($symb,$courseid,$domain,$name,$publicuser);
   if (defined($ENV{'form.grade_symb'})) {
     my $tmp_courseid=$ENV{'form.grade_courseid'};
     my $allowed=&Apache::lonnet::allowed('mgr',$tmp_courseid);
@@ -1390,12 +1443,18 @@ sub whichuser {
       $name=$ENV{'form.grade_username'};
     }
   } else {
-    $symb=&Apache::lonnet::symbread();
-    $courseid=$ENV{'request.course.id'};
-    $domain=$ENV{'user.domain'};
-    $name=$ENV{'user.name'};
+      $symb=&Apache::lonnet::symbread();
+      $courseid=$ENV{'request.course.id'};
+      $domain=$ENV{'user.domain'};
+      $name=$ENV{'user.name'};
+      if ($name eq 'public' && $domain eq 'public') {
+	  if (!defined($ENV{'form.username'})) {
+	      $ENV{'form.username'}.=time.rand(10000000);
+	  }
+	  $name.=$ENV{'form.username'};
+      }
   }
-  return ($symb,$courseid,$domain,$name);
+  return ($symb,$courseid,$domain,$name,$publicuser);
 }
 
 1;