--- loncom/xml/lonxml.pm 2004/01/30 17:27:34 1.299
+++ loncom/xml/lonxml.pm 2004/02/26 23:39:03 1.303
@@ -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.303 2004/02/26 23:39:03 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
@@ -759,6 +760,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 {
@@ -1296,19 +1319,23 @@ sub display_title {
sub debug {
if ($Apache::lonxml::debug eq "1") {
$|=1;
- Apache->request->print('DEBUG:'.&HTML::Entities::encode($_[0])."\n");
+ my $request=$Apache::lonxml::request;
+ if (!$request) { $request=Apache->request; }
+ $request->print('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