--- loncom/xml/lonxml.pm 2004/02/26 23:39:03 1.303 +++ loncom/xml/lonxml.pm 2004/03/31 05:24:00 1.315 @@ -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.315 2004/03/31 05:24:00 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -59,7 +59,7 @@ package Apache::lonxml; use vars -qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace $prevent_entity_encode $errorcount $warningcount); +qw(@pwd @outputstack $redirection $import @extlinks $metamode $evaluate %insertlist @namespace $errorcount $warningcount); use strict; use HTML::LCParser(); use HTML::TreeBuilder(); @@ -141,9 +141,6 @@ $evaluate = 1; # stores the list of active tag namespaces @namespace=(); -# if 0 all high ASCII characters will be encoded into HTML Entities -$prevent_entity_encode=0; - # has the dynamic menu been updated to know about this resource $Apache::lonxml::registered=0; @@ -401,23 +398,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; } @@ -515,10 +514,6 @@ sub inner_xmlparse { } } - # Encode any high ASCII characters -# if (!$Apache::lonxml::prevent_entity_encode) { -# $result=&HTML::Entities::encode($result,"\200-\377"); -# } if ($Apache::lonxml::redirection) { $Apache::lonxml::outputstack['-1'] .= $result; } else { @@ -750,6 +745,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 +762,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 +960,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 +1137,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 +1332,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("