--- loncom/xml/lonxml.pm 2004/02/19 19:29:40 1.302
+++ loncom/xml/lonxml.pm 2004/03/19 22:06:53 1.312
@@ -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.312 2004/03/19 22:06:53 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -401,23 +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/\^/\\\^\\strut /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/\#\#/\#\\#/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;
}
@@ -750,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");
@@ -760,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 {
@@ -1135,8 +1161,8 @@ sub inserteditinfo {
'ed' => 'Edit');
my $buttons=(<