--- loncom/xml/lonxml.pm 2004/01/28 16:10:26 1.298
+++ loncom/xml/lonxml.pm 2004/03/23 00:47:48 1.313
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# XML Parser Module
#
-# $Id: lonxml.pm,v 1.298 2004/01/28 16:10:26 albertel Exp $
+# $Id: lonxml.pm,v 1.313 2004/03/23 00:47:48 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -401,22 +401,25 @@ sub latex_special_symbols {
my ($string,$where)=@_;
if ($where eq 'header') {
$string =~ s/(\\|_|\^)/ /g;
- $string =~ s/(\$|%|\#|&|\{|\})/\\$1/g;
+ $string =~ s/(\$|%|\{|\})/\\$1/g;
$string =~ s/_/ /g;
+ $string=&Apache::lonprintout::character_chart($string);
+ # any & or # leftover should be safe to just escape
+ $string=~s/([^\\])\&/$1\\\&/g;
+ $string=~s/([^\\])\#/$1\\\#/g;
} else {
- $string=~s/\\ /\\char92 /g;
- $string=~s/\^/\\\^ /g;
- $string=~s/\~/\\char126 /g;
- #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/\\char92 /\\texttt{\\char92}/g;
- $string=~s/(>|<)/\$$1\$/g; #more or less
- if ($string=~m/\d%/) {$string =~ s/(\d)%/$1\\%/g;} #percent after digit
- if ($string=~m/\s%/) {$string =~ s/(\s)%/$1\\%/g;} #percent after space
- if ($string eq '%.') {$string = '\%.';} #percent at the end of statement
+ $string=~s/\\/\\ensuremath{\\backslash}/g;
+ $string=~s/([^\\]|^)\%/$1\\\%/g;
+ $string=~s/([^\\]|^)(\$|_)/$1\\$2/g;
+ $string=~s/\$\$/\$\\\$/g;
+ $string=~s/\#\#/\#\\\#/g;
+ $string=~s/([^\\]|^)(\~|\^)/$1\\$2\\strut /g;
+ $string=~s/(>|<)/\\ensuremath\{$1\}/g; #more or less
+ $string=&Apache::lonprintout::character_chart($string);
+ # any & or # leftover should be safe to just escape
+ $string=~s/([^\\]|^)\&/$1\\\&/g;
+ $string=~s/([^\\]|^)\#/$1\\\#/g;
+#single { or } How to escape?
}
return $string;
}
@@ -749,6 +752,8 @@ 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');
+ $safehole->wrap(\&Apache::lonxml::debug,$safeeval,'&LONCAPA_INTERNAL_DEBUG');
#need to inspect this class of ops
# $safeeval->deny(":base_orig");
@@ -759,6 +764,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 {
@@ -1134,8 +1161,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 - print $Apache::lonxml::warnings_error_header. - "ERROR:".join("\n",@_)."\n"; + push(@Apache::lonxml::error_messages, + $Apache::lonxml::warnings_error_header. + "ERROR:".join("