Diff for /loncom/xml/lonxml.pm between versions 1.138 and 1.141

version 1.138, 2001/11/07 21:26:04 version 1.141, 2001/12/14 22:59:34
Line 1 Line 1
 # The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
 # XML Parser Module   # XML Parser Module 
 #  #
   # $Id$
   #
   # Copyright Michigan State University Board of Trustees
   #
   # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
   #
   # LON-CAPA is free software; you can redistribute it and/or modify
   # it under the terms of the GNU General Public License as published by
   # the Free Software Foundation; either version 2 of the License, or
   # (at your option) any later version.
   #
   # LON-CAPA is distributed in the hope that it will be useful,
   # but WITHOUT ANY WARRANTY; without even the implied warranty of
   # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   # GNU General Public License for more details.
   #
   # You should have received a copy of the GNU General Public License
   # along with LON-CAPA; if not, write to the Free Software
   # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   #
   # /home/httpd/html/adm/gpl.txt
   #
   # http://www.lon-capa.org/
   #
   # Copyright for TtHfunc and TtMfunc by Ian Hutchinson. 
   # TtHfunc and TtMfunc (the "Code") may be compiled and linked into 
   # binary executable programs or libraries distributed by the 
   # Michigan State University (the "Licensee"), but any binaries so 
   # distributed are hereby licensed only for use in the context
   # of a program or computational system for which the Licensee is the 
   # primary author or distributor, and which performs substantial 
   # additional tasks beyond the translation of (La)TeX into HTML.
   # The C source of the Code may not be distributed by the Licensee
   # to any other parties under any circumstances.
   #
 # last modified 06/26/00 by Alexander Sakharuk  # last modified 06/26/00 by Alexander Sakharuk
 # 11/6 Gerd Kortemeyer  # 11/6 Gerd Kortemeyer
 # 6/1/1 Gerd Kortemeyer  # 6/1/1 Gerd Kortemeyer
Line 31  use Math::Random qw(:all); Line 66  use Math::Random qw(:all);
 use Opcode;  use Opcode;
   
 sub register {  sub register {
   my $space;    my ($space,@taglist) = @_;
   my @taglist;    foreach my $temptag (@taglist) {
   my $temptag;      push(@{ $Apache::lonxml::alltags{$temptag} },$space);
   ($space,@taglist) = @_;  
   foreach $temptag (@taglist) {  
     $Apache::lonxml::alltags{$temptag}=$space;  
   }    }
 }  }
   
   sub deregister {
     my ($space,@taglist) = @_;
     &printalltags();
     foreach my $temptag (@taglist) {
       my $tempspace = $Apache::lonxml::alltags{$temptag}[-1];
       if ($tempspace eq $space) {
         pop(@{ $Apache::lonxml::alltags{$temptag} });
       }
     }
     &printalltags();
   }
   
 use Apache::Constants qw(:common);  use Apache::Constants qw(:common);
 use Apache::lontexconvert;  use Apache::lontexconvert;
 use Apache::style;  use Apache::style;
