--- loncom/xml/lonxml.pm 2003/09/19 20:29:29 1.279
+++ loncom/xml/lonxml.pm 2003/11/20 21:43:24 1.293
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# XML Parser Module
#
-# $Id: lonxml.pm,v 1.279 2003/09/19 20:29:29 albertel Exp $
+# $Id: lonxml.pm,v 1.293 2003/11/20 21:43:24 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -96,6 +96,7 @@ use Apache::style();
use Apache::run();
use Apache::londefdef();
use Apache::scripttag();
+use Apache::languagetags();
use Apache::edit();
use Apache::inputtags();
use Apache::outputtags();
@@ -105,6 +106,7 @@ use Apache::loncommon();
use Apache::lonfeedback();
use Apache::lonmsg();
use Apache::loncacc();
+use Apache::lonlocal;
#================================================== Main subroutine: xmlparse
#debugging control, to turn on debugging modify the correct handler
@@ -159,6 +161,12 @@ $Apache::lonxml::usestyle=1;
$Apache::lonxml::style_values='';
$Apache::lonxml::style_end_values='';
+#array of ssi calls that need to occur after we are done parsing
+@Apache::lonxml::ssi_info=();
+
+#should we do the postag variable interpolation
+$Apache::lonxml::post_evaluate=1;
+
sub xmlbegin {
my $output='';
if ($ENV{'browser.mathml'}) {
@@ -273,13 +281,13 @@ sub printtokenheader {
my %idhash=&Apache::lonnet::idrget($tudom,($tuname));
return
''.
- 'Checked out for '.$plainname.
- ' User: '.$tuname.' at '.$tudom.
- ' ID: '.$idhash{$tuname}.
- ' CourseID: '.$tcrsid.
- ' Course: '.$ENV{'course.'.$tcrsid.'.description'}.
- ' DocID: '.$token.
- ' Time: '.localtime().'
';
+ &mt('Checked out for').' '.$plainname.
+ ' '.&mt('User').': '.$tuname.' at '.$tudom.
+ ' '.&mt('ID').': '.$idhash{$tuname}.
+ ' '.&mt('CourseID').': '.$tcrsid.
+ ' '.&mt('Course').': '.$ENV{'course.'.$tcrsid.'.description'}.
+ ' '.&mt('DocID').': '.$token.
+ ' '.&mt('Time').': '.&Apache::lonlocal::locallocaltime().'';
} else {
return $token;
}
@@ -312,6 +320,7 @@ sub xmlparse {
&Apache::inputtags::initialize_inputtags();
&Apache::outputtags::initialize_outputtags();
&Apache::edit::initialize_edit();
+ &Apache::londefdef::initialize_londefdef();
#
# do we have a course style file?
@@ -328,6 +337,13 @@ sub xmlparse {
&Apache::style::styleparser($target,$styletext));
}
}
+ } elsif ($ENV{'construct.style'} && ($ENV{'request.state'} eq 'construct')) {
+ my $location=&Apache::lonnet::filelocation('',$ENV{'construct.style'});
+ my $styletext=&Apache::lonnet::getfile($location);
+ if ($styletext ne '-1') {
+ %style_for_target = (%style_for_target,
+ &Apache::style::styleparser($target,$styletext));
+ }
}
#&printalltags();
my @pars = ();
@@ -352,6 +368,7 @@ sub xmlparse {
if ($ENV{'request.uri'}) {
&writeallows($ENV{'request.uri'});
}
+ &do_registered_ssi();
if ($Apache::lonxml::counter_changed) { &store_counter() }
return $finaloutput;
}
@@ -385,7 +402,7 @@ sub latex_special_symbols {
$string =~ s/_/ /g;
} else {
$string=~s/\\ /\\char92 /g;
- $string=~s/\^/\\char94 /g;
+ $string=~s/\^/\\\^ /g;
$string=~s/\~/\\char126 /g;
$string=~s/(&[^A-Za-z\#])/\\$1/g;
$string=~s/([^&])\#/$1\\#/g;
@@ -472,7 +489,7 @@ sub inner_xmlparse {
&Apache::lonxml::error("Unknown token event :$token->[0]:$token->[1]:");
}
#evaluate variable refs in result
- if ($result ne "") {
+ if ($Apache::lonxml::post_evaluate &&$result ne "") {
my $extras;
if (!$Apache::lonxml::usestyle) {
$extras=$Apache::lonxml::style_values;
@@ -483,6 +500,8 @@ sub inner_xmlparse {
$result= &Apache::run::evaluate($result,$safeeval,$extras);
}
}
+ $Apache::lonxml::post_evaluate=1;
+
if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) {
#Style file definitions should be correct
if ($target eq 'tex' && ($Apache::lonxml::usestyle)) {
@@ -602,6 +621,8 @@ sub setup_globals {
&init_counter();
@Apache::lonxml::pwd=();
@Apache::lonxml::extlinks=();
+ @Apache::lonxml::ssi_info=();
+ $Apache::lonxml::post_evaluate=1;
if ($target eq 'meta') {
$Apache::lonxml::redirection = 0;
$Apache::lonxml::metamode = 1;
@@ -645,6 +666,7 @@ sub init_safespace {
$safeeval->permit("entereval");
$safeeval->permit(":base_math");
$safeeval->permit("sort");
+ $safeeval->permit("time");
$safeeval->deny(":base_io");
$safehole->wrap(\&Apache::scripttag::xmlparse,$safeeval,'&xmlparse');
$safehole->wrap(\&Apache::outputtags::multipart,$safeeval,'&multipart');
@@ -792,7 +814,7 @@ sub decreasedepth {
$Apache::lonxml::olddepth=$Apache::lonxml::depth+1;
}
if ( $Apache::lonxml::depth < -1) {
- &Apache::lonxml::warning("Missing tags, unable to properly run file.");
+ &Apache::lonxml::warning(&mt("Missing tags, unable to properly run file."));
$Apache::lonxml::depth='-1';
}
my $curdepth=join('_',@Apache::lonxml::depthcounter);
@@ -855,17 +877,13 @@ sub store_counter {
sub get_all_text {
my($tag,$pars,$style)= @_;
- &Apache::lonxml::debug("Got a ".ref($pars));
my $gotfullstack=1;
if (ref($pars) ne 'ARRAY') {
$gotfullstack=0;
$pars=[$pars];
}
- &Apache::lonxml::debug("Got a ".ref($style));
if (ref($style) ne 'HASH') {
$style={};
- } else {
- &Apache::lonhomework::showhash(%$style);
}
my $depth=0;
my $token;
@@ -889,7 +907,7 @@ sub get_all_text {
} elsif ($token->[0] eq 'E') {
if ( $token->[1] =~ /^$tag$/i) { $depth--; }
#skip sending back the last end tag
- if ($depth == 0 && exists($$style{'/'.$token->[1]})) {
+ if ($depth == 0 && exists($$style{'/'.$token->[1]}) && $Apache::lonxml::usestyle) {
my $string=
''.
$$style{'/'.$token->[1]}.
@@ -974,6 +992,7 @@ sub parstring {
my $val=$token->[2]->{$_};
$val =~ s/([\%\@\\\"\'])/\\$1/g;
#if ($val =~ m/^[\%\@]/) { $val="\\".$val; }
+ if ($val !~ m/^\s*\$[a-z_]/i) { $val =~ s/\$/\\\$/g; }
$temp .= "my \$$_=\"$val\";";
}
}
@@ -997,6 +1016,19 @@ sub writeallows {
&Apache::lonnet::appenv(%httpref);
}
+sub register_ssi {
+ my ($url,%form)=@_;
+ push (@Apache::lonxml::ssi_info,{'url'=>$url,'form'=>\%form});
+ return '';
+}
+
+sub do_registered_ssi {
+ foreach my $info (@Apache::lonxml::ssi_info) {
+ my %form=%{ $info->{'form'}};
+ my $url=$info->{'url'};
+ &Apache::lonnet::ssi($url,%form);
+ }
+}
#
# Afterburner handles anchors, highlights and links
#
@@ -1036,6 +1068,7 @@ ENDSCRIPT
sub storefile {
my ($file,$contents)=@_;
+ &Apache::lonnet::correct_line_ends(\$contents);
if (my $fh=Apache::File->new('>'.$file)) {
print $fh $contents;
$fh->close();
@@ -1087,21 +1120,24 @@ sub inserteditinfo {
}
my $cleanbut = '';
if ($filetype eq 'html') {
- $cleanbut='';
+ $cleanbut='';
}
my $titledisplay=&display_title();
+ my %lt=&Apache::lonlocal::texthash('st' => 'Save this',
+ 'vi' => 'View',
+ 'ed' => 'Edit');
my $buttons=(<
-
+
+
BUTTONS
my $editfooter=(<