--- loncom/xml/lonxml.pm 2003/06/20 14:45:48 1.265
+++ loncom/xml/lonxml.pm 2003/09/08 19:00:09 1.274
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# XML Parser Module
#
-# $Id: lonxml.pm,v 1.265 2003/06/20 14:45:48 bowersj2 Exp $
+# $Id: lonxml.pm,v 1.274 2003/09/08 19:00:09 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -69,6 +69,8 @@ use Safe::Hole();
use Math::Cephes();
use Math::Random();
use Opcode();
+use POSIX qw(strftime);
+
sub register {
my ($space,@taglist) = @_;
@@ -95,6 +97,8 @@ use Apache::run();
use Apache::londefdef();
use Apache::scripttag();
use Apache::edit();
+use Apache::inputtags();
+use Apache::outputtags();
use Apache::lonnet();
use Apache::File();
use Apache::loncommon();
@@ -474,23 +478,25 @@ sub htmlclean {
}
sub latex_special_symbols {
- my ($current_token,$stack,$parstack,$where)=@_;
+ my ($string,$where)=@_;
if ($where eq 'header') {
- $current_token =~ s/(\\|_|\^)/ /g;
- $current_token =~ s/(\$|%|\#|&|\{|\})/\\$1/g;
+ $string =~ s/(\\|_|\^)/ /g;
+ $string =~ s/(\$|%|\#|&|\{|\})/\\$1/g;
+ $string =~ s/_/ /g;
} else {
- $current_token=~s/\\ /\\char92 /g;
- $current_token=~s/\^/\\char94 /g;
- $current_token=~s/\~/\\char126 /g;
- $current_token=~s/(&[^A-Za-z\#])/\\$1/g;
- $current_token=~s/([^&])\#/$1\\#/g;
- $current_token=~s/(\$|_|{|})/\\$1/g;
- $current_token=~s/\\char92 /\\texttt{\\char92}/g;
- $current_token=~s/(>|<)/\$$1\$/g; #more or less
- if ($current_token=~m/\d%/) {$current_token =~ s/(\d)%/$1\\%/g;} #percent after digit
- if ($current_token=~m/\s%/) {$current_token =~ s/(\s)%/$1\\%/g;} #persent after space
+ $string=~s/\\ /\\char92 /g;
+ $string=~s/\^/\\char94 /g;
+ $string=~s/\~/\\char126 /g;
+ $string=~s/(&[^A-Za-z\#])/\\$1/g;
+ $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
}
- return $current_token;
+ return $string;
}
sub inner_xmlparse {
@@ -580,7 +586,7 @@ sub inner_xmlparse {
if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {
#Style file definitions should be correct
if ($target eq 'tex' && ($Apache::lonxml::usestyle)) {
- $result=&latex_special_symbols($result,$stack,$parstack);
+ $result=&latex_special_symbols($result);
}
}
@@ -948,83 +954,105 @@ sub store_counter {
}
sub get_all_text {
- my($tag,$pars)= @_;
- &Apache::lonxml::debug("Got a ".ref($pars));
- my $gotfullstack=1;
- if (ref($pars) ne 'ARRAY') {
- $gotfullstack=0;
- $pars=[$pars];
- }
- my $depth=0;
- my $token;
- my $result='';
- if ( $tag =~ m:^/: ) {
- my $tag=substr($tag,1);
- #&Apache::lonxml::debug("have:$tag:");
- my $top_empty=0;
- while (($depth >=0) && ($#$pars > -1) && (!$top_empty)) {
- while (($depth >=0) && ($token = $$pars[-1]->get_token)) {
- #&Apache::lonxml::debug("e token:$token->[0]:$depth:$token->[1]:".$#$pars.":".$#Apache::lonxml::pwd);
- if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) {
- $result.=$token->[1];
- } elsif ($token->[0] eq 'PI') {
- $result.=$token->[2];
- } elsif ($token->[0] eq 'S') {
- if ($token->[1] =~ /^$tag$/i) { $depth++; }
- $result.=$token->[4];
- } elsif ($token->[0] eq 'E') {
- if ( $token->[1] =~ /^$tag$/i) { $depth--; }
- #skip sending back the last end tag
- if ($depth > -1) { $result.=$token->[2]; } else {
- $$pars[-1]->unget_token($token);
- }
- }
- }
- if (($depth >=0) && ($#$pars == 0) ) { $top_empty=1; }
- if (($depth >=0) && ($#$pars > 0) ) {
- pop(@$pars);
- pop(@Apache::lonxml::pwd);
- }
- }
- if ($top_empty && $depth >= 0) {
- #never found the end tag ran out of text, throw error send back blank
- &error('Never found end tag for <'.$tag.'>');
- if ($gotfullstack) {
- my $newstring=''.$tag.'>'.$result;
- &Apache::lonxml::newparser($pars,\$newstring);
- }
- $result='';
- }
- } else {
- while ($#$pars > -1) {
- while ($token = $$pars[-1]->get_token) {
- #&Apache::lonxml::debug("s token:$token->[0]:$depth:$token->[1]");
- if (($token->[0] eq 'T')||($token->[0] eq 'C')||
- ($token->[0] eq 'D')) {
- $result.=$token->[1];
- } elsif ($token->[0] eq 'PI') {
- $result.=$token->[2];
- } elsif ($token->[0] eq 'S') {
- if ( $token->[1] =~ /^$tag$/i) {
- $$pars[-1]->unget_token($token); last;
- } else {
- $result.=$token->[4];
- }
- } elsif ($token->[0] eq 'E') {
- $result.=$token->[2];
- }
- }
- if (($#$pars > 0) ) {
- pop(@$pars);
- pop(@Apache::lonxml::pwd);
- } else { last; }
- }
- }
- if ($result =~ m|
'. + &HTML::Entities::encode($result). + ''); + if ($gotfullstack) { + my $newstring=''.$tag.'>'.$result; + &Apache::lonxml::newparser($pars,\$newstring); + } + $result=''; + } + } else { + while ($#$pars > -1) { + while ($token = $$pars[-1]->get_token) { + #&Apache::lonxml::debug("s token:$token->[0]:$depth:$token->[1]"); + if (($token->[0] eq 'T')||($token->[0] eq 'C')|| + ($token->[0] eq 'D')) { + $result.=$token->[1]; + } elsif ($token->[0] eq 'PI') { + $result.=$token->[2]; + } elsif ($token->[0] eq 'S') { + if ( $token->[1] =~ /^$tag$/i) { + $$pars[-1]->unget_token($token); last; + } else { + $result.=$token->[4]; + } + if ($token->[1] =~ /^LONCAPA_INTERNAL_TURN_STYLE_ON$/i) { $Apache::lonxml::usestyle=1; } + if ($token->[1] =~ /^LONCAPA_INTERNAL_TURN_STYLE_OFF$/i) { $Apache::lonxml::usestyle=0; } + } elsif ($token->[0] eq 'E') { + $result.=$token->[2]; + } + } + if (($#$pars > 0) ) { + pop(@$pars); + pop(@Apache::lonxml::pwd); + } else { last; } + } + } + #&Apache::lonxml::debug("Exit:$result:"); + return $result } sub newparser { @@ -1046,7 +1074,7 @@ sub parstring { my $val=$token->[2]->{$_}; $val =~ s/([\%\@\\\"\'])/\\$1/g; #if ($val =~ m/^[\%\@]/) { $val="\\".$val; } - $temp .= "my \$$_=\"$val\";" + $temp .= "my \$$_=\"$val\";"; } } return $temp; @@ -1111,8 +1139,10 @@ sub storefile { if (my $fh=Apache::File->new('>'.$file)) { print $fh $contents; $fh->close(); + return 1; } else { - &warning("Unable to save file $file"); + &warning("Unable to save file $file"); + return 0; } } @@ -1134,16 +1164,35 @@ SIMPLECONTENT return $filecontents; } +sub createnewsty { + my $filecontents=(<