Line 390  sub unloadevents() { Line 434  sub unloadevents() {
 sub printalltags {  sub printalltags {
   my $temp;    my $temp;
   foreach $temp (sort keys %Apache::lonxml::alltags) {    foreach $temp (sort keys %Apache::lonxml::alltags) {
     &Apache::lonxml::debug("$temp -- $Apache::lonxml::alltags{$temp}");      &Apache::lonxml::debug("$temp -- ".
     join(',',@{ $Apache::lonxml::alltags{$temp} }));
   }    }
 }  }
   
Line 428  sub htmlclean { Line 473  sub htmlclean {
   
     my $tree = HTML::TreeBuilder->new;      my $tree = HTML::TreeBuilder->new;
     $tree->ignore_unknown(0);      $tree->ignore_unknown(0);
       
     $tree->parse($raw);      $tree->parse($raw);
   
     my $output= $tree->as_HTML(undef,' ');      my $output= $tree->as_HTML(undef,' ');
        
     $output=~s/\<(br|hr|img|meta|allow)([^\>\/]*)\>/\<$1$2 \/\>/gis;      $output=~s/\<(br|hr|img|meta|allow)([^\>\/]*)\>/\<$1$2 \/\>/gis;
     $output=~s/\<\/(br|hr|img|meta|allow)\>//gis;      $output=~s/\<\/(br|hr|img|meta|allow)\>//gis;
     unless ($full) {      unless ($full) {
Line 460  sub inner_xmlparse { Line 505  sub inner_xmlparse {
   $result=$token->[2];    $result=$token->[2];
  }   }
       } elsif ($token->[0] eq 'S') {        } elsif ($token->[0] eq 'S') {
  # add tag to stack       # add tag to stack
  push (@$stack,$token->[1]);   push (@$stack,$token->[1]);
  # add parameters list to another stack   # add parameters list to another stack
  push (@$parstack,&parstring($token));   push (@$parstack,&parstring($token));
  &increasedepth($token);          &increasedepth($token);
  if (exists $$style_for_target{$token->[1]}) {   if (exists $$style_for_target{$token->[1]}) {
   if ($Apache::lonxml::redirection) {    if ($Apache::lonxml::redirection) {
     $Apache::lonxml::outputstack['-1'] .=        $Apache::lonxml::outputstack['-1'] .=
       &recurse($$style_for_target{$token->[1]},$target,$safeeval,        &recurse($$style_for_target{$token->[1]},$target,$safeeval,
        $style_for_target,@$parstack);         $style_for_target,@$parstack);
   } else {    } else {
Line 477  sub inner_xmlparse { Line 522  sub inner_xmlparse {
  } else {   } else {
   $result = &callsub("start_$token->[1]", $target, $token, $stack,    $result = &callsub("start_$token->[1]", $target, $token, $stack,
      $parstack, $pars, $safeeval, $style_for_target);       $parstack, $pars, $safeeval, $style_for_target);
  }                 }
       } elsif ($token->[0] eq 'E') {        } elsif ($token->[0] eq 'E') {
  #clear out any tags that didn't end   #clear out any tags that didn't end
  while ($token->[1] ne $$stack['-1'] && ($#$stack > -1)) {   while ($token->[1] ne $$stack['-1'] && ($#$stack > -1)) {
   &Apache::lonxml::warning("Unbalanced tags in resource $$stack['-1']");    &Apache::lonxml::warning('Missing tag &lt;/'.$$stack['-1'].'&gt; in file');
   &end_tag($stack,$parstack,$token);    &end_tag($stack,$parstack,$token);
  }   }
   
  if (exists $$style_for_target{'/'."$token->[1]"}) {   if (exists($$style_for_target{'/'."$token->[1]"})) {
   if ($Apache::lonxml::redirection) {    if ($Apache::lonxml::redirection) {
     $Apache::lonxml::outputstack['-1'] .=        $Apache::lonxml::outputstack['-1'] .=  
       &recurse($$style_for_target{'/'."$token->[1]"},        &recurse($$style_for_target{'/'."$token->[1]"},
Line 495  sub inner_xmlparse { Line 540  sub inner_xmlparse {
      $target,$safeeval,$style_for_target,       $target,$safeeval,$style_for_target,
      @$parstack);       @$parstack);
   }    }
       
  } else {   } else {
   $result = &callsub("end_$token->[1]", $target, $token, $stack,    $result = &callsub("end_$token->[1]", $target, $token, $stack,
      $parstack, $pars,$safeeval, $style_for_target);       $parstack, $pars,$safeeval, $style_for_target);
Line 546  sub recurse { Line 590  sub recurse {
   my $partstring = '';    my $partstring = '';
   my $output='';    my $output='';
   my $decls='';    my $decls='';
     &Apache::lonxml::debug("Recursing");
   while ( $#pat > -1 ) {    while ( $#pat > -1 ) {
     while  ($tokenpat = $pat[$#pat]->get_token) {      while  ($tokenpat = $pat[$#pat]->get_token) {
       if (($tokenpat->[0] eq 'T') || ($tokenpat->[0] eq 'C') || ($tokenpat->[0] eq 'D') ) {        if (($tokenpat->[0] eq 'T') || ($tokenpat->[0] eq 'C') || ($tokenpat->[0] eq 'D') ) {
Line 563  sub recurse { Line 608  sub recurse {
  #clear out any tags that didn't end   #clear out any tags that didn't end
  while ($tokenpat->[1] ne $innerstack[$#innerstack]    while ($tokenpat->[1] ne $innerstack[$#innerstack] 
        && ($#innerstack > -1)) {         && ($#innerstack > -1)) {
   &Apache::lonxml::warning("Unbalanced tags in resource $innerstack['-1']");    &Apache::lonxml::warning('Missing tag &lt;/'.$innerstack['-1'].'&gt; in style');
   &end_tag(\@innerstack,\@innerparstack,$tokenpat);    &end_tag(\@innerstack,\@innerparstack,$tokenpat);
  }   }
  $partstring = &callsub("end_$tokenpat->[1]", $target, $tokenpat,   $partstring = &callsub("end_$tokenpat->[1]", $target, $tokenpat,
Line 597  sub recurse { Line 642  sub recurse {
     pop @pat;      pop @pat;
     pop @Apache::lonxml::pwd;      pop @Apache::lonxml::pwd;
   }    }
     &Apache::lonxml::debug("Exiting Recursing");
   return $output;    return $output;
 }  }
   
Line 608  sub callsub { Line 654  sub callsub {
     my $sub1;      my $sub1;
     no strict 'refs';      no strict 'refs';
     my $tag=$token->[1];      my $tag=$token->[1];
     my $space=$Apache::lonxml::alltags{$tag};      my $space=$Apache::lonxml::alltags{$tag}[-1];
     if (!$space) {      if (!$space) {
  $tag=~tr/A-Z/a-z/;        $tag=~tr/A-Z/a-z/;
  $sub=~tr/A-Z/a-z/;   $sub=~tr/A-Z/a-z/;
  $space=$Apache::lonxml::alltags{$tag}   $space=$Apache::lonxml::alltags{$tag}[-1]
     }      }
   
     my $deleted=0;      my $deleted=0;
Line 808  sub decreasedepth { Line 854  sub decreasedepth {
     $Apache::lonxml::olddepth=$Apache::lonxml::depth+1;      $Apache::lonxml::olddepth=$Apache::lonxml::depth+1;
   }    }
   if (  $Apache::lonxml::depth < -1) {    if (  $Apache::lonxml::depth < -1) {
     &Apache::lonxml::warning("Unbalanced tags in resource");         &Apache::lonxml::warning("Missing tags, unable to properly run file.");
     $Apache::lonxml::depth='-1';      $Apache::lonxml::depth='-1';
   }    }
   my $curdepth=join('_',@Apache::lonxml::depthcounter);    my $curdepth=join('_',@Apache::lonxml::depthcounter);
Line 1008  sub handler { Line 1054  sub handler {
   } else {    } else {
     $request->content_type('text/html');      $request->content_type('text/html');
   }    }
   &Apache::loncommon::no_cache($request);     &Apache::loncommon::no_cache($request);
   $request->send_http_header;    $request->send_http_header;
     
   return OK if $request->header_only;    return OK if $request->header_only;
   
   

Removed from v.1.138  
changed lines
  Added in v.1.141


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>