--- loncom/xml/lonxml.pm 2001/01/06 15:31:27 1.45
+++ loncom/xml/lonxml.pm 2001/02/22 00:49:03 1.55
@@ -4,16 +4,17 @@
# last modified 06/26/00 by Alexander Sakharuk
# 11/6 Gerd Kortemeyer
# 6/1/1 Gerd Kortemeyer
+# 2/21 Guy
package Apache::lonxml;
use vars
-qw(@pwd $outputstack $redirection $textredirection $on_offimport @extlinks);
+qw(@pwd @outputstack $redirection $textredirection $import @extlinks);
use strict;
use HTML::TokeParser;
use Safe;
use Safe::Hole;
use Opcode;
-use Apache::Constants(:common);
+use Apache::Constants qw(:common);
sub register {
my $space;
@@ -24,7 +25,13 @@ sub register {
$Apache::lonxml::alltags{$temptag}=$space;
}
}
-
+
+sub printalltags {
+ my $temp;
+ foreach $temp (sort keys %Apache::lonxml::alltags) {
+ &Apache::lonxml::debug("$temp -- $Apache::lonxml::alltags{$temp}");
+ }
+}
use Apache::style;
use Apache::lontexconvert;
use Apache::run;
@@ -32,22 +39,25 @@ use Apache::londefdef;
use Apache::scripttag;
#================================================== Main subroutine: xmlparse
@pwd=();
-$outputstack = '';
-$redirection = 1;
-$textredirection = 1;
-$on_offimport = 0;
+@outputstack = ();
+$redirection = 0;
+$import = 1;
@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;
+ &startredirection;
+ $Apache::lonxml::import = 0;
+ } elsif ($target eq 'grade') {
+ &startredirection;
+ $Apache::lonxml::import = 1;
} else {
- $Apache::lonxml::textredirection = 1;
- $Apache::lonxml::on_offimport = 0;
+ $Apache::lonxml::redirection = 0;
+ $Apache::lonxml::import = 1;
}
+ #&printalltags();
my @pars = ();
@Apache::lonxml::pwd=();
my $pwd=$ENV{'request.filename'};
@@ -80,76 +90,67 @@ sub xmlparse {
while ( $#pars > -1 ) {
while ($token = $pars[$#pars]->get_token) {
if ($token->[0] eq 'T') {
- if ($Apache::lonxml::textredirection == 1) {$result=$token->[1];}
- # $finaloutput .= &Apache::run::evaluate($token->[1],$safeeval,'');
+ $result=$token->[1];
} 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);
+ if ($Apache::lonxml::redirection) {
+ $Apache::lonxml::outputstack['-1'] .=
+ &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);
+ $finaloutput .= &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);
}
} 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)) {
- &Apache::lonxml::error("Unbalanced tags in resource $stack['-1']");
+ while ($token->[1] ne $stack[$#stack] && ($#stack > -1)) {
+ &Apache::lonxml::warning("Unbalanced tags in resource $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);
- }
-
+ if ($Apache::lonxml::redirection) {
+ $Apache::lonxml::outputstack['-1'] .=
+ &recurse($style_for_target{'/'."$token->[1]"},
+ $target,$safeeval,\%style_for_target,@parstack);
+ } else {
+ $finaloutput .= &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);
+ \@pars,$safeeval, \%style_for_target);
}
}
+ #evaluate variable refs in result
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]);
- }
-
+ if ($Apache::lonxml::redirection) {
+ $Apache::lonxml::outputstack['-1'] .=
+ &Apache::run::evaluate($result,$safeeval,$parstack[$#parstack]);
+ } else {
+ $finaloutput .= &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);
}
- if ($token->[0] eq 'E') { pop @stack;pop @parstack;&decreasedepth($token);}
}
pop @pars;
pop @Apache::lonxml::pwd;
@@ -172,7 +173,7 @@ sub recurse {
while ( $#pat > -1 ) {
while ($tokenpat = $pat[$#pat]->get_token) {
if ($tokenpat->[0] eq 'T') {
- if ($Apache::lonxml::textredirection == 1) {$partstring = $tokenpat->[1];}
+ $partstring = $tokenpat->[1];
} elsif ($tokenpat->[0] eq 'S') {
push (@innerstack,$tokenpat->[1]);
push (@innerparstack,&parstring($tokenpat));
@@ -184,7 +185,7 @@ sub recurse {
#clear out any tags that didn't end
while ($tokenpat->[1] ne $innerstack[$#innerstack]
&& ($#innerstack > -1)) {
- &Apache::lonxml::error("Unbalanced tags in resource $innerstack['-1']");
+ &Apache::lonxml::warning("Unbalanced tags in resource $innerstack['-1']");
pop @innerstack;pop @innerparstack;&decreasedepth($tokenpat);
}
$partstring = &callsub("end_$tokenpat->[1]",
@@ -226,13 +227,13 @@ sub callsub {
my $sub1;
no strict 'refs';
if (my $space=$Apache::lonxml::alltags{$token->[1]}) {
- #&Apache::lonxml::debug("Calling sub $sub in $space
\n");
+ #&Apache::lonxml::debug("Calling sub $sub in $space
\n");
$sub1="$space\:\:$sub";
$Apache::lonxml::curdepth=join('_',@Apache::lonxml::depthcounter);
$currentstring = &$sub1($target,$token,$parstack,$parser,
$safeeval,$style);
} else {
- #&Apache::lonxml::debug("NOT Calling sub $sub in $space
\n");
+ #&Apache::lonxml::debug("NOT Calling sub $sub in $space
\n");
if (defined($token->[4])) {
$currentstring = $token->[4];
} else {
@@ -244,6 +245,20 @@ sub callsub {
return $currentstring;
}
+sub startredirection {
+ $Apache::lonxml::redirection++;
+ push (@Apache::lonxml::outputstack, '');
+}
+
+sub endredirection {
+ if (!$Apache::lonxml::redirection) {
+ &Apache::lonxml::error("Endredirection was called, before a startredirection, perhaps you have unbalanced tags. Some debuggin information:".join ":",caller);
+ return '';
+ }
+ $Apache::lonxml::redirection--;
+ pop @Apache::lonxml::outputstack;
+}
+
sub initdepth {
@Apache::lonxml::depthcounter=();
$Apache::lonxml::depth=-1;
@@ -259,7 +274,7 @@ sub increasedepth {
}
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";
+#print "
s $Apache::lonxml::depth : $Apache::lonxml::olddepth : $curdepth : $token->[1]\n";
}
sub decreasedepth {
@@ -270,12 +285,12 @@ sub decreasedepth {
$Apache::lonxml::olddepth=$Apache::lonxml::depth+1;
}
if ( $Apache::lonxml::depth < -1) {
- &Apache::lonxml::error("Unbalanced tags in resource");
+ &Apache::lonxml::warning("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";
+#print "
e $Apache::lonxml::depth : $Apache::lonxml::olddepth : $token->[1] : $curdepth\n";
}
sub get_all_text {
@@ -285,8 +300,9 @@ sub get_all_text {
my $token;
my $result='';
my $tag=substr($tag,1); #strip the / off the tag
-# &Apache::lonxml::debug("have:$tag:");
+ #&Apache::lonxml::debug("have:$tag:");
while (($depth >=0) && ($token = $pars->get_token)) {
+ #&Apache::lonxml::debug("token:$token->[0]:$depth:$token->[1]");
if ($token->[0] eq 'T') {
$result.=$token->[1];
} elsif ($token->[0] eq 'S') {
@@ -300,6 +316,7 @@ sub get_all_text {
}
}
}
+# &Apache::lonxml::debug("Exit:$result:");
return $result
}
@@ -321,7 +338,8 @@ sub parstring {
map {
unless ($_=~/\W/) {
my $val=$token->[2]->{$_};
- if ($val =~ m/^[\%\@]/) { $val="\\".$val; }
+ $val =~ s/([\%\@\\])/\\$1/g;
+ #if ($val =~ m/^[\%\@]/) { $val="\\".$val; }
$temp .= "my \$$_=\"$val\";"
}
} @{$token->[3]};
@@ -343,7 +361,7 @@ sub handler {
my $request=shift;
my $target='web';
-# $Apache::lonxml::debug=1;
+ $Apache::lonxml::debug=0;
if ($ENV{'browser.mathml'}) {
$request->content_type('text/xml');
} else {
@@ -366,12 +384,19 @@ sub handler {
$request->print('