Diff for /loncom/xml/lonxml.pm between versions 1.317 and 1.339

version 1.317, 2004/04/15 20:18:46 version 1.339, 2004/10/05 18:51:50
Line 40 Line 40
   
 package Apache::lonxml;   package Apache::lonxml; 
 use vars   use vars 
 qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace $errorcount $warningcount);  qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace $errorcount $warningcount @htmlareafields);
 use strict;  use strict;
 use HTML::LCParser();  use HTML::LCParser();
 use HTML::TreeBuilder();  use HTML::TreeBuilder();
Line 51  use Math::Cephes(); Line 51  use Math::Cephes();
 use Math::Random();  use Math::Random();
 use Opcode();  use Opcode();
 use POSIX qw(strftime);  use POSIX qw(strftime);
   use Time::HiRes qw( gettimeofday tv_interval );
   
 sub register {  sub register {
   my ($space,@taglist) = @_;    my ($space,@taglist) = @_;
Line 150  $Apache::lonxml::warnings_error_header=' Line 150  $Apache::lonxml::warnings_error_header='
   
 sub xmlbegin {  sub xmlbegin {
   my $output='';    my $output='';
     @htmlareafields=();
   if ($ENV{'browser.mathml'}) {    if ($ENV{'browser.mathml'}) {
       $output='<?xml version="1.0"?>'        $output='<?xml version="1.0"?>'
             .'<?xml-stylesheet type="text/css" href="/adm/MathML/mathml.css"?>'              .'<?xml-stylesheet type="text/css" href="/adm/MathML/mathml.css"?>'
Line 164  sub xmlbegin { Line 165  sub xmlbegin {
 }  }
   
 sub xmlend {  sub xmlend {
       my ($target,$parser)=@_;
     my $mode='xml';      my $mode='xml';
     my $status='OPEN';      my $status='OPEN';
     if ($Apache::lonhomework::parsing_a_problem) {      if ($Apache::lonhomework::parsing_a_problem) {
  $mode='problem';   $mode='problem';
  $status=$Apache::inputtags::status[-1];    $status=$Apache::inputtags::status[-1]; 
     }      }
     return &Apache::lonfeedback::list_discussion($mode,$status).'</html>';      my $discussion=&Apache::lonfeedback::list_discussion($mode,$status);    
       if ($target eq 'tex') {
    $discussion.='<tex>\keephidden{ENDOFPROBLEM}\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\end{document}</tex>';
    &Apache::lonxml::newparser($parser,\$discussion,'');
    return '';
       } else {
    return $discussion.'</html>';
       }
 }  }
   
 sub tokeninputfield {  sub tokeninputfield {
Line 311  sub xmlparse { Line 320  sub xmlparse {
      my $bodytext=       my $bodytext=
  $ENV{'course.'.$ENV{'request.course.id'}.'.default_xml_style'};   $ENV{'course.'.$ENV{'request.course.id'}.'.default_xml_style'};
      if ($bodytext) {       if ($bodytext) {
        my $location=&Apache::lonnet::filelocation('',$bodytext);   foreach my $file (split(',',$bodytext)) {
        my $styletext=&Apache::lonnet::getfile($location);       my $location=&Apache::lonnet::filelocation('',$file);
        if ($styletext ne '-1') {       my $styletext=&Apache::lonnet::getfile($location);
           %style_for_target = (%style_for_target,       if ($styletext ne '-1') {
                           &Apache::style::styleparser($target,$styletext));   %style_for_target = (%style_for_target,
        }        &Apache::style::styleparser($target,$styletext));
     }       }
    }
        }
  } elsif ($ENV{'construct.style'} && ($ENV{'request.state'} eq 'construct')) {   } elsif ($ENV{'construct.style'} && ($ENV{'request.state'} eq 'construct')) {
      my $location=&Apache::lonnet::filelocation('',$ENV{'construct.style'});       my $location=&Apache::lonnet::filelocation('',$ENV{'construct.style'});
      my $styletext=&Apache::lonnet::getfile($location);       my $styletext=&Apache::lonnet::getfile($location);
Line 388  sub latex_special_symbols { Line 399  sub latex_special_symbols {
     } else {      } else {
  $string=~s/\\/\\ensuremath{\\backslash}/g;   $string=~s/\\/\\ensuremath{\\backslash}/g;
  $string=~s/([^\\]|^)\%/$1\\\%/g;   $string=~s/([^\\]|^)\%/$1\\\%/g;
  $string=~s/([^\\]|^)(\$|_)/$1\\$2/g;   $string=~s/([^\\]|^)\$/$1\\\$/g;
    $string=~s/([^\\])\_/$1\\_/g;
  $string=~s/\$\$/\$\\\$/g;   $string=~s/\$\$/\$\\\$/g;
    $string=~s/\_\_/\_\\\_/g;
  $string=~s/\#\#/\#\\\#/g;   $string=~s/\#\#/\#\\\#/g;
         $string=~s/([^\\]|^)(\~|\^)/$1\\$2\\strut /g;          $string=~s/([^\\]|^)(\~|\^)/$1\\$2\\strut /g;
  $string=~s/(>|<)/\\ensuremath\{$1\}/g; #more or less   $string=~s/(>|<)/\\ensuremath\{$1\}/g; #more or less
Line 397  sub latex_special_symbols { Line 410  sub latex_special_symbols {
  # any & or # leftover should be safe to just escape   # any & or # leftover should be safe to just escape
         $string=~s/([^\\]|^)\&/$1\\\&/g;          $string=~s/([^\\]|^)\&/$1\\\&/g;
         $string=~s/([^\\]|^)\#/$1\\\#/g;          $string=~s/([^\\]|^)\#/$1\\\#/g;
           $string=~s/\|/\$\\mid\$/g;
 #single { or } How to escape?  #single { or } How to escape?
     }      }
     return $string;      return $string;
Line 524  sub inner_xmlparse { Line 538  sub inner_xmlparse {
   return $finaloutput;    return $finaloutput;
 }  }
   
   ## 
   ## Looks to see if there is a subroutine defined for this tag.  If so, call it,
   ## otherwise do not call it as we do not know what it is.
   ##
 sub callsub {  sub callsub {
   my ($sub,$target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;    my ($sub,$target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   my $currentstring='';    my $currentstring='';
Line 556  sub callsub { Line 574  sub callsub {
      $parstack,$parser,$safeeval,       $parstack,$parser,$safeeval,
      $style);       $style);
       } else {        } else {
             if ($target eq 'tex') {
                 # throw away tag name
                 return '';
             }
  #&Apache::lonxml::debug("NOT Calling sub $sub in $space $metamode");   #&Apache::lonxml::debug("NOT Calling sub $sub in $space $metamode");
  if ($metamode <1) {   if ($metamode <1) {
   if (defined($token->[4]) && ($metamode < 1)) {    if (defined($token->[4]) && ($metamode < 1)) {
Line 596  sub setup_globals { Line 618  sub setup_globals {
   my ($request,$target)=@_;    my ($request,$target)=@_;
   $Apache::lonxml::request=$request;    $Apache::lonxml::request=$request;
   $Apache::lonxml::registered = 0;    $Apache::lonxml::registered = 0;
     @Apache::lonxml::htmlareafields=();
   $errorcount=0;    $errorcount=0;
   $warningcount=0;    $warningcount=0;
   $Apache::lonxml::default_homework_loaded=0;    $Apache::lonxml::default_homework_loaded=0;
Line 654  sub init_safespace { Line 677  sub init_safespace {
   $safehole->wrap(\&Apache::scripttag::xmlparse,$safeeval,'&xmlparse');    $safehole->wrap(\&Apache::scripttag::xmlparse,$safeeval,'&xmlparse');
   $safehole->wrap(\&Apache::outputtags::multipart,$safeeval,'&multipart');    $safehole->wrap(\&Apache::outputtags::multipart,$safeeval,'&multipart');
   $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT');    $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT');
       $safehole->wrap(\&Apache::chemresponse::chem_standard_order,$safeeval,
     '&chem_standard_order');
   
   $safehole->wrap(\&Math::Cephes::asin,$safeeval,'&asin');    $safehole->wrap(\&Math::Cephes::asin,$safeeval,'&asin');
   $safehole->wrap(\&Math::Cephes::acos,$safeeval,'&acos');    $safehole->wrap(\&Math::Cephes::acos,$safeeval,'&acos');
   $safehole->wrap(\&Math::Cephes::atan,$safeeval,'&atan');    $safehole->wrap(\&Math::Cephes::atan,$safeeval,'&atan');
Line 728  sub init_safespace { Line 753  sub init_safespace {
   $safehole->wrap(\&Math::Random::random_set_seed,$safeeval,'&random_set_seed');    $safehole->wrap(\&Math::Random::random_set_seed,$safeeval,'&random_set_seed');
   $safehole->wrap(\&Apache::lonxml::error,$safeeval,'&LONCAPA_INTERNAL_ERROR');    $safehole->wrap(\&Apache::lonxml::error,$safeeval,'&LONCAPA_INTERNAL_ERROR');
   $safehole->wrap(\&Apache::lonxml::debug,$safeeval,'&LONCAPA_INTERNAL_DEBUG');    $safehole->wrap(\&Apache::lonxml::debug,$safeeval,'&LONCAPA_INTERNAL_DEBUG');
     $safehole->wrap(\&Apache::caparesponse::get_sigrange,$safeeval,'&LONCAPA_INTERNAL_get_sigrange');
   
 #need to inspect this class of ops  #need to inspect this class of ops
 # $safeeval->deny(":base_orig");  # $safeeval->deny(":base_orig");
     $safeeval->permit("require");
   $safeinit .= ';$external::target="'.$target.'";';    $safeinit .= ';$external::target="'.$target.'";';
   my $rndseed;    my $rndseed;
   my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();    my ($symb,$courseid,$domain,$name) = &Apache::lonxml::whichuser();
   $rndseed=&Apache::lonnet::rndseed($symb,$courseid,$domain,$name);    $rndseed=&Apache::lonnet::rndseed($symb,$courseid,$domain,$name);
   $safeinit .= ';$external::randomseed='.$rndseed.';';    $safeinit .= ';$external::randomseed="'.$rndseed.'";';
   &Apache::lonxml::debug("Setting rndseed to $rndseed");    &Apache::lonxml::debug("Setting rndseed to $rndseed");
   &Apache::run::run($safeinit,$safeeval);    &Apache::run::run($safeinit,$safeeval);
   
   my $subroutine=<<'EVALUATESUB';  
 sub __LC_INTERNAL_EVALUATE__ {  
     my ($__LC__a,$__LC__b,$__LC__c)=@_;  
     my $__LC__prefix;  
     while(1){  
  {   
     use strict;  
     no strict "vars";  
     if (eval(defined(eval($__LC__a.$__LC__b)))) {  
  return $__LC__prefix.eval($__LC__a.$__LC__b.$__LC__c);  
     }  
  }  
  $__LC__prefix.=substr($__LC__a,0,1,"");  
  if ($__LC__a!~/^(\$|&|\#)/) { last; }  
     }  
     return $__LC__prefix.$__LC__a.$__LC__b.$__LC__c;  
 }  
 EVALUATESUB  
     $safeeval->permit("require");  
     $safeeval->reval($subroutine);  
     $safeeval->deny("require");  
 }  }
   
 sub default_homework_load {  sub default_homework_load {
Line 774  sub default_homework_load { Line 780  sub default_homework_load {
     }      }
 }  }
   
   my $metamode_was;
 sub startredirection {  sub startredirection {
   $Apache::lonxml::redirection++;      if (!$Apache::lonxml::redirection) {
   push (@Apache::lonxml::outputstack, '');   $metamode_was=$Apache::lonxml::metamode;
       }
       $Apache::lonxml::metamode=0;
       $Apache::lonxml::redirection++;
       push (@Apache::lonxml::outputstack, '');
 }  }
   
 sub endredirection {  sub endredirection {
   if (!$Apache::lonxml::redirection) {      if (!$Apache::lonxml::redirection) {
     &Apache::lonxml::error("Endredirection was called, before a startredirection, perhaps you have unbalanced tags. Some debuging information:".join ":",caller);   &Apache::lonxml::error("Endredirection was called, before a startredirection, perhaps you have unbalanced tags. Some debuging information:".join ":",caller);
     return '';   return '';
   }      }
   $Apache::lonxml::redirection--;      $Apache::lonxml::redirection--;
   pop @Apache::lonxml::outputstack;      if (!$Apache::lonxml::redirection) {
    $Apache::lonxml::metamode=$metamode_was;
       }
       pop @Apache::lonxml::outputstack;
 }  }
   
 sub end_tag {  sub end_tag {
Line 801  sub initdepth { Line 815  sub initdepth {
   $Apache::lonxml::olddepth=-1;    $Apache::lonxml::olddepth=-1;
 }  }
   
   my @timers;
   my $lasttime;
 sub increasedepth {  sub increasedepth {
   my ($token) = @_;    my ($token) = @_;
   $Apache::lonxml::depth++;    $Apache::lonxml::depth++;
Line 808  sub increasedepth { Line 824  sub increasedepth {
   if ($Apache::lonxml::depthcounter[$Apache::lonxml::depth]==1) {    if ($Apache::lonxml::depthcounter[$Apache::lonxml::depth]==1) {
     $Apache::lonxml::olddepth=$Apache::lonxml::depth;      $Apache::lonxml::olddepth=$Apache::lonxml::depth;
   }    }
     push(@timers,[&gettimeofday()]);
     my $time=&tv_interval($lasttime);
     $lasttime=[&gettimeofday()];
     my $spacing='  'x($Apache::lonxml::depth-1);
   my $curdepth=join('_',@Apache::lonxml::depthcounter);    my $curdepth=join('_',@Apache::lonxml::depthcounter);
   &Apache::lonxml::debug("s $Apache::lonxml::depth : $Apache::lonxml::olddepth : $curdepth : $token->[1]\n");    &Apache::lonxml::debug("s$spacing$Apache::lonxml::depth : $Apache::lonxml::olddepth : $curdepth : $token->[1] : $time : \n");
 #print "<br />s $Apache::lonxml::depth : $Apache::lonxml::olddepth : $curdepth : $token->[1]\n";  #print "<br />s $Apache::lonxml::depth : $Apache::lonxml::olddepth : $curdepth : $token->[1]\n";
 }  }
   
Line 824  sub decreasedepth { Line 844  sub decreasedepth {
     &Apache::lonxml::warning(&mt("Missing tags, unable to properly run file."));      &Apache::lonxml::warning(&mt("Missing tags, unable to properly run file."));
     $Apache::lonxml::depth='-1';      $Apache::lonxml::depth='-1';
   }    }
     my $timer=pop(@timers);
     my $time=&tv_interval($lasttime);
     $lasttime=[&gettimeofday()];
     my $spacing='  'x$Apache::lonxml::depth;
   my $curdepth=join('_',@Apache::lonxml::depthcounter);    my $curdepth=join('_',@Apache::lonxml::depthcounter);
   &Apache::lonxml::debug("e $Apache::lonxml::depth : $Apache::lonxml::olddepth : $token->[1] : $curdepth\n");    &Apache::lonxml::debug("e$spacing$Apache::lonxml::depth : $Apache::lonxml::olddepth : $curdepth : $token->[1] : $time : ".&tv_interval($timer)."\n");
 #print "<br />e $Apache::lonxml::depth : $Apache::lonxml::olddepth : $token->[1] : $curdepth\n";  #print "<br />e $Apache::lonxml::depth : $Apache::lonxml::olddepth : $token->[1] : $curdepth\n";
 }  }
   
 sub get_all_text_unbalanced {  sub get_all_text_unbalanced {
 #there is a copy of this in lonpublisher.pm  #there is a copy of this in lonpublisher.pm
  my($tag,$pars)= @_;      my($tag,$pars)= @_;
  my $token;      my $token;
  my $result='';      my $result='';
  $tag='<'.$tag.'>';      $tag='<'.$tag.'>';
  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')||($token->[0] eq 'D')) {
      $result.=$token->[1];      $result.=$token->[1];
    } elsif ($token->[0] eq 'PI') {   } elsif ($token->[0] eq 'PI') {
      $result.=$token->[2];      $result.=$token->[2];
    } elsif ($token->[0] eq 'S') {   } elsif ($token->[0] eq 'S') {
      $result.=$token->[4];      $result.=$token->[4];
    } elsif ($token->[0] eq 'E')  {   } elsif ($token->[0] eq 'E')  {
      $result.=$token->[2];      $result.=$token->[2];
    }   }
    if ($result =~ /(.*)\Q$tag\E(.*)/is) {   if ($result =~ /\Q$tag\E/is) {
      &Apache::lonxml::debug('Got a winner with leftovers ::'.$2);      ($result,my $redo)=$result =~ /(.*)\Q$tag\E(.*)/is;
      &Apache::lonxml::debug('Result is :'.$1);      #&Apache::lonxml::debug('Got a winner with leftovers ::'.$2);
      $result=$1;      #&Apache::lonxml::debug('Result is :'.$1);
      my $redo=$tag.$2;      $redo=$tag.$redo;
      &Apache::lonxml::newparser($pars,\$redo);      &Apache::lonxml::newparser($pars,\$redo);
      last;      last;
    }   }
  }      }
  return $result      return $result
 }  }
   
 sub increment_counter {  sub increment_counter {
Line 1086  sub storefile { Line 1110  sub storefile {
 }  }
   
 sub createnewhtml {  sub createnewhtml {
   my $filecontents=(<<SIMPLECONTENT);      my $title=&mt('Title of document goes here');
       my $body=&mt('Body of document goes here');
       my $filecontents=(<<SIMPLECONTENT);
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml/11/DTD/xhtml11.dtd">
 <html>  <html>
 <head>  <head>
 <title>  <title>$title</title>
                            Title of Document Goes Here  
 </title>  
 </head>  </head>
 <body bgcolor="#FFFFFF">  <body bgcolor="#FFFFFF">
   $body
                            Body of Document Goes Here  
   
 </body>  </body>
 </html>  </html>
 SIMPLECONTENT  SIMPLECONTENT
   return $filecontents;      return $filecontents;
 }  }
   
 sub createnewsty {  sub createnewsty {
Line 1121  sub inserteditinfo { Line 1144  sub inserteditinfo {
       $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 = '';        my $xml_help = '';
         my $initialize='';
       if ($filetype eq 'html') {        if ($filetype eq 'html') {
   $xml_help=Apache::loncommon::helpLatexCheatsheet();    my $addbuttons=&Apache::lonhtmlcommon::htmlareaaddbuttons();
     $initialize=&Apache::lonhtmlcommon::htmlareaheaders().
         &Apache::lonhtmlcommon::spellheader().(<<FULLPAGE);
   <script type="text/javascript">
   $addbuttons
   
       HTMLArea.loadPlugin("FullPage");
   
       function initDocument() {
    var editor=new HTMLArea("filecont",config);
    editor.registerPlugin(FullPage);
    editor.generate();
       }
   </script>
   FULLPAGE
             $result=~s/\<body([^\>]*)\>/\<body onload="initDocument()" $1\>/i;
     $xml_help=&Apache::loncommon::helpLatexCheatsheet();
       }        }
       my $cleanbut = '';        my $cleanbut = '';
       if ($filetype eq 'html') {        if ($filetype eq 'html') {
Line 1138  $cleanbut Line 1178  $cleanbut
 <input type="submit" name="savethisfile" accesskey="s"  value="$lt{'st'}" />  <input type="submit" name="savethisfile" accesskey="s"  value="$lt{'st'}" />
 <input type="submit" name="viewmode" accesskey="v" value="$lt{'vi'}" />  <input type="submit" name="viewmode" accesskey="v" value="$lt{'vi'}" />
 BUTTONS  BUTTONS
         $buttons.=&Apache::lonhtmlcommon::spelllink('xmledit','filecont');
         $buttons.=&Apache::lonhtmlcommon::htmlareaselectactive('filecont');
       my $editfooter=(<<ENDFOOTER);        my $editfooter=(<<ENDFOOTER);
   $initialize
 <hr />  <hr />
 <a name="editsection" />  <a name="editsection" />
 <form method="post">  <form method="post" name="xmledit">
 $xml_help  $xml_help
 <input type="hidden" name="editmode" value="$lt{'ed'}" />  <input type="hidden" name="editmode" value="$lt{'ed'}" />
 $buttons<br />  $buttons<br />
 <textarea cols="80" rows="40" name="filecont">$filecontents</textarea>  <textarea cols="80" rows="44" name="filecont" id="filecont">$filecontents</textarea>
 <br />$buttons  <br />$buttons
 <br />  <br />
 </form>  </form>
 $titledisplay  $titledisplay
   </body>
 ENDFOOTER  ENDFOOTER
 #      $result=~s/(\<body[^\>]*\>)/$1$editheader/is;  #      $result=~s/(\<body[^\>]*\>)/$1$editheader/is;
       $result=~s/(\<\/body\>)/$editfooter/is;        $result=~s/(\<\/body\>)/$editfooter/is;
Line 1304  sub debug { Line 1348  sub debug {
  my $request=$Apache::lonxml::request;   my $request=$Apache::lonxml::request;
  if (!$request) { $request=Apache->request; }   if (!$request) { $request=Apache->request; }
  $request->print('<font size="-2"><pre>DEBUG:'.&HTML::Entities::encode($_[0],'<>&"')."</pre></font>\n");   $request->print('<font size="-2"><pre>DEBUG:'.&HTML::Entities::encode($_[0],'<>&"')."</pre></font>\n");
   # &Apache::lonnet::logthis($_[0]);
     }      }
 }  }
   
 sub error {  sub error {
   $errorcount++;      $errorcount++;
   my $request=$Apache::lonxml::request;      if (($Apache::lonxml::debug eq 1) || ($ENV{'request.state'} eq 'construct') ) {
   if (!$request) { $request=Apache->request; }   # If printing in construction space, put the error inside <pre></pre>
   if (($Apache::lonxml::debug eq 1) || ($ENV{'request.state'} eq 'construct') ) {   push(@Apache::lonxml::error_messages,
     # If printing in construction space, put the error inside <pre></pre>       $Apache::lonxml::warnings_error_header.
       push(@Apache::lonxml::error_messages,       "<b>ERROR:</b>".join("<br />\n",@_)."<br />\n");
    $Apache::lonxml::warnings_error_header.   $Apache::lonxml::warnings_error_header='';
    "<b>ERROR:</b>".join("<br />\n",@_)."<br />\n");      } else {
       $Apache::lonxml::warnings_error_header='';   my $errormsg;
   } else {   my ($symb)=&Apache::lonnet::symbread();
       push(@Apache::lonxml::error_messages,   if ( !$symb ) {
    "<b>An Error occured while processing this resource. The instructor has been notified.</b> <br />");      #public or browsers
     #notify author      $errormsg=&mt("An error occured while processing this resource. The author has been notified.");
     &Apache::lonmsg::author_res_msg($ENV{'request.filename'},join('<br />',@_));   } 
     #notify course   #notify author
     if ( $ENV{'request.course.id'} ) {   &Apache::lonmsg::author_res_msg($ENV{'request.filename'},join('<br />',@_));
       my (undef,%users)=&Apache::lonfeedback::decide_receiver(undef,0,1,1,1);   #notify course
       my $declutter=&Apache::lonnet::declutter($ENV{'request.filename'});   if ( $symb && $ENV{'request.course.id'} ) {
       foreach (keys %users) {      my (undef,%users)=&Apache::lonfeedback::decide_receiver(undef,0,1,1,1);
  my ($user,$domain) = split(/:/, $_);      my $declutter=&Apache::lonnet::declutter($ENV{'request.filename'});
  &Apache::lonmsg::user_normal_msg($user,$domain,      my @userlist;
         "Error [$declutter]",join('<br />',@_));      foreach (keys %users) {
       }   my ($user,$domain) = split(/:/, $_);
    push(@userlist,"$user\@$domain");
    &Apache::lonmsg::user_normal_msg($user,$domain,
    "Error [$declutter]",join('<br />',@_));
       }
       if ($ENV{'request.role.adv'}) {
    $errormsg=&mt("An error occured while processing this resource. The course personnel ([_1]) and the author have been notified.",join(', ',@userlist));
       } else {
    $errormsg=&mt("An error occured while processing this resource. The instructor has been notified.");
       }
    }
    push(@Apache::lonxml::error_messages,"<b>$errormsg</b> <br />");
     }      }
   }  
 }  }
   
 sub warning {  sub warning {

Removed from v.1.317  
changed lines
  Added in v.1.339


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