version 1.135, 2001/10/05 16:55:12
|
version 1.143, 2002/01/01 16:37:20
|
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 16
|
Line 51
|
# 8/7,8/9,8/10,8/11,8/15,8/16,8/17,8/18,8/20,8/23,8/24 Gerd Kortemeyer |
# 8/7,8/9,8/10,8/11,8/15,8/16,8/17,8/18,8/20,8/23,8/24 Gerd Kortemeyer |
# Guy Albertelli |
# Guy Albertelli |
# 9/26 Gerd Kortemeyer |
# 9/26 Gerd Kortemeyer |
|
# Dec Guy Albertelli |
|
# YEAR=2002 |
|
# 1/1 Gerd Kortemeyer |
|
# |
|
|
package Apache::lonxml; |
package Apache::lonxml; |
use vars |
use vars |
Line 31 use Math::Random qw(:all);
|
Line 69 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) = @_; |
|
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); |
Line 49 use Apache::scripttag;
|
Line 95 use Apache::scripttag;
|
use Apache::edit; |
use Apache::edit; |
use Apache::lonnet; |
use Apache::lonnet; |
use Apache::File; |
use Apache::File; |
|
use Apache::loncommon; |
|
|
#================================================== Main subroutine: xmlparse |
#================================================== Main subroutine: xmlparse |
#debugging control, to turn on debugging modify the correct handler |
#debugging control, to turn on debugging modify the correct handler |
Line 389 sub unloadevents() {
|
Line 436 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 427 sub htmlclean {
|
Line 475 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 459 sub inner_xmlparse {
|
Line 507 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 476 sub inner_xmlparse {
|
Line 524 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 </'.$$stack['-1'].'> 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 494 sub inner_xmlparse {
|
Line 542 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 545 sub recurse {
|
Line 592 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 562 sub recurse {
|
Line 610 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 </'.$innerstack['-1'].'> 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 596 sub recurse {
|
Line 644 sub recurse {
|
pop @pat; |
pop @pat; |
pop @Apache::lonxml::pwd; |
pop @Apache::lonxml::pwd; |
} |
} |
|
&Apache::lonxml::debug("Exiting Recursing"); |
return $output; |
return $output; |
} |
} |
|
|
Line 607 sub callsub {
|
Line 656 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 807 sub decreasedepth {
|
Line 856 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 879 sub newparser {
|
Line 928 sub newparser {
|
sub parstring { |
sub parstring { |
my ($token) = @_; |
my ($token) = @_; |
my $temp=''; |
my $temp=''; |
map { |
foreach (@{$token->[3]}) { |
unless ($_=~/\W/) { |
unless ($_=~/\W/) { |
my $val=$token->[2]->{$_}; |
my $val=$token->[2]->{$_}; |
$val =~ s/([\%\@\\])/\\$1/g; |
$val =~ s/([\%\@\\])/\\$1/g; |
#if ($val =~ m/^[\%\@]/) { $val="\\".$val; } |
#if ($val =~ m/^[\%\@]/) { $val="\\".$val; } |
$temp .= "my \$$_=\"$val\";" |
$temp .= "my \$$_=\"$val\";" |
} |
} |
} @{$token->[3]}; |
} |
return $temp; |
return $temp; |
} |
} |
|
|
Line 899 sub writeallows {
|
Line 948 sub writeallows {
|
my $thisdir=$thisurl; |
my $thisdir=$thisurl; |
$thisdir=~s/\/[^\/]+$//; |
$thisdir=~s/\/[^\/]+$//; |
my %httpref=(); |
my %httpref=(); |
map { |
foreach (@extlinks) { |
$httpref{'httpref.'. |
$httpref{'httpref.'. |
&Apache::lonnet::hreflocation($thisdir,$_)}=$thisurl; |
&Apache::lonnet::hreflocation($thisdir,$_)}=$thisurl; |
} @extlinks; |
} |
@extlinks=(); |
@extlinks=(); |
&Apache::lonnet::appenv(%httpref); |
&Apache::lonnet::appenv(%httpref); |
} |
} |
Line 912 sub writeallows {
|
Line 961 sub writeallows {
|
# |
# |
sub afterburn { |
sub afterburn { |
my $result=shift; |
my $result=shift; |
map { |
foreach (split(/&/,$ENV{'QUERY_STRING'})) { |
my ($name, $value) = split(/=/,$_); |
my ($name, $value) = split(/=/,$_); |
$value =~ tr/+/ /; |
$value =~ tr/+/ /; |
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; |
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; |
Line 921 sub afterburn {
|
Line 970 sub afterburn {
|
$ENV{'form.'.$name}=$value; |
$ENV{'form.'.$name}=$value; |
} |
} |
} |
} |
} (split(/&/,$ENV{'QUERY_STRING'})); |
} |
if ($ENV{'form.highlight'}) { |
if ($ENV{'form.highlight'}) { |
map { |
foreach (split(/\,/,$ENV{'form.highlight'})) { |
my $anchorname=$_; |
my $anchorname=$_; |
my $matchthis=$anchorname; |
my $matchthis=$anchorname; |
$matchthis=~s/\_+/\\s\+/g; |
$matchthis=~s/\_+/\\s\+/g; |
$result=~s/($matchthis)/\<font color=\"red\"\>$1\<\/font\>/gs; |
$result=~s/($matchthis)/\<font color=\"red\"\>$1\<\/font\>/gs; |
} split(/\,/,$ENV{'form.highlight'}); |
} |
} |
} |
if ($ENV{'form.link'}) { |
if ($ENV{'form.link'}) { |
map { |
foreach (split(/\,/,$ENV{'form.link'})) { |
my ($anchorname,$linkurl)=split(/\>/,$_); |
my ($anchorname,$linkurl)=split(/\>/,$_); |
my $matchthis=$anchorname; |
my $matchthis=$anchorname; |
$matchthis=~s/\_+/\\s\+/g; |
$matchthis=~s/\_+/\\s\+/g; |
$result=~s/($matchthis)/\<a href=\"$linkurl\"\>$1\<\/a\>/gs; |
$result=~s/($matchthis)/\<a href=\"$linkurl\"\>$1\<\/a\>/gs; |
} split(/\,/,$ENV{'form.link'}); |
} |
} |
} |
if ($ENV{'form.anchor'}) { |
if ($ENV{'form.anchor'}) { |
my $anchorname=$ENV{'form.anchor'}; |
my $anchorname=$ENV{'form.anchor'}; |
Line 1007 sub handler {
|
Line 1056 sub handler {
|
} else { |
} else { |
$request->content_type('text/html'); |
$request->content_type('text/html'); |
} |
} |
|
&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; |
|
|
|
|
Line 1076 sub error {
|
Line 1125 sub error {
|
#notify course |
#notify course |
if ( $ENV{'request.course.id'} ) { |
if ( $ENV{'request.course.id'} ) { |
my $users=$ENV{'course.'.$ENV{'request.course.id'}.'.comment.email'}; |
my $users=$ENV{'course.'.$ENV{'request.course.id'}.'.comment.email'}; |
|
my $declutter=&Apache::lonnet::declutter($ENV{'request.filename'}); |
foreach my $user (split /\,/, $users) { |
foreach my $user (split /\,/, $users) { |
($user,my $domain) = split /:/, $user; |
($user,my $domain) = split /:/, $user; |
&Apache::lonmsg::user_normal_msg($user,$domain,"Error in $ENV{'request.filename'}",$_[0]); |
&Apache::lonmsg::user_normal_msg($user,$domain, |
|
"Error [$declutter]",$_[0]); |
} |
} |
} |
} |
|
|
Line 1160 sub register_insert {
|
Line 1211 sub register_insert {
|
|
|
sub description { |
sub description { |
my ($token)=@_; |
my ($token)=@_; |
return $insertlist{$insertlist{"$token->[1].num"}.'.description'}; |
my $tagnum; |
|
my $tag=$token->[1]; |
|
foreach my $namespace (reverse @Apache::lonxml::namespace) { |
|
my $testtag=$namespace.'::'.$tag; |
|
$tagnum=$insertlist{"$testtag.num"}; |
|
if (defined($tagnum)) { last; } |
|
} |
|
if (!defined ($tagnum)) { $tagnum=$Apache::lonxml::insertlist{"$tag.num"}; } |
|
return $insertlist{$tagnum.'.description'}; |
} |
} |
|
|
# ----------------------------------------------------------------- whichuser |
# ----------------------------------------------------------------- whichuser |