--- loncom/xml/lonxml.pm 2000/10/26 14:01:40 1.29
+++ loncom/xml/lonxml.pm 2001/01/06 16:22:55 1.46
@@ -2,13 +2,18 @@
# XML Parser Module
#
# last modified 06/26/00 by Alexander Sakharuk
+# 11/6 Gerd Kortemeyer
+# 6/1/1 Gerd Kortemeyer
package Apache::lonxml;
-
+use vars
+qw(@pwd $outputstack $redirection $textredirection $on_offimport @extlinks);
use strict;
use HTML::TokeParser;
use Safe;
+use Safe::Hole;
use Opcode;
+use Apache::Constants qw(:common);
sub register {
my $space;
@@ -26,13 +31,23 @@ use Apache::run;
use Apache::londefdef;
use Apache::scripttag;
#================================================== Main subroutine: xmlparse
-@Apache::lonxml::pwd=();
-$Apache::lonxml::outputstack = '';
-$Apache::lonxml::redirection = 1;
+@pwd=();
+$outputstack = '';
+$redirection = 1;
+$textredirection = 1;
+$on_offimport = 0;
+@extlinks=();
sub xmlparse {
my ($target,$content_file_string,$safeinit,%style_for_target) = @_;
+ if ($target eq 'meta') {
+ $Apache::lonxml::textredirection = 0;
+ $Apache::lonxml::on_offimport = 1;
+ } else {
+ $Apache::lonxml::textredirection = 1;
+ $Apache::lonxml::on_offimport = 0;
+ }
my @pars = ();
@Apache::lonxml::pwd=();
my $pwd=$ENV{'request.filename'};
@@ -44,9 +59,11 @@ sub xmlparse {
my $result;
my $safeeval = new Safe;
+ my $safehole = new Safe::Hole;
$safeeval->permit("entereval");
$safeeval->permit(":base_math");
$safeeval->deny(":base_io");
+ $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT');
#need to inspect this class of ops
# $safeeval->deny(":base_orig");
$safeinit .= ';$external::target='.$target.';';
@@ -63,34 +80,39 @@ sub xmlparse {
while ( $#pars > -1 ) {
while ($token = $pars[$#pars]->get_token) {
if ($token->[0] eq 'T') {
- $result=$token->[1];
-# $finaloutput .= &Apache::run::evaluate($token->[1],$safeeval,'');
+ if ($Apache::lonxml::textredirection == 1) {$result=$token->[1];}
+ # $finaloutput .= &Apache::run::evaluate($token->[1],$safeeval,'');
} elsif ($token->[0] eq 'S') {
+ # if ($target eq 'meta' and $token->[2]->{metaout} eq 'ON') {$Apache::lonxml::textredirection = 1;}
# add tag to stack
push (@stack,$token->[1]);
# add parameters list to another stack
push (@parstack,&parstring($token));
&increasedepth($token);
if (exists $style_for_target{$token->[1]}) {
-
- if ($Apache::lonxml::redirection == 1) {
- $finaloutput .= &recurse($style_for_target{$token->[1]},
- $target,$safeeval,\%style_for_target,
- @parstack);
- } else {
- $Apache::lonxml::outputstack .= &recurse($style_for_target{$token->[1]},
- $target,$safeeval,\%style_for_target,
- @parstack);
- }
-
+
+ if ($Apache::lonxml::redirection == 1) {
+ $finaloutput .= &recurse($style_for_target{$token->[1]},
+ $target,$safeeval,\%style_for_target,
+ @parstack);
+ } else {
+ $Apache::lonxml::outputstack .= &recurse($style_for_target{$token->[1]},
+ $target,$safeeval,\%style_for_target,
+ @parstack);
+ }
+
} else {
$result = &callsub("start_$token->[1]", $target, $token,\@parstack,
- \@pars, $safeeval, \%style_for_target);
+ \@pars, $safeeval, \%style_for_target);
}
} elsif ($token->[0] eq 'E') {
+ #if ($target eq 'meta') {$Apache::lonxml::textredirection = 0;}
#clear out any tags that didn't end
while ($token->[1] ne $stack[$#stack]
- && ($#stack > -1)) {pop @stack;pop @parstack;&decreasedepth($token);}
+ && ($#stack > -1)) {
+ &Apache::lonxml::error("Unbalanced tags in resource $stack['-1']");
+ pop @stack;pop @parstack;&decreasedepth($token);
+ }
if (exists $style_for_target{'/'."$token->[1]"}) {
@@ -150,7 +172,7 @@ sub recurse {
while ( $#pat > -1 ) {
while ($tokenpat = $pat[$#pat]->get_token) {
if ($tokenpat->[0] eq 'T') {
- $partstring = $tokenpat->[1];
+ if ($Apache::lonxml::textredirection == 1) {$partstring = $tokenpat->[1];}
} elsif ($tokenpat->[0] eq 'S') {
push (@innerstack,$tokenpat->[1]);
push (@innerparstack,&parstring($tokenpat));
@@ -161,8 +183,10 @@ sub recurse {
} elsif ($tokenpat->[0] eq 'E') {
#clear out any tags that didn't end
while ($tokenpat->[1] ne $innerstack[$#innerstack]
- && ($#innerstack > -1)) {pop @innerstack;pop @innerparstack;
- &decreasedepth($tokenpat);}
+ && ($#innerstack > -1)) {
+ &Apache::lonxml::error("Unbalanced tags in resource $innerstack['-1']");
+ pop @innerstack;pop @innerparstack;&decreasedepth($tokenpat);
+ }
$partstring = &callsub("end_$tokenpat->[1]",
$target, $tokenpat, \@innerparstack,
\@pat, $safeeval, $style_for_target);
@@ -228,22 +252,30 @@ sub initdepth {
sub increasedepth {
my ($token) = @_;
- if ($Apache::lonxml::depth<$Apache::lonxml::olddepth-1) {
- $#Apache::lonxml::depthcounter--;
- $Apache::lonxml::olddepth=$Apache::lonxml::depth;
- }
$Apache::lonxml::depth++;
-# print "
s $Apache::lonxml::depth : $Apache::lonxml::olddepth : $token->[1]
\n";
$Apache::lonxml::depthcounter[$Apache::lonxml::depth]++;
if ($Apache::lonxml::depthcounter[$Apache::lonxml::depth]==1) {
$Apache::lonxml::olddepth=$Apache::lonxml::depth;
}
+ my $curdepth=join('_',@Apache::lonxml::depthcounter);
+ &Apache::lonxml::debug("s $Apache::lonxml::depth : $Apache::lonxml::olddepth : $curdepth : $token->[1]\n");
+#print "
s $Apache::lonxml::depth : $Apache::lonxml::olddepth : $curdepth : $token->[1]\n";
}
sub decreasedepth {
my ($token) = @_;
$Apache::lonxml::depth--;
-# print "
e $Apache::lonxml::depth : $Apache::lonxml::olddepth : $token->[1]
\n";
+ if ($Apache::lonxml::depth<$Apache::lonxml::olddepth-1) {
+ $#Apache::lonxml::depthcounter--;
+ $Apache::lonxml::olddepth=$Apache::lonxml::depth+1;
+ }
+ if ( $Apache::lonxml::depth < -1) {
+ &Apache::lonxml::error("Unbalanced tags in resource");
+ $Apache::lonxml::depth='-1';
+ }
+ my $curdepth=join('_',@Apache::lonxml::depthcounter);
+ &Apache::lonxml::debug("e $Apache::lonxml::depth : $Apache::lonxml::olddepth : $token->[1] : $curdepth\n");
+#print "
e $Apache::lonxml::depth : $Apache::lonxml::olddepth : $token->[1] : $curdepth\n";
}
sub get_all_text {
@@ -263,7 +295,9 @@ sub get_all_text {
} elsif ($token->[0] eq 'E') {
if ( $token->[1] eq $tag) { $depth--; }
#skip sending back the last end tag
- if ($depth > -1) { $result.=$token->[2]; }
+ if ($depth > -1) { $result.=$token->[2]; } else {
+ $pars->unget_token($token);
+ }
}
}
return $result
@@ -285,18 +319,31 @@ sub parstring {
my ($token) = @_;
my $temp='';
map {
- if ($_=~/\w+/) {
- $temp .= "my \$$_=\"$token->[2]->{$_}\";"
+ unless ($_=~/\W/) {
+ my $val=$token->[2]->{$_};
+ if ($val =~ m/^[\%\@]/) { $val="\\".$val; }
+ $temp .= "my \$$_=\"$val\";"
}
} @{$token->[3]};
return $temp;
}
+sub writeallows {
+ my $thisurl='/res/'.&Apache::lonnet::declutter(shift);
+ my $thisdir=$thisurl;
+ $thisdir=~s/\/[^\/]+$//;
+ my %httpref=();
+ map {
+ $httpref{'httpref.'.
+ &Apache::lonnet::hreflocation($thisdir,$_)}=$thisurl; } @extlinks;
+ &Apache::lonnet::appenv(%httpref);
+}
+
sub handler {
my $request=shift;
-
+
my $target='web';
- $Apache::lonxml::debug=1;
+# $Apache::lonxml::debug=1;
if ($ENV{'browser.mathml'}) {
$request->content_type('text/xml');
} else {
@@ -313,7 +360,7 @@ sub handler {
# &Apache::lonhomework::send_header($request);
$request->send_http_header;
- return 'OK' if $request->header_only;
+ return OK if $request->header_only;
$request->print(&Apache::lontexconvert::header());
@@ -327,7 +374,8 @@ sub handler {
$request->print('