--- loncom/xml/lonxml.pm	2000/08/11 14:24:50	1.18
+++ loncom/xml/lonxml.pm	2000/08/16 18:32:58	1.19
@@ -39,6 +39,9 @@ sub xmlparse {
  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);}
 #-------------------- Redefinition of the target in the case of compound target
 
@@ -58,7 +61,7 @@ sub xmlparse {
        push (@stack,$token->[1]);
        # add parameters list to another stack
        push (@parstack,&parstring($token));
-       &increasedepth();       
+       &increasedepth($token);       
        if (exists $style_for_target{$token->[1]}) {
 	 $finaloutput .= &recurse($style_for_target{$token->[1]},
 				  $target,$safeeval,\%style_for_target,
@@ -70,7 +73,7 @@ sub xmlparse {
      } elsif ($token->[0] eq 'E')  {
        #clear out any tags that didn't end
        while ($token->[1] ne $stack[$#stack] 
-	      && ($#stack > -1)) {pop @stack;pop @parstack;&decreasedepth;}
+	      && ($#stack > -1)) {pop @stack;pop @parstack;&decreasedepth($token);}
        
        if (exists $style_for_target{'/'."$token->[1]"}) {
 	 $finaloutput .= &recurse($style_for_target{'/'."$token->[1]"},
@@ -90,7 +93,7 @@ sub xmlparse {
        }
        $result = '';
      }
-     if ($token->[0] eq 'E') { pop @stack;pop @parstack;&decreasedepth;}
+     if ($token->[0] eq 'E') { pop @stack;pop @parstack;&decreasedepth($token);}
    }
    pop @pars;
  }
@@ -115,7 +118,7 @@ sub recurse {
       } elsif ($tokenpat->[0] eq 'S') {
 	push (@innerstack,$tokenpat->[1]);
 	push (@innerparstack,&parstring($tokenpat));
-	&increasedepth();
+	&increasedepth($tokenpat);
 	$partstring = &callsub("start_$tokenpat->[1]", 
 			       $target, $tokenpat, \@innerparstack,
 			       \@pat, $safeeval, $style_for_target);
@@ -123,7 +126,7 @@ sub recurse {
 	#clear out any tags that didn't end
 	while ($tokenpat->[1] ne $innerstack[$#innerstack] 
 	       && ($#innerstack > -1)) {pop @innerstack;pop @innerparstack;
-					&decreasedepth;}
+					&decreasedepth($tokenpat);}
 	$partstring = &callsub("end_$tokenpat->[1]",
 			       $target, $tokenpat, \@innerparstack,
 			       \@pat, $safeeval, $style_for_target);
@@ -148,7 +151,7 @@ sub recurse {
 	$partstring = '';
       }
       if ($tokenpat->[0] eq 'E') { pop @innerstack;pop @innerparstack;
-				 &decreasedepth;}
+				 &decreasedepth($tokenpat);}
     }
     pop @pat;
   }
@@ -186,11 +189,13 @@ 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 "<br>s $Apache::lonxml::depth : $Apache::lonxml::olddepth : $token->[1]<br>\n";
   $Apache::lonxml::depthcounter[$Apache::lonxml::depth]++;
   if ($Apache::lonxml::depthcounter[$Apache::lonxml::depth]==1) {
     $Apache::lonxml::olddepth=$Apache::lonxml::depth;
@@ -198,9 +203,33 @@ sub increasedepth {
 }
 
 sub decreasedepth {
+  my ($token) = @_;
   $Apache::lonxml::depth--;
+#  print "<br>e $Apache::lonxml::depth : $Apache::lonxml::olddepth : $token->[1]<br>\n";
 }
 
+sub get_all_text {
+
+ my($tag,$pars)= @_;
+ my $depth=0;
+ my $token;
+ my $result='';
+ while (($depth >=0) && ($token = $pars->get_token)) {
+   if ($token->[0] eq 'T') {
+     $result.=$token->[1];
+   } elsif ($token->[0] eq 'S') {
+     if ($token->[1] eq $tag) { $depth++; }
+     $result.=$token->[4];
+   } elsif ($token->[0] eq 'E')  {
+     if ($token->[1] eq $tag) { $depth--; }
+     #skip sending back the last end tag
+     if ($depth > -1) { $result.=$token->[2]; }
+   }
+ }
+ return $result
+}
+
+
 sub parstring {
   my ($token) = @_;
   my $temp='';