Diff for /loncom/xml/lonxml.pm between versions 1.255 and 1.272

version 1.255, 2003/05/21 20:41:55 version 1.272, 2003/08/13 18:57:28
Line 69  use Safe::Hole(); Line 69  use Safe::Hole();
 use Math::Cephes();  use Math::Cephes();
 use Math::Random();  use Math::Random();
 use Opcode();  use Opcode();
   use POSIX qw(strftime);
   
   
 sub register {  sub register {
   my ($space,@taglist) = @_;    my ($space,@taglist) = @_;
Line 95  use Apache::run(); Line 97  use Apache::run();
 use Apache::londefdef();  use Apache::londefdef();
 use Apache::scripttag();  use Apache::scripttag();
 use Apache::edit();  use Apache::edit();
   use Apache::inputtags();
   use Apache::outputtags();
 use Apache::lonnet();  use Apache::lonnet();
 use Apache::File();  use Apache::File();
 use Apache::loncommon();  use Apache::loncommon();
Line 151  $Apache::lonxml::counter_changed=0; Line 155  $Apache::lonxml::counter_changed=0;
 #internal check on whether to look at style defs  #internal check on whether to look at style defs
 $Apache::lonxml::usestyle=1;  $Apache::lonxml::usestyle=1;
   
   #locations used to store the parameter string for style substitutions
   $Apache::lonxml::style_values='';
   $Apache::lonxml::style_end_values='';
   
 sub xmlbegin {  sub xmlbegin {
   my $output='';    my $output='';
   if ($ENV{'browser.mathml'}) {    if ($ENV{'browser.mathml'}) {
Line 382  sub fontsettings() { Line 390  sub fontsettings() {
     if (($ENV{'browser.os'} eq 'mac') && (!$ENV{'browser.mathml'})) {       if (($ENV{'browser.os'} eq 'mac') && (!$ENV{'browser.mathml'})) { 
  $headerstring.=   $headerstring.=
     '<meta Content-Type="text/html; charset=x-mac-roman">';      '<meta Content-Type="text/html; charset=x-mac-roman">';
     } elsif (!$ENV{'browser.mathml'}) {      } elsif (!$ENV{'browser.mathml'} && $ENV{'browser.unicode'}) {
  $headerstring.=   $headerstring.=
     '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';      '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
     }      }
Line 470  sub htmlclean { Line 478  sub htmlclean {
 }  }
   
 sub latex_special_symbols {  sub latex_special_symbols {
     my ($current_token,$stack,$parstack,$where)=@_;      my ($string,$where)=@_;
     if ($where eq 'header') {      if ($where eq 'header') {
  $current_token =~ s/(\\|_|\^)/ /g;   $string =~ s/(\\|_|\^)/ /g;
  $current_token =~ s/(\$|%|\#|&|\{|\})/\\$1/g;   $string =~ s/(\$|%|\#|&|\{|\})/\\$1/g;
     } else {      } else {
  $current_token=~s/\\ /\\char92 /g;   $string=~s/\\ /\\char92 /g;
  $current_token=~s/\^/\\char94 /g;   $string=~s/\^/\\char94 /g;
  $current_token=~s/\~/\\char126 /g;   $string=~s/\~/\\char126 /g;
  $current_token=~s/(&[^A-Za-z\#])/\\$1/g;   $string=~s/(&[^A-Za-z\#])/\\$1/g;
  $current_token=~s/([^&])\#/$1\\#/g;   $string=~s/([^&])\#/$1\\#/g;
  $current_token=~s/(\$|_|{|})/\\$1/g;   $string=~s/(\$|_|{|})/\\$1/g;
  $current_token=~s/\\char92 /\\texttt{\\char92}/g;   $string=~s/\\char92 /\\texttt{\\char92}/g;
  $current_token=~s/(>|<)/\$$1\$/g; #more or less   $string=~s/(>|<)/\$$1\$/g; #more or less
  if ($current_token=~m/\d%/) {$current_token =~ s/(\d)%/$1\\%/g;} #percent after digit   if ($string=~m/\d%/) {$string =~ s/(\d)%/$1\\%/g;} #percent after digit
  if ($current_token=~m/\s%/) {$current_token =~ s/(\s)%/$1\\%/g;} #persent after space   if ($string=~m/\s%/) {$string =~ s/(\s)%/$1\\%/g;} #percent after space
    if ($string eq '%.') {$string = '\%.';} #percent at the end of statement
     }      }
     return $current_token;      return $string;
 }  }
   
 sub inner_xmlparse {  sub inner_xmlparse {
Line 494  sub inner_xmlparse { Line 503  sub inner_xmlparse {
   my $finaloutput = '';    my $finaloutput = '';
   my $result;    my $result;
   my $token;    my $token;
     my $dontpop=0;
   while ( $#$pars > -1 ) {    while ( $#$pars > -1 ) {
     while ($token = $$pars['-1']->get_token) {      while ($token = $$pars['-1']->get_token) {
       if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {        if (($token->[0] eq 'T') || ($token->[0] eq 'C') ) {
  if ($metamode<1) {   if ($metamode<1) {
     my $text=$token->[1];      my $text=$token->[1];
     if ($token->[0] eq 'C' && $target eq 'tex') {      if ($token->[0] eq 'C' && $target eq 'tex') {
Line 505  sub inner_xmlparse { Line 515  sub inner_xmlparse {
     }      }
     $result.=$text;      $result.=$text;
  }   }
         } elsif (($token->[0] eq 'D')) {
    if ($metamode<1 && $target eq 'web') {
       my $text=$token->[1];
       $result.=$text;
    }
       } elsif ($token->[0] eq 'PI') {        } elsif ($token->[0] eq 'PI') {
  if ($metamode<1) {   if ($metamode<1 && $target eq 'web') {
   $result=$token->[2];    $result=$token->[2];
  }   }
       } elsif ($token->[0] eq 'S') {        } elsif ($token->[0] eq 'S') {
Line 520  sub inner_xmlparse { Line 535  sub inner_xmlparse {
     $Apache::lonxml::usestyle=0;      $Apache::lonxml::usestyle=0;
     my $string=$$style_for_target{$token->[1]}.      my $string=$$style_for_target{$token->[1]}.
       '<LONCAPA_INTERNAL_TURN_STYLE_ON />';        '<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);      &Apache::lonxml::newparser($pars,\$string);
       $Apache::lonxml::style_values=$$parstack[-1];
       $Apache::lonxml::style_end_values=$$parstack[-1];
  } else {   } else {
   $result = &callsub("start_$token->[1]", $target, $token, $stack,    $result = &callsub("start_$token->[1]", $target, $token, $stack,
      $parstack, $pars, $safeeval, $style_for_target);       $parstack, $pars, $safeeval, $style_for_target);
  }   }
       } elsif ($token->[0] eq 'E') {        } elsif ($token->[0] eq 'E') {
  #clear out any tags that didn't end  
  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; on line '.$token->[3].' as end tag to &lt;'.$$stack[-1].'&gt;');  
     last;  
   } else {  
     &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);  
   }  
  }  
   
  if ($Apache::lonxml::usestyle &&   if ($Apache::lonxml::usestyle &&
     exists($$style_for_target{'/'."$token->[1]"})) {      exists($$style_for_target{'/'."$token->[1]"})) {
     $Apache::lonxml::usestyle=0;      $Apache::lonxml::usestyle=0;
     my $string=$$style_for_target{'/'.$token->[1]}.      my $string=$$style_for_target{'/'.$token->[1]}.
       '<LONCAPA_INTERNAL_TURN_STYLE_ON />';        '<LONCAPA_INTERNAL_TURN_STYLE_ON end="'.$token->[1].'" />';
 ##### 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);      &Apache::lonxml::newparser($pars,\$string);
       $Apache::lonxml::style_values=$Apache::lonxml::style_end_values;
       $Apache::lonxml::style_end_values='';
       $dontpop=1;
  } else {   } else {
   $result = &callsub("end_$token->[1]", $target, $token, $stack,      #clear out any tags that didn't end
      $parstack, $pars,$safeeval, $style_for_target);      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; on line '.$token->[3].' as end tag to &lt;'.$$stack[-1].'&gt;');
       last;
    } else {
       &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);
    }
       }
       $result = &callsub("end_$token->[1]", $target, $token, $stack,
          $parstack, $pars,$safeeval, $style_for_target);
  }   }
       } else {        } else {
  &Apache::lonxml::error("Unknown token event :$token->[0]:$token->[1]:");   &Apache::lonxml::error("Unknown token event :$token->[0]:$token->[1]:");
       }        }
       #evaluate variable refs in result        #evaluate variable refs in result
       if ($result ne "") {        if ($result ne "") {
     my $extras;
     if (!$Apache::lonxml::usestyle) {
         $extras=$Apache::lonxml::style_values;
     }
  if ( $#$parstack > -1 ) {   if ( $#$parstack > -1 ) {
   $result=&Apache::run::evaluate($result,$safeeval,$$parstack[-1]);    $result=&Apache::run::evaluate($result,$safeeval,$extras.$$parstack[-1]);
  } else {   } else {
   $result= &Apache::run::evaluate($result,$safeeval,'');    $result= &Apache::run::evaluate($result,$safeeval,$extras);
  }   }
       }        }
       if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {        if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {
   #Style file definitions should be correct    #Style file definitions should be correct
   if ($target eq 'tex' && ($Apache::lonxml::usestyle)) {    if ($target eq 'tex' && ($Apache::lonxml::usestyle)) {
       $result=&latex_special_symbols($result,$stack,$parstack);        $result=&latex_special_symbols($result);
   }    }
       }        }
   
Line 591  sub inner_xmlparse { Line 600  sub inner_xmlparse {
       }        }
       $result = '';        $result = '';
   
       if ($token->[0] eq 'E') {         if ($token->[0] eq 'E' && !$dontpop) {
  &end_tag($stack,$parstack,$token);   &end_tag($stack,$parstack,$token);
       }        }
         $dontpop=0;
     }      }
     if ($#$pars > -1) {      if ($#$pars > -1) {
  pop @$pars;   pop @$pars;
Line 943  sub store_counter { Line 953  sub store_counter {
 }  }
   
 sub get_all_text {  sub get_all_text {
  my($tag,$pars)= @_;      my($tag,$pars,$style)= @_;
  &Apache::lonxml::debug("Got a ".ref($pars));      &Apache::lonxml::debug("Got a ".ref($pars));
  my $gotfullstack=1;      my $gotfullstack=1;
  if (ref($pars) ne 'ARRAY') {      if (ref($pars) ne 'ARRAY') {
      $gotfullstack=0;   $gotfullstack=0;
      $pars=[$pars];   $pars=[$pars];
  }      }
  my $depth=0;      &Apache::lonxml::debug("Got a ".ref($style));
  my $token;      if (ref($style) ne 'HASH') {
  my $result='';   $style={};
  if ( $tag =~ m:^/: ) {       } else {
    my $tag=substr($tag,1);    &Apache::lonhomework::showhash(%$style);
    #&Apache::lonxml::debug("have:$tag:");      }
    my $top_empty=0;      my $depth=0;
    while (($depth >=0) && ($#$pars > -1) && (!$top_empty)) {      my $token;
      while (($depth >=0) && ($token = $$pars[-1]->get_token)) {      my $result='';
        #&Apache::lonxml::debug("e token:$token->[0]:$depth:$token->[1]:".$#$pars.":".$#Apache::lonxml::pwd);      if ( $tag =~ m:^/: ) { 
        if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) {   my $tag=substr($tag,1); 
  $result.=$token->[1];   #&Apache::lonxml::debug("have:$tag:");
        } elsif ($token->[0] eq 'PI') {   my $top_empty=0;
  $result.=$token->[2];   while (($depth >=0) && ($#$pars > -1) && (!$top_empty)) {
        } elsif ($token->[0] eq 'S') {      while (($depth >=0) && ($token = $$pars[-1]->get_token)) {
  if ($token->[1] =~ /^$tag$/i) { $depth++; }   #&Apache::lonxml::debug("e token:$token->[0]:$depth:$token->[1]:".$#$pars.":".$#Apache::lonxml::pwd);
  $result.=$token->[4];   if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) {
        } elsif ($token->[0] eq 'E')  {      $result.=$token->[1];
  if ( $token->[1] =~ /^$tag$/i) { $depth--; }   } elsif ($token->[0] eq 'PI') {
  #skip sending back the last end tag      $result.=$token->[2];
  if ($depth > -1) { $result.=$token->[2]; } else {   } elsif ($token->[0] eq 'S') {
    $$pars[-1]->unget_token($token);      if ($token->[1] =~ /^$tag$/i) { $depth++; }
  }      if ($token->[1] =~ /^LONCAPA_INTERNAL_TURN_STYLE_ON$/i) { $Apache::lonxml::usestyle=1; }
        }      if ($token->[1] =~ /^LONCAPA_INTERNAL_TURN_STYLE_OFF$/i) { $Apache::lonxml::usestyle=0; }
      }      $result.=$token->[4];
      if (($depth >=0) && ($#$pars == 0) ) { $top_empty=1; }   } elsif ($token->[0] eq 'E')  {
      if (($depth >=0) && ($#$pars > 0) ) {      if ( $token->[1] =~ /^$tag$/i) { $depth--; }
        pop(@$pars);      #skip sending back the last end tag
        pop(@Apache::lonxml::pwd);      if ($depth == 0 && exists($$style{'/'.$token->[1]})) {
      }   my $string=
    }      '<LONCAPA_INTERNAL_TURN_STYLE_OFF end="yes" />'.
    if ($top_empty && $depth >= 0) {   $$style{'/'.$token->[1]}.
        #never found the end tag ran out of text, throw error send back blank      $token->[2].
        &error('Never found end tag for &lt;'.$tag.'&gt;');   '<LONCAPA_INTERNAL_TURN_STYLE_ON />';
        if ($gotfullstack) {   &Apache::lonxml::newparser($pars,\$string);
    my $newstring='</'.$tag.'>'.$result;   #&Apache::lonxml::debug("reParsing $string");
    &Apache::lonxml::newparser($pars,\$newstring);   next;
        }      }
        $result='';      if ($depth > -1) {
    }   $result.=$token->[2];
  } else {      } else {
      while ($#$pars > -1) {   $$pars[-1]->unget_token($token);
  while ($token = $$pars[-1]->get_token) {      }
      #&Apache::lonxml::debug("s token:$token->[0]:$depth:$token->[1]");   }
      if (($token->[0] eq 'T')||($token->[0] eq 'C')||      }
  ($token->[0] eq 'D')) {      if (($depth >=0) && ($#$pars == 0) ) { $top_empty=1; }
  $result.=$token->[1];      if (($depth >=0) && ($#$pars > 0) ) {
      } elsif ($token->[0] eq 'PI') {   pop(@$pars);
  $result.=$token->[2];   pop(@Apache::lonxml::pwd);
      } elsif ($token->[0] eq 'S') {      }
  if ( $token->[1] =~ /^$tag$/i) {   }
      $$pars[-1]->unget_token($token); last;   if ($top_empty && $depth >= 0) {
  } else {      #never found the end tag ran out of text, throw error send back blank
      $result.=$token->[4];      &error('Never found end tag for &lt;'.$tag.
  }     '&gt; current string <pre>'.
      } elsif ($token->[0] eq 'E')  {     &HTML::Entities::encode($result).
  $result.=$token->[2];     '</pre>');
      }      if ($gotfullstack) {
  }   my $newstring='</'.$tag.'>'.$result;
  if (($#$pars > 0) ) {   &Apache::lonxml::newparser($pars,\$newstring);
      pop(@$pars);      }
      pop(@Apache::lonxml::pwd);      $result='';
  } else { last; }   }
      }      } else {
  }   while ($#$pars > -1) {
  if ($result =~ m|<LONCAPA_INTERNAL_TURN_STYLE_ON />|) {      while ($token = $$pars[-1]->get_token) {
      $Apache::lonxml::usestyle=1;   #&Apache::lonxml::debug("s token:$token->[0]:$depth:$token->[1]");
  }   if (($token->[0] eq 'T')||($token->[0] eq 'C')||
  #&Apache::lonxml::debug("Exit:$result:");      ($token->[0] eq 'D')) {
  return $result      $result.=$token->[1];
    } elsif ($token->[0] eq 'PI') {
       $result.=$token->[2];
    } elsif ($token->[0] eq 'S') {
       if ( $token->[1] =~ /^$tag$/i) {
    $$pars[-1]->unget_token($token); last;
       } else {
    $result.=$token->[4];
       }
       if ($token->[1] =~ /^LONCAPA_INTERNAL_TURN_STYLE_ON$/i) { $Apache::lonxml::usestyle=1; }
       if ($token->[1] =~ /^LONCAPA_INTERNAL_TURN_STYLE_OFF$/i) { $Apache::lonxml::usestyle=0; }
    } elsif ($token->[0] eq 'E')  {
       $result.=$token->[2];
    }
       }
       if (($#$pars > 0) ) {
    pop(@$pars);
    pop(@Apache::lonxml::pwd);
       } else { last; }
    }
       }
       #&Apache::lonxml::debug("Exit:$result:");
       return $result
 }  }
   
 sub newparser {  sub newparser {
Line 1031  sub newparser { Line 1063  sub newparser {
   } else {    } else {
     push (@Apache::lonxml::pwd, $dir);      push (@Apache::lonxml::pwd, $dir);
   }     } 
 #  &Apache::lonxml::debug("pwd:$#Apache::lonxml::pwd");  
 #  &Apache::lonxml::debug("pwd:$Apache::lonxml::pwd[$#Apache::lonxml::pwd]");  
 }  }
   
 sub parstring {  sub parstring {
Line 1043  sub parstring { Line 1073  sub parstring {
       my $val=$token->[2]->{$_};        my $val=$token->[2]->{$_};
       $val =~ s/([\%\@\\\"\'])/\\$1/g;        $val =~ s/([\%\@\\\"\'])/\\$1/g;
       #if ($val =~ m/^[\%\@]/) { $val="\\".$val; }        #if ($val =~ m/^[\%\@]/) { $val="\\".$val; }
       $temp .= "my \$$_=\"$val\";"        $temp .= "my \$$_=\"$val\";";
     }      }
   }    }
   return $temp;    return $temp;
Line 1108  sub storefile { Line 1138  sub storefile {
     if (my $fh=Apache::File->new('>'.$file)) {      if (my $fh=Apache::File->new('>'.$file)) {
  print $fh $contents;   print $fh $contents;
         $fh->close();          $fh->close();
           return 1;
     } else {      } else {
       &warning("Unable to save file $file");   &warning("Unable to save file $file");
    return 0;
     }      }
 }  }
   
Line 1136  sub inserteditinfo { Line 1168  sub inserteditinfo {
       my ($result,$filecontents)=@_;        my ($result,$filecontents)=@_;
       $filecontents = &HTML::Entities::encode($filecontents);        $filecontents = &HTML::Entities::encode($filecontents);
 #      my $editheader='<a href="#editsection">Edit below</a><hr />';  #      my $editheader='<a href="#editsection">Edit below</a><hr />';
       my $xml_help = '<table><tr><td>'.        my $xml_help = Apache::loncommon::helpLatexCheatsheet();
   &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 $titledisplay=&display_title();
       my $buttons=(<<BUTTONS);        my $buttons=(<<BUTTONS);
 <input type="submit" name="attemptclean"   <input type="submit" name="attemptclean" 
Line 1200  sub handler { Line 1226  sub handler {
           
     my $target=&get_target();      my $target=&get_target();
           
     $Apache::lonxml::debug=0;      $Apache::lonxml::debug=$ENV{'user.debug'};
           
     if ($ENV{'browser.mathml'}) {      if ($ENV{'browser.mathml'}) {
  $request->content_type('text/xml');   $request->content_type('text/xml');
Line 1219  sub handler { Line 1245  sub handler {
 #  #
     unless ($ENV{'request.state'} eq 'published') {      unless ($ENV{'request.state'} eq 'published') {
  if (($ENV{'form.savethisfile'}) || ($ENV{'form.attemptclean'})) {   if (($ENV{'form.savethisfile'}) || ($ENV{'form.attemptclean'})) {
     &storefile($file,$ENV{'form.filecont'});      if (&storefile($file,$ENV{'form.filecont'})) {
    $request->print("<font COLOR=\"#0000FF\">Updated: ". strftime("%d %b %H:%M:%S",localtime())." </font>");
       } 
  }   }
     }      }
     my %mystyle;      my %mystyle;
Line 1246  ENDNOTFOUND Line 1274  ENDNOTFOUND
     if ($ENV{'form.attemptclean'}) {      if ($ENV{'form.attemptclean'}) {
  $filecontents=&htmlclean($filecontents,1);   $filecontents=&htmlclean($filecontents,1);
     }      }
   #
   # we are in construction space, see if edit mode forced
               &Apache::loncommon::get_unprocessed_cgi
                             ($ENV{'QUERY_STRING'},['editmode']);
  }   }
  if (!$ENV{'form.editmode'} || $ENV{'form.viewmode'}) {   if (!$ENV{'form.editmode'} || $ENV{'form.viewmode'}) {
     $result = &Apache::lonxml::xmlparse($request,$target,$filecontents,      $result = &Apache::lonxml::xmlparse($request,$target,$filecontents,
Line 1322  sub error { Line 1354  sub error {
   
 sub warning {  sub warning {
   $warningcount++;    $warningcount++;
   if ($ENV{'request.state'} eq 'construct') {    
     print "<b>W</b>ARNING<b>:</b>".join('<br />',@_)."<br />\n";    if ($ENV{'form.grade_target'} ne 'tex') {
         if ($ENV{'request.state'} eq 'construct' || $Apache::lonxml::debug) {
           print "<b>W</b>ARNING<b>:</b>".join('<br />',@_)."<br />\n";
         }
   }    }
 }  }
   
Line 1385  sub register_insert { Line 1420  sub register_insert {
     my $line = $data[$i];      my $line = $data[$i];
     if ( $line =~ /^\#/ || $line =~ /^\s*\n/) { next; }      if ( $line =~ /^\#/ || $line =~ /^\s*\n/) { next; }
     if ( $line =~ /TABLE/ ) { last; }      if ( $line =~ /TABLE/ ) { last; }
     my ($tag,$descrip,$color,$function,$show) = split(/,/, $line);      my ($tag,$descrip,$color,$function,$show,$helpfile,$helpdesc) = split(/,/, $line);
     if ($tag) {      if ($tag) {
       $insertlist{"$tagnum.tag"} = $tag;        $insertlist{"$tagnum.tag"} = $tag;
       $insertlist{"$tagnum.description"} = $descrip;        $insertlist{"$tagnum.description"} = $descrip;
Line 1393  sub register_insert { Line 1428  sub register_insert {
       $insertlist{"$tagnum.function"} = $function;        $insertlist{"$tagnum.function"} = $function;
       if (!defined($show)) { $show='yes'; }        if (!defined($show)) { $show='yes'; }
       $insertlist{"$tagnum.show"}= $show;        $insertlist{"$tagnum.show"}= $show;
         $insertlist{"$tagnum.helpfile"} = $helpfile;
         $insertlist{"$tagnum.helpdesc"} = $helpdesc;
       $insertlist{"$tag.num"}=$tagnum;        $insertlist{"$tag.num"}=$tagnum;
       $tagnum++;        $tagnum++;
     }      }
Line 1427  sub description { Line 1464  sub description {
   return $insertlist{$tagnum.'.description'};    return $insertlist{$tagnum.'.description'};
 }  }
   
   # Returns a list containing the help file, and the description
   sub helpinfo {
     my ($token)=@_;
     my $tagnum;
     my $tag=$token->[1];
     foreach my $namespace (reverse @Apache::lonxml::namespace) {
       my $testtag=$namespace.'::'.$tag;
       $tagnum=$insertlist{"$testtag.num"};
       if (defined($tagnum)) { last; }
     }
     if (!defined ($tagnum)) { $tagnum=$Apache::lonxml::insertlist{"$tag.num"}; }
     return ($insertlist{$tagnum.'.helpfile'}, $insertlist{$tagnum.'.helpdesc'});
   }
   
 # ----------------------------------------------------------------- whichuser  # ----------------------------------------------------------------- whichuser
 # returns a list of $symb, $courseid, $domain, $name that is correct for  # returns a list of $symb, $courseid, $domain, $name that is correct for
 # calls to lonnet functions for this setup.  # calls to lonnet functions for this setup.
 # - looks for form.grade_ parameters  # - looks for form.grade_ parameters
 sub whichuser {  sub whichuser {
     my ($passedsymb)=@_;
   my ($symb,$courseid,$domain,$name,$publicuser);    my ($symb,$courseid,$domain,$name,$publicuser);
   if (defined($ENV{'form.grade_symb'})) {    if (defined($ENV{'form.grade_symb'})) {
     my $tmp_courseid=$ENV{'form.grade_courseid'};      my $tmp_courseid=$ENV{'form.grade_courseid'};
     my $allowed=&Apache::lonnet::allowed('mgr',$tmp_courseid);      my $allowed=&Apache::lonnet::allowed('vgr',$tmp_courseid);
     if ($allowed) {      if ($allowed) {
       $symb=$ENV{'form.grade_symb'};        $symb=$ENV{'form.grade_symb'};
       $courseid=$ENV{'form.grade_courseid'};        $courseid=$ENV{'form.grade_courseid'};
Line 1443  sub whichuser { Line 1495  sub whichuser {
       $name=$ENV{'form.grade_username'};        $name=$ENV{'form.grade_username'};
     }      }
   } else {    } else {
       $symb=&Apache::lonnet::symbread();        if (!$passedsymb) {
             $symb=&Apache::lonnet::symbread();
         } else {
             $symb=$passedsymb;
         }
       $courseid=$ENV{'request.course.id'};        $courseid=$ENV{'request.course.id'};
       $domain=$ENV{'user.domain'};        $domain=$ENV{'user.domain'};
       $name=$ENV{'user.name'};        $name=$ENV{'user.name'};

Removed from v.1.255  
changed lines
  Added in v.1.272


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