--- loncom/xml/lonxml.pm 2003/05/21 20:41:55 1.255
+++ loncom/xml/lonxml.pm 2003/06/20 14:45:48 1.265
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# XML Parser Module
#
-# $Id: lonxml.pm,v 1.255 2003/05/21 20:41:55 sakharuk Exp $
+# $Id: lonxml.pm,v 1.265 2003/06/20 14:45:48 bowersj2 Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -151,6 +151,10 @@ $Apache::lonxml::counter_changed=0;
#internal check on whether to look at style defs
$Apache::lonxml::usestyle=1;
+#locations used to store the parameter string for style substitutions
+$Apache::lonxml::style_values='';
+$Apache::lonxml::style_end_values='';
+
sub xmlbegin {
my $output='';
if ($ENV{'browser.mathml'}) {
@@ -382,7 +386,7 @@ sub fontsettings() {
if (($ENV{'browser.os'} eq 'mac') && (!$ENV{'browser.mathml'})) {
$headerstring.=
'';
- } elsif (!$ENV{'browser.mathml'}) {
+ } elsif (!$ENV{'browser.mathml'} && $ENV{'browser.unicode'}) {
$headerstring.=
'';
}
@@ -494,9 +498,10 @@ sub inner_xmlparse {
my $finaloutput = '';
my $result;
my $token;
+ my $dontpop=0;
while ( $#$pars > -1 ) {
while ($token = $$pars['-1']->get_token) {
- if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {
+ if (($token->[0] eq 'T') || ($token->[0] eq 'C') ) {
if ($metamode<1) {
my $text=$token->[1];
if ($token->[0] eq 'C' && $target eq 'tex') {
@@ -505,8 +510,13 @@ sub inner_xmlparse {
}
$result.=$text;
}
+ } elsif (($token->[0] eq 'D')) {
+ if ($metamode<1 && $target eq 'web') {
+ my $text=$token->[1];
+ $result.=$text;
+ }
} elsif ($token->[0] eq 'PI') {
- if ($metamode<1) {
+ if ($metamode<1 && $target eq 'web') {
$result=$token->[2];
}
} elsif ($token->[0] eq 'S') {
@@ -520,57 +530,51 @@ sub inner_xmlparse {
$Apache::lonxml::usestyle=0;
my $string=$$style_for_target{$token->[1]}.
'';
-##### LETS TRY VARIABLE INTERPOLATION (it may be stupid but at least it works)
- my %localhash=%{$token->[2]};
- foreach my $localkey (keys %localhash) {
- $string=~s/\$$localkey/$localhash{$localkey}/g;
- }
-#####
&Apache::lonxml::newparser($pars,\$string);
+ $Apache::lonxml::style_values=$$parstack[-1];
+ $Apache::lonxml::style_end_values=$$parstack[-1];
} 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)) {
- my $lasttag=$$stack[-1];
- if ($token->[1] =~ /^$lasttag$/i) {
- &Apache::lonxml::warning('Using tag </'.$token->[1].'> on line '.$token->[3].' as end tag to <'.$$stack[-1].'>');
- last;
- } else {
- &Apache::lonxml::warning('Found tag </'.$token->[1].'> on line '.$token->[3].' when looking for </'.$$stack[-1].'> in file');
- &end_tag($stack,$parstack,$token);
- }
- }
-
if ($Apache::lonxml::usestyle &&
exists($$style_for_target{'/'."$token->[1]"})) {
$Apache::lonxml::usestyle=0;
my $string=$$style_for_target{'/'.$token->[1]}.
- '';
-##### LETS TRY VARIABLE INTERPOLATION (it may be stupid but at least it works)
- my @localarray = split /;/, $$parstack[-1];
- foreach my $localelement (@localarray) {
- $localelement=~/my\s+\$([^=]+)=\"(.*)\"$/;
- my ($whatchange,$tochange) = ($1,$2);
- $string=~s/\$$whatchange/$tochange/g;
- }
-#####
+ '';
&Apache::lonxml::newparser($pars,\$string);
+ $Apache::lonxml::style_values=$Apache::lonxml::style_end_values;
+ $Apache::lonxml::style_end_values='';
+ $dontpop=1;
} else {
- $result = &callsub("end_$token->[1]", $target, $token, $stack,
- $parstack, $pars,$safeeval, $style_for_target);
+ #clear out any tags that didn't end
+ while ($token->[1] ne $$stack['-1'] && ($#$stack > -1)) {
+ my $lasttag=$$stack[-1];
+ if ($token->[1] =~ /^$lasttag$/i) {
+ &Apache::lonxml::warning('Using tag </'.$token->[1].'> on line '.$token->[3].' as end tag to <'.$$stack[-1].'>');
+ last;
+ } else {
+ &Apache::lonxml::warning('Found tag </'.$token->[1].'> on line '.$token->[3].' when looking for </'.$$stack[-1].'> in file');
+ &end_tag($stack,$parstack,$token);
+ }
+ }
+ $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 "") {
+ my $extras;
+ if (!$Apache::lonxml::usestyle) {
+ $extras=$Apache::lonxml::style_values;
+ }
if ( $#$parstack > -1 ) {
- $result=&Apache::run::evaluate($result,$safeeval,$$parstack[-1]);
+ $result=&Apache::run::evaluate($result,$safeeval,$extras.$$parstack[-1]);
} else {
- $result= &Apache::run::evaluate($result,$safeeval,'');
+ $result= &Apache::run::evaluate($result,$safeeval,$extras);
}
}
if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {
@@ -591,9 +595,10 @@ sub inner_xmlparse {
}
$result = '';
- if ($token->[0] eq 'E') {
+ if ($token->[0] eq 'E' && !$dontpop) {
&end_tag($stack,$parstack,$token);
}
+ $dontpop=0;
}
if ($#$pars > -1) {
pop @$pars;
@@ -1031,8 +1036,6 @@ sub newparser {
} else {
push (@Apache::lonxml::pwd, $dir);
}
-# &Apache::lonxml::debug("pwd:$#Apache::lonxml::pwd");
-# &Apache::lonxml::debug("pwd:$Apache::lonxml::pwd[$#Apache::lonxml::pwd]");
}
sub parstring {
@@ -1136,13 +1139,7 @@ sub inserteditinfo {
my ($result,$filecontents)=@_;
$filecontents = &HTML::Entities::encode($filecontents);
# my $editheader='Edit below
';
- my $xml_help = ''.
- &Apache::loncommon::help_open_topic("Greek_Symbols",'Greek Symbols',
- undef,undef,600)
- .' | '.
- &Apache::loncommon::help_open_topic("Other_Symbols",'Other Symbols',
- undef,undef,600)
- .' |
';
+ my $xml_help = Apache::loncommon::helpLatexCheatsheet();
my $titledisplay=&display_title();
my $buttons=(<content_type('text/xml');
@@ -1246,6 +1243,10 @@ ENDNOTFOUND
if ($ENV{'form.attemptclean'}) {
$filecontents=&htmlclean($filecontents,1);
}
+#
+# we are in construction space, see if edit mode forced
+ &Apache::loncommon::get_unprocessed_cgi
+ ($ENV{'QUERY_STRING'},['editmode']);
}
if (!$ENV{'form.editmode'} || $ENV{'form.viewmode'}) {
$result = &Apache::lonxml::xmlparse($request,$target,$filecontents,
@@ -1322,8 +1323,11 @@ sub error {
sub warning {
$warningcount++;
- if ($ENV{'request.state'} eq 'construct') {
- print "WARNING:".join('
',@_)."
\n";
+
+ if ($ENV{'form.grade_target'} ne 'tex') {
+ if ($ENV{'request.state'} eq 'construct' || $Apache::lonxml::debug) {
+ print "WARNING:".join('
',@_)."
\n";
+ }
}
}
@@ -1432,6 +1436,7 @@ sub description {
# calls to lonnet functions for this setup.
# - looks for form.grade_ parameters
sub whichuser {
+ my ($passedsymb)=@_;
my ($symb,$courseid,$domain,$name,$publicuser);
if (defined($ENV{'form.grade_symb'})) {
my $tmp_courseid=$ENV{'form.grade_courseid'};
@@ -1443,7 +1448,11 @@ sub whichuser {
$name=$ENV{'form.grade_username'};
}
} else {
- $symb=&Apache::lonnet::symbread();
+ if (!$passedsymb) {
+ $symb=&Apache::lonnet::symbread();
+ } else {
+ $symb=$passedsymb;
+ }
$courseid=$ENV{'request.course.id'};
$domain=$ENV{'user.domain'};
$name=$ENV{'user.name'};