--- loncom/xml/lonxml.pm 2001/03/23 22:08:05 1.60
+++ loncom/xml/lonxml.pm 2001/05/04 17:33:35 1.70
@@ -5,6 +5,7 @@
# 11/6 Gerd Kortemeyer
# 6/1/1 Gerd Kortemeyer
# 2/21,3/13 Guy
+# 3/29,5/4 Gerd Kortemeyer
package Apache::lonxml;
use vars
@@ -16,6 +17,64 @@ use Safe::Hole;
use Opcode;
use Apache::Constants qw(:common);
+
+sub xmlbegin {
+ my $output='';
+ if ($ENV{'browser.mathml'}) {
+ $output=''
+ .''
+ .']>'
+ .'';
+ } else {
+ $output='';
+ }
+ return $output;
+}
+
+sub xmlend {
+ return '';
+}
+
+sub fontsettings() {
+ my $headerstring='';
+ if (($ENV{'browser.os'} eq 'mac') && (!$ENV{'browser.mathml'})) {
+ $headerstring.=
+ '';
+ }
+ return $headerstring;
+}
+
+sub registerurl {
+ return (<
+ function LONCAPAreg() {
+ if (window.location.pathname!="/res/adm/pages/menu.html") {
+ menu=window.open("","LONCAPAmenu");
+ menu.currentURL=window.location.pathname;
+ menu.currentStale=0;
+ }
+ }
+
+ function LONCAPAstale() {
+ if (window.location.pathname!="/res/adm/pages/menu.html") {
+ menu=window.open("","LONCAPAmenu");
+ menu.currentStale=1;
+ }
+ }
+
+ENDSCRIPT
+}
+
+sub loadevents() {
+ return 'LONCAPAreg();';
+}
+
+sub unloadevents() {
+ return 'LONCAPAstale();';
+}
+
sub register {
my $space;
my @taglist;
@@ -33,7 +92,6 @@ sub printalltags {
}
}
use Apache::style;
-use Apache::lontexconvert;
use Apache::run;
use Apache::londefdef;
use Apache::scripttag;
@@ -97,9 +155,9 @@ sub xmlparse {
while ( $#pars > -1 ) {
while ($token = $pars[$#pars]->get_token) {
if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {
- if (!$metamode) { $result=$token->[1]; }
+ if ($metamode<1) { $result=$token->[1]; }
} elsif ($token->[0] eq 'PI') {
- if (!$metamode) { $result=$token->[2]; }
+ if ($metamode<1) { $result=$token->[2]; }
} elsif ($token->[0] eq 'S') {
# add tag to stack
push (@stack,$token->[1]);
@@ -107,9 +165,7 @@ sub xmlparse {
push (@parstack,&parstring($token));
&increasedepth($token);
if (exists $style_for_target{$token->[1]}) {
- if ($metamode) {
- $result = $style_for_target{$token->[1]};
- } elsif ($Apache::lonxml::redirection) {
+ if ($Apache::lonxml::redirection) {
$Apache::lonxml::outputstack['-1'] .=
&recurse($style_for_target{$token->[1]},$target,$safeeval,
\%style_for_target,@parstack);
@@ -129,9 +185,7 @@ sub xmlparse {
}
if (exists $style_for_target{'/'."$token->[1]"}) {
- if ($metamode) {
- $result = $style_for_target{$token->[1]};
- } elsif ($Apache::lonxml::redirection) {
+ if ($Apache::lonxml::redirection) {
$Apache::lonxml::outputstack['-1'] .=
&recurse($style_for_target{'/'."$token->[1]"},
$target,$safeeval,\%style_for_target,@parstack);
@@ -174,9 +228,15 @@ sub xmlparse {
# if ($target eq 'meta') {
# $finaloutput.=&endredirection;
# }
+
+ if (($ENV{'QUERY_STRING'}) && ($target eq 'web')) {
+ $finaloutput=&afterburn($finaloutput);
+ }
+
return $finaloutput;
}
+
sub recurse {
my @innerstack = ();
@@ -191,9 +251,9 @@ sub recurse {
while ( $#pat > -1 ) {
while ($tokenpat = $pat[$#pat]->get_token) {
if (($tokenpat->[0] eq 'T') || ($tokenpat->[0] eq 'C') || ($tokenpat->[0] eq 'D') ) {
- $partstring = $tokenpat->[1];
+ if ($metamode<1) { $partstring=$tokenpat->[1]; }
} elsif ($tokenpat->[0] eq 'PI') {
- $partstring = $tokenpat->[2];
+ if ($metamode<1) { $partstring=$tokenpat->[2]; }
} elsif ($tokenpat->[0] eq 'S') {
push (@innerstack,$tokenpat->[1]);
push (@innerparstack,&parstring($tokenpat));
@@ -252,22 +312,31 @@ sub callsub {
$currentstring = &Apache::edit::tag_start($target,$token,$parstack,$parser,
$safeeval,$style);
}
- if (my $space=$Apache::lonxml::alltags{$token->[1]}) {
- #&Apache::lonxml::debug("Calling sub $sub in $space
\n");
+ my $tag=$token->[1];
+ my $space=$Apache::lonxml::alltags{$tag};
+ if (!$space) {
+ $tag=~tr/A-Z/a-z/;
+ $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 .= &$sub1($target,$token,$parstack,$parser,
$safeeval,$style);
} else {
- #&Apache::lonxml::debug("NOT Calling sub $sub in $space
\n");
- if (defined($token->[4]) && !$metamode) {
- $currentstring .= $token->[4];
- } else {
- $currentstring .= $token->[2];
+ &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];
+ }
}
}
if ($target eq 'edit' && $token->[0] eq 'E') {
- $currentstring = &Apache::edit::tag_end($target,$token,$parstack,$parser,
+ $currentstring .= &Apache::edit::tag_end($target,$token,$parstack,$parser,
$safeeval,$style);
}
use strict 'refs';
@@ -409,17 +478,65 @@ sub writeallows {
&Apache::lonnet::appenv(%httpref);
}
+#
+# Afterburner handles anchors, highlights and links
+#
+
+sub afterburn {
+ my $result=shift;
+ map {
+ my ($name, $value) = split(/=/,$_);
+ $value =~ tr/+/ /;
+ $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
+ if (($name eq 'highlight')||($name eq 'anchor')||($name eq 'link')) {
+ unless ($ENV{'form.'.$name}) {
+ $ENV{'form.'.$name}=$value;
+ }
+ }
+ } (split(/&/,$ENV{'QUERY_STRING'}));
+ if ($ENV{'form.highlight'}) {
+ map {
+ my $anchorname=$_;
+ my $matchthis=$anchorname;
+ $matchthis=~s/\_+/\\s\+/g;
+ $result=~s/($matchthis)/\$1\<\/font\>/gs;
+ } split(/\,/,$ENV{'form.highlight'});
+ }
+ if ($ENV{'form.link'}) {
+ map {
+ my ($anchorname,$linkurl)=split(/\>/,$_);
+ my $matchthis=$anchorname;
+ $matchthis=~s/\_+/\\s\+/g;
+ $result=~s/($matchthis)/\$1\<\/a\>/gs;
+ } split(/\,/,$ENV{'form.link'});
+ }
+ if ($ENV{'form.anchor'}) {
+ my $anchorname=$ENV{'form.anchor'};
+ my $matchthis=$anchorname;
+ $matchthis=~s/\_+/\\s\+/g;
+ $result=~s/($matchthis)/\$1\<\/a\>/s;
+ $result.=(<<"ENDSCRIPT");
+
+ENDSCRIPT
+ }
+ return $result;
+}
+
sub handler {
my $request=shift;
-
+
my $target='web';
+
$Apache::lonxml::debug=0;
+
if ($ENV{'browser.mathml'}) {
$request->content_type('text/xml');
} else {
$request->content_type('text/html');
}
-
+
# $request->print(<
#
@@ -429,12 +546,9 @@ sub handler {
#ENDHEADER
# &Apache::lonhomework::send_header($request);
$request->send_http_header;
-
+
return OK if $request->header_only;
- $request->print(&Apache::lontexconvert::header());
-
- $request->print(''."\n");
my $file=&Apache::lonnet::filelocation("",$request->uri);
my %mystyle;
@@ -446,16 +560,13 @@ sub handler {
} else {
$result = &Apache::lonxml::xmlparse($target,$filecontents,'',%mystyle);
}
- $request->print($result);
+ $request->print($result);
- $request->print('');
- $request->print(&Apache::lontexconvert::footer());
writeallows($request->uri);
return OK;
}
-$Apache::lonxml::debug=0;
sub debug {
if ($Apache::lonxml::debug eq 1) {
print "DEBUG:".$_[0]."
\n";
@@ -492,3 +603,5 @@ sub warning {
1;
__END__
+
+