--- loncom/xml/lonxml.pm 2004/02/19 19:29:40 1.302
+++ loncom/xml/lonxml.pm 2004/03/09 20:37:58 1.309
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# XML Parser Module
#
-# $Id: lonxml.pm,v 1.302 2004/02/19 19:29:40 sakharuk Exp $
+# $Id: lonxml.pm,v 1.309 2004/03/09 20:37:58 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -409,7 +409,7 @@ sub latex_special_symbols {
$string=~s/\~/\\char126 /g;
#fixup & if it doesn't look like
# { or α
- $string=~s/(&(?!((\#[0-9]+)|([a-z]+));))/\\$1/gi;
+ $string=~s/(&(?!((\#[0-9]+)|([a-z][a-z0-9]*));))/\\$1/gi;
$string=~s/([^&\\])\#/$1\\#/g;
$string=~s/\#\#/\#\\#/g;
$string=~s/(\$|_|{|})/\\$1/g;
@@ -750,6 +750,7 @@ sub init_safespace {
$safehole->wrap(\&Math::Random::random_set_seed_from_phrase,$safeeval,'&random_set_seed_from_phrase');
$safehole->wrap(\&Math::Random::random_get_seed,$safeeval,'&random_get_seed');
$safehole->wrap(\&Math::Random::random_set_seed,$safeeval,'&random_set_seed');
+ $safehole->wrap(\&Apache::lonxml::error,$safeeval,'&LONCAPA_INTERNAL_ERROR');
#need to inspect this class of ops
# $safeeval->deny(":base_orig");
@@ -760,6 +761,28 @@ sub init_safespace {
$safeinit .= ';$external::randomseed='.$rndseed.';';
&Apache::lonxml::debug("Setting rndseed to $rndseed");
&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 {
@@ -1135,8 +1158,8 @@ sub inserteditinfo {
'ed' => 'Edit');
my $buttons=(<
-
+
+
BUTTONS
my $editfooter=(<
@@ -1214,8 +1237,10 @@ sub handler {
unless ($ENV{'request.state'} eq 'published') {
if (($ENV{'form.savethisfile'}) || ($ENV{'form.attemptclean'})) {
if (&storefile($file,$ENV{'form.filecont'})) {
- $request->print("".&mt('Updated').": ".
-&Apache::lonlocal::locallocaltime(time)." ");
+ &Apache::lonxml::info("".
+ &mt('Updated').": ".
+ &Apache::lonlocal::locallocaltime(time).
+ " ");
}
}
}
@@ -1267,7 +1292,9 @@ ENDNOTFOUND
if ($ENV{'form.editmode'} && (!($ENV{'form.viewmode'}))) {
my $displayfile=$request->uri;
$displayfile=~s/^\/[^\/]*//;
- $result='
'.$displayfile.
+ $result=''.
+ &Apache::lonxml::message_location().''.
+ $displayfile.
'
';
$result=&inserteditinfo($result,$filecontents,$filetype);
}
@@ -1275,7 +1302,7 @@ ENDNOTFOUND
if ($filetype eq 'html') { writeallows($request->uri); }
-
+ &Apache::lonxml::add_messages(\$result);
$request->print($result);
return OK;
@@ -1309,11 +1336,13 @@ sub error {
if (!$request) { $request=Apache->request; }
if (($Apache::lonxml::debug eq 1) || ($ENV{'request.state'} eq 'construct') ) {
# If printing in construction space, put the error inside
- $request->print($Apache::lonxml::warnings_error_header.
- "ERROR:".join("\n",@_)."\n");
+ push(@Apache::lonxml::error_messages,
+ $Apache::lonxml::warnings_error_header.
+ "ERROR:".join("
\n",@_)."
\n");
$Apache::lonxml::warnings_error_header='';
} else {
- $request->print("An Error occured while processing this resource. The instructor has been notified.
");
+ push(@Apache::lonxml::error_messages,
+ "An Error occured while processing this resource. The instructor has been notified.
");
#notify author
&Apache::lonmsg::author_res_msg($ENV{'request.filename'},join('
',@_));
#notify course
@@ -1326,10 +1355,6 @@ sub error {
"Error [$declutter]",join('
',@_));
}
}
-
- #FIXME probably shouldn't have me get everything forever.
- &Apache::lonmsg::user_normal_msg('albertel','msu',"Error in $ENV{'request.filename'}",join('
',@_));
- #&Apache::lonmsg::user_normal_msg('albertel','103',"Error in $ENV{'request.filename'}",$_[0]);
}
}
@@ -1340,13 +1365,38 @@ sub warning {
if ($ENV{'request.state'} eq 'construct' || $Apache::lonxml::debug) {
my $request=$Apache::lonxml::request;
if (!$request) { $request=Apache->request; }
- $request->print($Apache::lonxml::warnings_error_header.
- "WARNING:".join('
',@_)."
\n");
+ push(@Apache::lonxml::warning_messages,
+ $Apache::lonxml::warnings_error_header.
+ "WARNING:".join('
',@_)."
\n");
$Apache::lonxml::warnings_error_header='';
}
}
}
+sub info {
+ if ($ENV{'form.grade_target'} ne 'tex'
+ && $ENV{'request.state'} eq 'construct') {
+ push(@Apache::lonxml::info_messages,join('
',@_)."
\n");
+ }
+}
+
+sub message_location {
+ return '__LONCAPA_INTERNAL_MESSAGE_LOCATION__';
+}
+
+sub add_messages {
+ my ($msg)=@_;
+ my $result=join(' ',
+ @Apache::lonxml::info_messages,
+ @Apache::lonxml::error_messages,
+ @Apache::lonxml::warning_messages);
+ undef(@Apache::lonxml::info_messages);
+ undef(@Apache::lonxml::error_messages);
+ undef(@Apache::lonxml::warning_messages);
+ $$msg=~s/__LONCAPA_INTERNAL_MESSAGE_LOCATION__/$result/;
+ $$msg=~s/__LONCAPA_INTERNAL_MESSAGE_LOCATION__//g;
+}
+
sub get_param {
my ($param,$parstack,$safeeval,$context,$case_insensitive) = @_;
if ( ! $context ) { $context = -1; }