--- loncom/xml/lonxml.pm 2004/02/26 23:39:03 1.303 +++ loncom/xml/lonxml.pm 2004/03/30 07:16:24 1.314 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # XML Parser Module # -# $Id: lonxml.pm,v 1.303 2004/02/26 23:39:03 albertel Exp $ +# $Id: lonxml.pm,v 1.314 2004/03/30 07:16:24 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"); @@ -765,18 +769,18 @@ sub init_safespace { sub __LC_INTERNAL_EVALUATE__ { my ($__LC__a,$__LC__b,$__LC__c)=@_; my $__LC__prefix; - my $__LC__msg; while(1){ { use strict; + no strict "vars"; if (eval(defined(eval($__LC__a.$__LC__b)))) { - return $__LC__msg.$__LC__prefix.eval($__LC__a.$__LC__b.$__LC__c); + 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.$__LC__msg; + return $__LC__prefix.$__LC__a.$__LC__b.$__LC__c; } EVALUATESUB $safeeval->permit("require"); @@ -963,7 +967,7 @@ sub get_all_text { #never found the end tag ran out of text, throw error send back blank &error('Never found end tag for <'.$tag. '> current string
'. - &HTML::Entities::encode($result). + &HTML::Entities::encode($result,'<>&"'). ''); if ($gotfullstack) { my $newstring=''.$tag.'>'.$result; @@ -1140,7 +1144,7 @@ SIMPLECONTENT sub inserteditinfo { my ($result,$filecontents,$filetype)=@_; - $filecontents = &HTML::Entities::encode($filecontents); + $filecontents = &HTML::Entities::encode($filecontents,'<>&"'); # my $editheader='Edit below
DEBUG:'.&HTML::Entities::encode($_[0])."\n"); + $request->print('
DEBUG:'.&HTML::Entities::encode($_[0],'<>&"')."\n"); } } @@ -1331,11 +1339,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("