--- loncom/xml/lonxml.pm 2003/05/21 20:41:55 1.255
+++ loncom/xml/lonxml.pm 2003/08/06 14:30:01 1.268
@@ -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.268 2003/08/06 14:30:01 bowersj2 Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -70,6 +70,7 @@ use Math::Cephes();
use Math::Random();
use Opcode();
+
sub register {
my ($space,@taglist) = @_;
foreach my $temptag (@taglist) {
@@ -95,6 +96,8 @@ use Apache::run();
use Apache::londefdef();
use Apache::scripttag();
use Apache::edit();
+use Apache::inputtags();
+use Apache::outputtags();
use Apache::lonnet();
use Apache::File();
use Apache::loncommon();
@@ -151,6 +154,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 +389,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.=
'';
}
@@ -485,6 +492,7 @@ sub latex_special_symbols {
$current_token=~s/(>|<)/\$$1\$/g; #more or less
if ($current_token=~m/\d%/) {$current_token =~ s/(\d)%/$1\\%/g;} #percent after digit
if ($current_token=~m/\s%/) {$current_token =~ s/(\s)%/$1\\%/g;} #persent after space
+ if ($current_token eq '%.') {$current_token = '\%.';} #persent at the end of statement
}
return $current_token;
}
@@ -494,9 +502,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 +514,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 +534,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 +599,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 +1040,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 {
@@ -1043,7 +1050,7 @@ sub parstring {
my $val=$token->[2]->{$_};
$val =~ s/([\%\@\\\"\'])/\\$1/g;
#if ($val =~ m/^[\%\@]/) { $val="\\".$val; }
- $temp .= "my \$$_=\"$val\";"
+ $temp .= "my \$$_=\"$val\";";
}
}
return $temp;
@@ -1136,13 +1143,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 +1247,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 +1327,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";
+ }
}
}
@@ -1385,7 +1393,7 @@ sub register_insert {
my $line = $data[$i];
if ( $line =~ /^\#/ || $line =~ /^\s*\n/) { next; }
if ( $line =~ /TABLE/ ) { last; }
- my ($tag,$descrip,$color,$function,$show) = split(/,/, $line);
+ my ($tag,$descrip,$color,$function,$show,$helpfile,$helpdesc) = split(/,/, $line);
if ($tag) {
$insertlist{"$tagnum.tag"} = $tag;
$insertlist{"$tagnum.description"} = $descrip;
@@ -1393,6 +1401,8 @@ sub register_insert {
$insertlist{"$tagnum.function"} = $function;
if (!defined($show)) { $show='yes'; }
$insertlist{"$tagnum.show"}= $show;
+ $insertlist{"$tagnum.helpfile"} = $helpfile;
+ $insertlist{"$tagnum.helpdesc"} = $helpdesc;
$insertlist{"$tag.num"}=$tagnum;
$tagnum++;
}
@@ -1427,11 +1437,26 @@ sub description {
return $insertlist{$tagnum.'.description'};
}
+# Returns a list containing the help file, and the description
+sub helpinfo {
+ my ($token)=@_;
+ 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.'.helpfile'}, $insertlist{$tagnum.'.helpdesc'});
+}
+
# ----------------------------------------------------------------- whichuser
# returns a list of $symb, $courseid, $domain, $name that is correct for
# 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 +1468,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'};