--- loncom/xml/lonxml.pm 2001/06/16 18:34:31 1.96
+++ loncom/xml/lonxml.pm 2001/07/12 15:26:03 1.101
@@ -70,9 +70,12 @@ $evaluate = 1;
# data structure for eidt mode, determines what tags can go into what other tags
%insertlist=();
-#stores the list of active tag namespaces
+# stores the list of active tag namespaces
@namespace=();
+# has the dynamic menu been updated to know about this resource
+$Apache::lonxml::registered=0;
+
sub xmlbegin {
my $output='';
if ($ENV{'browser.mathml'}) {
@@ -102,7 +105,9 @@ sub fontsettings() {
}
sub registerurl {
- if ($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) {
+ my $forcereg=shift;
+ if ($Apache::lonxml::registered) { return ''; }
+ if (($ENV{'REQUEST_URI'}!~/^\/(res\/)*adm\//) || ($forcereg)) {
my $hwkadd='';
if ($ENV{'REQUEST_URI'}=~/\.(problem|exam|quiz|assess|survey|form)$/) {
if (&Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) {
@@ -229,14 +234,9 @@ sub xmlparse {
&setup_globals($target);
#&printalltags();
my @pars = ();
- @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;
my $safehole = new Safe::Hole;
@@ -248,94 +248,107 @@ sub xmlparse {
my @stack = ();
my @parstack = ();
&initdepth;
- my $token;
- while ( $#pars > -1 ) {
- while ($token = $pars[$#pars]->get_token) {
- if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {
- if ($metamode<1) { $result=$token->[1]; }
- } elsif ($token->[0] eq 'PI') {
- if ($metamode<1) { $result=$token->[2]; }
- } elsif ($token->[0] eq 'S') {
- # 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) {
- $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("start_$token->[1]", $target, $token, \@stack,
- \@parstack, \@pars, $safeeval, \%style_for_target);
- }
- } elsif ($token->[0] eq 'E') {
- #clear out any tags that didn't end
- 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) {
- $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, \@stack,
- \@parstack, \@pars,$safeeval, \%style_for_target);
- }
- } else {
- &Apache::lonxml::error("Unknown token event :$token->[0]:$token->[1]:");
- }
- #evaluate variable refs in result
- if ($result ne "") {
- if ( $#parstack > -1 ) {
- 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 = '';
- }
- if ($token->[0] eq 'E') {
- pop @stack;pop @parstack;&decreasedepth($token);
- }
- }
- pop @pars;
- pop @Apache::lonxml::pwd;
- }
+ my $finaloutput = &inner_xmlparse($target,\@stack,\@parstack,\@pars,
+ $safeeval,\%style_for_target);
-# if ($target eq 'meta') {
-# $finaloutput.=&endredirection;
-# }
+ return $finaloutput;
+}
- if (($ENV{'QUERY_STRING'}) && ($target eq 'web')) {
- $finaloutput=&afterburn($finaloutput);
+sub inner_xmlparse {
+ my ($target,$stack,$parstack,$pars,$safeeval,$style_for_target)=@_;
+ &Apache::lonxml::debug('Reentrant parser starting, again?');
+ my $finaloutput = '';
+ my $result;
+ my $token;
+ while ( $#$pars > -1 ) {
+ while ($token = $$pars['-1']->get_token) {
+ if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {
+ if ($metamode<1) {
+ $result=$token->[1];
+ }
+ } elsif ($token->[0] eq 'PI') {
+ if ($metamode<1) {
+ $result=$token->[2];
+ }
+ } elsif ($token->[0] eq 'S') {
+ # 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) {
+ $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("start_$token->[1]", $target, $token, $stack,
+ $parstack, $pars, $safeeval, $style_for_target);
+ }
+ } elsif ($token->[0] eq 'E') {
+ #clear out any tags that didn't end
+ while ($token->[1] ne $$stack['-1'] && ($#$stack > -1)) {
+ &Apache::lonxml::warning("Unbalanced tags in resource $$stack['-1']");
+ &end_tag($stack,$parstack,$token);
+ }
+
+ if (exists $$style_for_target{'/'."$token->[1]"}) {
+ 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, $stack,
+ $parstack, $pars,$safeeval, $style_for_target);
+ }
+ } else {
+ &Apache::lonxml::error("Unknown token event :$token->[0]:$token->[1]:");
+ }
+ #evaluate variable refs in result
+ if ($result ne "") {
+ if ( $#$parstack > -1 ) {
+ if ($Apache::lonxml::redirection) {
+ $Apache::lonxml::outputstack['-1'] .=
+ &Apache::run::evaluate($result,$safeeval,$$parstack['-1']);
+ } else {
+ $finaloutput .= &Apache::run::evaluate($result,$safeeval,
+ $$parstack['-1']);
+ }
+ } else {
+ $finaloutput .= &Apache::run::evaluate($result,$safeeval,'');
+ }
+ $result = '';
+ }
+ if ($token->[0] eq 'E') {
+ &end_tag($stack,$parstack,$token);
+ }
+ }
+ pop @$pars;
+ pop @Apache::lonxml::pwd;
}
- return $finaloutput;
-}
+ # if ($target eq 'meta') {
+ # $finaloutput.=&endredirection;
+ # }
+ if (($ENV{'QUERY_STRING'}) && ($target eq 'web')) {
+ $finaloutput=&afterburn($finaloutput);
+ }
+ return $finaloutput;
+}
sub recurse {
-
my @innerstack = ();
my @innerparstack = ();
my ($newarg,$target,$safeeval,$style_for_target,@parstack) = @_;
@@ -363,7 +376,7 @@ sub recurse {
while ($tokenpat->[1] ne $innerstack[$#innerstack]
&& ($#innerstack > -1)) {
&Apache::lonxml::warning("Unbalanced tags in resource $innerstack['-1']");
- pop @innerstack;pop @innerparstack;&decreasedepth($tokenpat);
+ &end_tag(\@innerstack,\@innerparstack,$tokenpat);
}
$partstring = &callsub("end_$tokenpat->[1]", $target, $tokenpat,
\@innerstack, \@innerparstack, \@pat,
@@ -413,38 +426,47 @@ sub callsub {
$sub=~tr/A-Z/a-z/;
$space=$Apache::lonxml::alltags{$tag}
}
- if ($space) {
- #&Apache::lonxml::debug("Calling sub $sub in $space $metamode
\n");
- $sub1="$space\:\:$sub";
- $Apache::lonxml::curdepth=join('_',@Apache::lonxml::depthcounter);
- ($currentstring,$nodefault) = &$sub1($target,$token,$tagstack,
- $parstack,$parser,$safeeval,
- $style);
- } else {
- #&Apache::lonxml::debug("NOT Calling sub $sub in $space $metamode
\n");
- if ($metamode <1) {
- if (defined($token->[4]) && ($metamode < 1)) {
- $currentstring = $token->[4];
- } else {
- $currentstring = $token->[2];
+
+ my $deleted=0;
+ $Apache::lonxml::curdepth=join('_',@Apache::lonxml::depthcounter);
+ if (($token->[0] eq 'S') && ($target eq 'modified')) {
+ $deleted=&Apache::edit::handle_delete($space,$target,$token,$tagstack,
+ $parstack,$parser,$safeeval,
+ $style);
+ }
+ if (!$deleted) {
+ if ($space) {
+ #&Apache::lonxml::debug("Calling sub $sub in $space $metamode
\n");
+ $sub1="$space\:\:$sub";
+ ($currentstring,$nodefault) = &$sub1($target,$token,$tagstack,
+ $parstack,$parser,$safeeval,
+ $style);
+ } else {
+ #&Apache::lonxml::debug("NOT Calling sub $sub in $space $metamode
\n");
+ if ($metamode <1) {
+ if (defined($token->[4]) && ($metamode < 1)) {
+ $currentstring = $token->[4];
+ } else {
+ $currentstring = $token->[2];
+ }
}
}
- }
-# &Apache::lonxml::debug("nodefalt:$nodefault:");
- if ($currentstring eq '' && $nodefault eq '') {
- if ($target eq 'edit') {
- &Apache::lonxml::debug("doing default edit for $token->[1]");
- if ($token->[0] eq 'S') {
- $currentstring = &Apache::edit::tag_start($target,$token);
- } elsif ($token->[0] eq 'E') {
- $currentstring = &Apache::edit::tag_end($target,$token);
- }
- } elsif ($target eq 'modified') {
- if ($token->[0] eq 'S') {
- $currentstring = $token->[4];
- $currentstring.=&Apache::edit::handle_insert();
- } else {
- $currentstring = $token->[2];
+ # &Apache::lonxml::debug("nodefalt:$nodefault:");
+ if ($currentstring eq '' && $nodefault eq '') {
+ if ($target eq 'edit') {
+ &Apache::lonxml::debug("doing default edit for $token->[1]");
+ if ($token->[0] eq 'S') {
+ $currentstring = &Apache::edit::tag_start($target,$token);
+ } elsif ($token->[0] eq 'E') {
+ $currentstring = &Apache::edit::tag_end($target,$token);
+ }
+ } elsif ($target eq 'modified') {
+ if ($token->[0] eq 'S') {
+ $currentstring = $token->[4];
+ $currentstring.=&Apache::edit::handle_insert();
+ } else {
+ $currentstring = $token->[2];
+ }
}
}
}
@@ -455,6 +477,8 @@ sub callsub {
sub setup_globals {
my ($target)=@_;
+ $Apache::lonxml::registered = 0;
+ @Apache::lonxml::pwd=();
if ($target eq 'meta') {
$Apache::lonxml::redirection = 0;
$Apache::lonxml::metamode = 1;
@@ -553,6 +577,13 @@ sub endredirection {
pop @Apache::lonxml::outputstack;
}
+sub end_tag {
+ my ($tagstack,$parstack,$token)=@_;
+ pop(@$tagstack);
+ pop(@$parstack);
+ &decreasedepth($token);
+}
+
sub initdepth {
@Apache::lonxml::depthcounter=();
$Apache::lonxml::depth=-1;
@@ -894,6 +925,11 @@ sub register_insert {
$tagnum++;
}
}
+
+sub description {
+ my ($token)=@_;
+ return $insertlist{$insertlist{"$token->[1].num"}.'.description'};
+}
1;
__END__