--- loncom/xml/lonxml.pm 2000/08/16 18:32:58 1.19
+++ loncom/xml/lonxml.pm 2000/10/11 21:12:42 1.27
@@ -26,23 +26,32 @@ use Apache::run;
use Apache::londefdef;
use Apache::scripttag;
#================================================== Main subroutine: xmlparse
+@Apache::lonxml::pwd=();
+$Apache::lonxml::outputstack = '';
+$Apache::lonxml::redirection = 1;
sub xmlparse {
my ($target,$content_file_string,$safeinit,%style_for_target) = @_;
my @pars = ();
- push (@pars,HTML::TokeParser->new(\$content_file_string));
+ @Apache::lonxml::pwd=();
+ my $pwd=$ENV{'request.filename'};
+ $pwd =~ s:/[^/]*$::;
+ &newparser(\@pars,\$content_file_string,$pwd);
my $currentstring = '';
my $finaloutput = '';
my $newarg = '';
my $result;
+
my $safeeval = new Safe;
$safeeval->permit("entereval");
$safeeval->permit(":base_math");
$safeeval->deny(":base_io");
#need to inspect this class of ops
# $safeeval->deny(":base_orig");
- if ( $safeinit ne '') {&Apache::run::run($safeinit,$safeeval);}
+ $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
($target, my @tenta) = split('&&',$target);
@@ -63,9 +72,17 @@ sub xmlparse {
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);
@@ -76,27 +93,46 @@ sub xmlparse {
&& ($#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;
}
@@ -106,7 +142,7 @@ sub recurse {
my @innerparstack = ();
my ($newarg,$target,$safeeval,$style_for_target,@parstack) = @_;
my @pat = ();
- push (@pat,HTML::TokeParser->new(\$newarg));
+ &newparser(\@pat,\$newarg);
my $tokenpat;
my $partstring = '';
my $output='';
@@ -154,6 +190,7 @@ sub recurse {
&decreasedepth($tokenpat);}
}
pop @pat;
+ pop @Apache::lonxml::pwd;
}
return $output;
}
@@ -162,15 +199,16 @@ 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]}) {
- #print "Calling sub $sub in $space \n";
- $sub="$space\:\:$sub";
+ #&Apache::lonxml::debug("Calling sub $sub in $space
\n");
+ $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 {
- #print "NOT Calling sub $sub\n";
+ #&Apache::lonxml::debug("NOT Calling sub $sub in $space
\n");
if (defined($token->[4])) {
$currentstring = $token->[4];
} else {
@@ -214,6 +252,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];
@@ -221,7 +261,7 @@ 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]; }
}
@@ -229,17 +269,89 @@ sub get_all_text {
return $result
}
+sub newparser {
+ my ($parser,$contentref,$dir) = @_;
+ push (@$parser,HTML::TokeParser->new($contentref));
+ if ( $dir eq '' ) {
+ push (@Apache::lonxml::pwd, $Apache::lonxml::pwd[$#Apache::lonxml::pwd]);
+ } else {
+ push (@Apache::lonxml::pwd, $dir);
+ }
+# &Apache::lonxml::debug("pwd:$#Apache::lonxml::pwd");
+# &Apache::lonxml::debug("pwd:$Apache::lonxml::pwd[$#Apache::lonxml::pwd]");
+}
sub parstring {
my ($token) = @_;
my $temp='';
- map {$temp .= "my \$$_=\"$token->[2]->{$_}\";"} @{$token->[3]};
+ map {
+ if ($_=~/\w+/) {
+ $temp .= "my \$$_=\"$token->[2]->{$_}\";"
+ }
+ } @{$token->[3]};
return $temp;
}
+
+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->send_http_header;
+
+ return OK if $request->header_only;
+
+ $request->print(&Apache::lontexconvert::header());
+
+ $request->print($headerstring.'