--- loncom/xml/lonxml.pm 2004/11/30 22:57:16 1.348
+++ loncom/xml/lonxml.pm 2005/03/10 19:10:31 1.362
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# XML Parser Module
#
-# $Id: lonxml.pm,v 1.348 2004/11/30 22:57:16 albertel Exp $
+# $Id: lonxml.pm,v 1.362 2005/03/10 19:10:31 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -149,20 +149,25 @@ $Apache::lonxml::post_evaluate=1;
$Apache::lonxml::warnings_error_header='';
sub xmlbegin {
- my $output='';
- @htmlareafields=();
- if ($ENV{'browser.mathml'}) {
- $output=''
- .''
- .']>'
+ my ($style)=@_;
+ my $output='';
+ @htmlareafields=();
+ if ($ENV{'browser.mathml'}) {
+ $output=''
+ #.''."\n"
+# .'] >'
+ .''
.'';
- } else {
- $output='
-';
- }
- return $output;
+ .'xmlns="http://www.w3.org/1999/xhtml">';
+ } else {
+ $output='';
+ }
+ if ($style eq 'encode') {
+ $output=&HTML::Entities::encode($output,'<>&"');
+ }
+ return $output;
}
sub xmlend {
@@ -173,13 +178,19 @@ sub xmlend {
$mode='problem';
$status=$Apache::inputtags::status[-1];
}
- my $discussion=&Apache::lonfeedback::list_discussion($mode,$status);
+ my $discussion;
+ &Apache::loncommon::get_unprocessed_cgi
+ ($ENV{'query_string'},['LONCAPA_INTERNAL_no_discussion']);
+ if (! exists($ENV{'form.LONCAPA_INTERNAL_no_discussion'}) ||
+ $ENV{'form.LONCAPA_INTERNAL_no_discussion'} ne 'true') {
+ $discussion=&Apache::lonfeedback::list_discussion($mode,$status);
+ }
if ($target eq 'tex') {
$discussion.='\keephidden{ENDOFPROBLEM}\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\end{document}';
&Apache::lonxml::newparser($parser,\$discussion,'');
return '';
} else {
- return $discussion.'';
+ return $discussion.&Apache::loncommon::endbodytag();
}
}
@@ -284,7 +295,7 @@ sub printtokenheader {
}
}
-sub fontsettings() {
+sub fontsettings {
my $headerstring='';
if (($ENV{'browser.os'} eq 'mac') && (!$ENV{'browser.mathml'})) {
$headerstring.=
@@ -353,8 +364,8 @@ sub xmlparse {
my @stack = ();
my @parstack = ();
- &initdepth;
-
+ &initdepth();
+ &init_alarm();
my $finaloutput = &inner_xmlparse($target,\@stack,\@parstack,\@pars,
$safeeval,\%style_for_target);
@@ -363,28 +374,37 @@ sub xmlparse {
}
&do_registered_ssi();
if ($Apache::lonxml::counter_changed) { &store_counter() }
+ if ($ENV{'form.return_only_error_and_warning_counts'}) {
+ return "$errorcount:$warningcount";
+ }
return $finaloutput;
}
sub htmlclean {
my ($raw,$full)=@_;
+# Take care of CRLF etc
- my $tree = HTML::TreeBuilder->new;
- $tree->ignore_unknown(0);
-
- $tree->parse($raw);
-
- my $output= $tree->as_HTML(undef,' ');
-
- $output=~s/\<(br|hr|img|meta|allow)(.*?)\>/\<$1$2 \/\>/gis;
- $output=~s/\<\/(br|hr|img|meta|allow)\>//gis;
+ $raw=~s/\r\f/\n/gs; $raw=~s/\f\r/\n/gs;
+ $raw=~s/\r\n/\n/gs; $raw=~s/\n\r/\n/gs;
+ $raw=~s/\f/\n/gs; $raw=~s/\r/\n/gs;
+ $raw=~s/\&\#10\;/\n/gs; $raw=~s/\&\#13\;/\n/gs;
+
+# Generate empty tags, remove wrong end tags
+ $raw=~s/\<(br|hr|img|meta|allow|basefont)([^\>\/]*?)\>/\<$1$2 \/\>/gis;
+ $raw=~s/\<\/(br|hr|img|meta|allow|basefont)\>//gis;
unless ($full) {
- $output=~s/\<[\/]*(body|head|html)\>//gis;
+ $raw=~s/\<[\/]*(body|head|html)\>//gis;
}
-
- $tree = $tree->delete;
-
- return $output;
+# Make standard tags lowercase
+ foreach ('html','body','head','meta','h1','h2','h3','h4','b','i','m',
+ 'table','tr','td','th','p','br','hr','img','embed','font',
+ 'a','strong','center','title','basefont','li','ol','ul',
+ 'input','select','form','option','script','pre') {
+ $raw=~s/\<$_\s*\>/\<$_\>/gis;
+ $raw=~s/\<\/$_\s*\>/<\/$_\>/gis;
+ $raw=~s/\<$_\s([^\>]*)\>/<$_ $1\>/gis;
+ }
+ return $raw;
}
sub latex_special_symbols {
@@ -781,6 +801,28 @@ sub default_homework_load {
}
}
+{
+ my $alarm_depth;
+ sub init_alarm {
+ alarm(0);
+ $alarm_depth=0;
+ }
+
+ sub start_alarm {
+ if ($alarm_depth<1) {
+ my $old=alarm($Apache::lonnet::perlvar{'lonScriptTimeout'});
+ if ($old) {
+ &Apache::lonxml::error("Cancelled an alarm of $old, this shouldn't occur.");
+ }
+ }
+ $alarm_depth++;
+ }
+
+ sub end_alarm {
+ $alarm_depth--;
+ if ($alarm_depth<1) { alarm(0); }
+ }
+}
my $metamode_was;
sub startredirection {
if (!$Apache::lonxml::redirection) {
@@ -1261,6 +1303,8 @@ sub handler {
&Apache::loncommon::content_type($request,'text/html');
}
&Apache::loncommon::no_cache($request);
+ $request->set_last_modified(&Apache::lonnet::metadata($request->uri,
+ 'lastrevisiondate'));
$request->send_http_header;
return OK if $request->header_only;
@@ -1338,7 +1382,11 @@ ENDNOTFOUND
if ($ENV{'form.editmode'} && (!($ENV{'form.viewmode'}))) {
my $displayfile=$request->uri;
$displayfile=~s/^\/[^\/]*//;
- $result='
'.
+ my $bodytag='';
+ if ($ENV{'environment.remote'} eq 'off') {
+ $bodytag=&Apache::loncommon::bodytag();
+ }
+ $result=''.$bodytag.
&Apache::lonxml::message_location().''.
$displayfile.
'
';
@@ -1378,6 +1426,10 @@ sub debug {
}
sub show_error_warn_msg {
+ if ($ENV{'request.filename'} eq '/home/httpd/html/res/lib/templates/simpleproblem.problem' &&
+ &Apache::lonnet::allowed('mdc',$ENV{'request.course.id'})) {
+ return 1;
+ }
return (($Apache::lonxml::debug eq 1) ||
($ENV{'request.state'} eq 'construct') ||
($Apache::lonhomework::browse eq 'F'
@@ -1592,35 +1644,36 @@ sub whichuser {
my ($passedsymb)=@_;
my ($symb,$courseid,$domain,$name,$publicuser);
if (defined($ENV{'form.grade_symb'})) {
- my $tmp_courseid=$ENV{'form.grade_courseid'};
- my $allowed=&Apache::lonnet::allowed('vgr',$tmp_courseid);
- if (!$allowed &&
- exists($ENV{'request.course.sec'}) &&
- $ENV{'request.course.sec'} !~ /^\s*$/) {
- $allowed=&Apache::lonnet::allowed('vgr',$ENV{'form.grade_courseid'}.
- '/'.$ENV{'request.course.sec'});
- }
- if ($allowed) {
- $symb=$ENV{'form.grade_symb'};
- $courseid=$ENV{'form.grade_courseid'};
- $domain=$ENV{'form.grade_domain'};
- $name=$ENV{'form.grade_username'};
- }
- } else {
- if (!$passedsymb) {
- $symb=&Apache::lonnet::symbread();
- } else {
- $symb=$passedsymb;
+ my ($tmp_courseid)=
+ &Apache::loncommon::get_env_multiple('form.grade_courseid');
+ my $allowed=&Apache::lonnet::allowed('vgr',$tmp_courseid);
+ if (!$allowed &&
+ exists($ENV{'request.course.sec'}) &&
+ $ENV{'request.course.sec'} !~ /^\s*$/) {
+ $allowed=&Apache::lonnet::allowed('vgr',$tmp_courseid.
+ '/'.$ENV{'request.course.sec'});
}
- $courseid=$ENV{'request.course.id'};
- $domain=$ENV{'user.domain'};
- $name=$ENV{'user.name'};
- if ($name eq 'public' && $domain eq 'public') {
- if (!defined($ENV{'form.username'})) {
- $ENV{'form.username'}.=time.rand(10000000);
- }
- $name.=$ENV{'form.username'};
+ if ($allowed) {
+ ($symb)=&Apache::loncommon::get_env_multiple('form.grade_symb');
+ $courseid=$tmp_courseid;
+ ($domain)=&Apache::loncommon::get_env_multiple('form.grade_domain');
+ ($name)=&Apache::loncommon::get_env_multiple('form.grade_username');
+ return ($symb,$courseid,$domain,$name,$publicuser);
+ }
+ }
+ if (!$passedsymb) {
+ $symb=&Apache::lonnet::symbread();
+ } else {
+ $symb=$passedsymb;
+ }
+ $courseid=$ENV{'request.course.id'};
+ $domain=$ENV{'user.domain'};
+ $name=$ENV{'user.name'};
+ if ($name eq 'public' && $domain eq 'public') {
+ if (!defined($ENV{'form.username'})) {
+ $ENV{'form.username'}.=time.rand(10000000);
}
+ $name.=$ENV{'form.username'};
}
return ($symb,$courseid,$domain,$name,$publicuser);
}