--- loncom/xml/lonxml.pm 2000/10/05 19:30:14 1.23
+++ loncom/xml/lonxml.pm 2001/01/03 00:13:22 1.42
@@ -2,12 +2,15 @@
# XML Parser Module
#
# last modified 06/26/00 by Alexander Sakharuk
+# 11/6 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;
sub register {
@@ -26,10 +29,20 @@ use Apache::run;
use Apache::londefdef;
use Apache::scripttag;
#================================================== Main subroutine: xmlparse
-@Apache::lonxml::pwd=();
+@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;
+ }
my @pars = ();
@Apache::lonxml::pwd=();
my $pwd=$ENV{'request.filename'};
@@ -39,13 +52,17 @@ sub xmlparse {
my $finaloutput = '';
my $newarg = '';
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.';';
+ $safeinit .= ';$external::randomseed='.&Apache::lonnet::rndseed().';';
&Apache::run::run($safeinit,$safeeval);
#-------------------- Redefinition of the target in the case of compound target
@@ -58,50 +75,78 @@ 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]}) {
- $finaloutput .= &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);}
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);
+ }
+
} else {
$result = &callsub("end_$token->[1]", $target, $token, \@parstack,
\@pars,$safeeval, \%style_for_target);
}
}
- if ($result ne "" ) {
- if ( $#parstack > -1 ) {
+ if ($result ne "") {
+ if ( $#parstack > -1 ) {
+
+ if ($Apache::lonxml::redirection == 1) {
$finaloutput .= &Apache::run::evaluate($result,$safeeval,
$parstack[$#parstack]);
+ } else {
+ $Apache::lonxml::outputstack .= &Apache::run::evaluate($result,$safeeval,
+ $parstack[$#parstack]);
+ }
+
} else {
$finaloutput .= &Apache::run::evaluate($result,$safeeval,'');
}
$result = '';
+ } else {
+ $finaloutput .= $result;
}
if ($token->[0] eq 'E') { pop @stack;pop @parstack;&decreasedepth($token);}
}
pop @pars;
pop @Apache::lonxml::pwd;
}
+
return $finaloutput;
}
@@ -119,7 +164,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));
@@ -168,12 +213,13 @@ sub callsub {
my ($sub,$target,$token,$parstack,$parser,$safeeval,$style)=@_;
my $currentstring='';
{
+ my $sub1;
no strict 'refs';
if (my $space=$Apache::lonxml::alltags{$token->[1]}) {
#&Apache::lonxml::debug("Calling sub $sub in $space
\n");
- $sub="$space\:\:$sub";
+ $sub1="$space\:\:$sub";
$Apache::lonxml::curdepth=join('_',@Apache::lonxml::depthcounter);
- $currentstring = &$sub($target,$token,$parstack,$parser,
+ $currentstring = &$sub1($target,$token,$parstack,$parser,
$safeeval,$style);
} else {
#&Apache::lonxml::debug("NOT Calling sub $sub in $space
\n");
@@ -196,22 +242,24 @@ 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");
}
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;
+ }
+ my $curdepth=join('_',@Apache::lonxml::depthcounter);
+ &Apache::lonxml::debug("e $Apache::lonxml::depth : $Apache::lonxml::olddepth : $token->[1] : $curdepth\n");
}
sub get_all_text {
@@ -220,6 +268,8 @@ sub get_all_text {
my $depth=0;
my $token;
my $result='';
+ my $tag=substr($tag,1); #strip the / off the tag
+# &Apache::lonxml::debug("have:$tag:");
while (($depth >=0) && ($token = $pars->get_token)) {
if ($token->[0] eq 'T') {
$result.=$token->[1];
@@ -227,9 +277,11 @@ sub get_all_text {
if ($token->[1] eq $tag) { $depth++; }
$result.=$token->[4];
} elsif ($token->[0] eq 'E') {
- if ($token->[1] eq $tag) { $depth--; }
+ 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
@@ -251,13 +303,65 @@ 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;
+ if ($ENV{'browser.mathml'}) {
+ $request->content_type('text/xml');
+ } else {
+ $request->content_type('text/html');
+ }
+
+# $request->print(<
+#
+#Just test
+#
+#
+#ENDHEADER
+# &Apache::lonhomework::send_header($request);
+ $request->send_http_header;
+
+ return 'OK' if $request->header_only;
+
+ $request->print(&Apache::lontexconvert::header());
+
+ $request->print(''."\n");
+
+ my $file = "/home/httpd/html".$request->uri;
+ my %mystyle;
+ my $result = '';
+ $result = Apache::lonxml::xmlparse($target, &Apache::lonnet::getfile($file),'',%mystyle);
+ $request->print($result);
+
+ $request->print('');
+ $request->print(&Apache::lontexconvert::footer());
+ writeallows($request->uri);
+ return 'OK';
+}
+
$Apache::lonxml::debug=0;
sub debug {
if ($Apache::lonxml::debug eq 1) {
@@ -278,5 +382,18 @@ __END__
+
+
+
+
+
+
+
+
+
+
+
+
+