--- loncom/xml/lonxml.pm 2004/01/30 17:27:34 1.299
+++ loncom/xml/lonxml.pm 2004/03/02 21:31:22 1.305
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# XML Parser Module
#
-# $Id: lonxml.pm,v 1.299 2004/01/30 17:27:34 sakharuk Exp $
+# $Id: lonxml.pm,v 1.305 2004/03/02 21:31:22 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -410,7 +410,8 @@ sub latex_special_symbols {
#fixup & if it doesn't look like
# { or α
$string=~s/(&(?!((\#[0-9]+)|([a-z]+));))/\\$1/gi;
- $string=~s/([^&])\#/$1\\#/g;
+ $string=~s/([^&\\])\#/$1\\#/g;
+ $string=~s/\#\#/\#\\#/g;
$string=~s/(\$|_|{|})/\\$1/g;
$string=~s/\\char92 /\\texttt{\\char92}/g;
$string=~s/(>|<)/\$$1\$/g; #more or less
@@ -749,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");
@@ -759,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;
+ my $__LC__msg;
+ while(1){
+ {
+ #use strict;
+ if (eval(defined(eval($__LC__a.$__LC__b)))) {
+ return $__LC__msg.$__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.$__LC__msg;
+}
+EVALUATESUB
+ $safeeval->permit("require");
+ $safeeval->reval($subroutine);
+ $safeeval->deny("require");
}
sub default_homework_load {
@@ -1134,8 +1158,8 @@ sub inserteditinfo {
'ed' => 'Edit');
my $buttons=(<DEBUG:'.&HTML::Entities::encode($_[0])."
\n");
}
}
sub error {
$errorcount++;
+ my $request=$Apache::lonxml::request;
+ 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