version 1.373, 2005/05/03 06:44:56
|
version 1.387, 2005/11/10 21:28:21
|
Line 180 sub xmlend {
|
Line 180 sub xmlend {
|
$status=$Apache::inputtags::status[-1]; |
$status=$Apache::inputtags::status[-1]; |
} |
} |
my $discussion; |
my $discussion; |
&Apache::loncommon::get_unprocessed_cgi |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
($env{'query_string'},['LONCAPA_INTERNAL_no_discussion']); |
['LONCAPA_INTERNAL_no_discussion']); |
if (! exists($env{'form.LONCAPA_INTERNAL_no_discussion'}) || |
if (! exists($env{'form.LONCAPA_INTERNAL_no_discussion'}) || |
$env{'form.LONCAPA_INTERNAL_no_discussion'} ne 'true') { |
$env{'form.LONCAPA_INTERNAL_no_discussion'} ne 'true') { |
$discussion=&Apache::lonfeedback::list_discussion($mode,$status); |
$discussion=&Apache::lonfeedback::list_discussion($mode,$status); |
Line 382 sub xmlparse {
|
Line 382 sub xmlparse {
|
return $finaloutput; |
return $finaloutput; |
} |
} |
|
|
sub htmlclean { |
|
my ($raw,$full)=@_; |
|
# Take care of CRLF etc |
|
|
|
$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) { |
|
$raw=~s/\<[\/]*(body|head|html)\>//gis; |
|
} |
|
# 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 { |
sub latex_special_symbols { |
my ($string,$where)=@_; |
my ($string,$where)=@_; |
if ($where eq 'header') { |
if ($where eq 'header') { |
Line 424 sub latex_special_symbols {
|
Line 397 sub latex_special_symbols {
|
$string=~s/\\\%|\%/\\\%/g; |
$string=~s/\\\%|\%/\\\%/g; |
$string=~s/\\{|{/\\{/g; |
$string=~s/\\{|{/\\{/g; |
$string=~s/\\}|}/\\}/g; |
$string=~s/\\}|}/\\}/g; |
|
$string=~s/\\ensuremath\\{\\backslash\\}/\\ensuremath{\\backslash}/g; |
$string=~s/\\\$|\$/\\\$/g; |
$string=~s/\\\$|\$/\\\$/g; |
$string=~s/\\\_|\_/\\\_/g; |
$string=~s/\\\_|\_/\\\_/g; |
$string=~s/([^\\]|^)(\~|\^)/$1\\$2\\strut /g; |
$string=~s/([^\\]|^)(\~|\^)/$1\\$2\\strut /g; |
Line 553 sub inner_xmlparse {
|
Line 527 sub inner_xmlparse {
|
# $finaloutput.=&endredirection; |
# $finaloutput.=&endredirection; |
# } |
# } |
|
|
|
if ($target eq 'grade') { &endredirection(); } |
|
if ( $Apache::lonxml::redirection ) { |
|
&error("Unclean exit of parser, text still being redirected. This is likely due to there being missing end tags."); |
|
while ($Apache::lonxml::redirection) { |
|
$finaloutput.=&endredirection(); |
|
} |
|
} |
if (($ENV{'QUERY_STRING'}) && ($target eq 'web')) { |
if (($ENV{'QUERY_STRING'}) && ($target eq 'web')) { |
$finaloutput=&afterburn($finaloutput); |
$finaloutput=&afterburn($finaloutput); |
} |
} |
Line 662 sub setup_globals {
|
Line 642 sub setup_globals {
|
$Apache::lonxml::evaluate = 1; |
$Apache::lonxml::evaluate = 1; |
$Apache::lonxml::import = 1; |
$Apache::lonxml::import = 1; |
} elsif ($target eq 'grade') { |
} elsif ($target eq 'grade') { |
&startredirection; |
&startredirection(); #ended in inner_xmlparse on exit |
$Apache::lonxml::metamode = 0; |
$Apache::lonxml::metamode = 0; |
$Apache::lonxml::evaluate = 1; |
$Apache::lonxml::evaluate = 1; |
$Apache::lonxml::import = 1; |
$Apache::lonxml::import = 1; |
Line 691 sub setup_globals {
|
Line 671 sub setup_globals {
|
|
|
sub init_safespace { |
sub init_safespace { |
my ($target,$safeeval,$safehole,$safeinit) = @_; |
my ($target,$safeeval,$safehole,$safeinit) = @_; |
|
$safeeval->deny_only(':dangerous'); |
|
$safeeval->reval('use Math::Complex;'); |
|
$safeeval->permit_only(":default"); |
$safeeval->permit("entereval"); |
$safeeval->permit("entereval"); |
$safeeval->permit(":base_math"); |
$safeeval->permit(":base_math"); |
$safeeval->permit("sort"); |
$safeeval->permit("sort"); |
Line 748 sub init_safespace {
|
Line 731 sub init_safespace {
|
$safehole->wrap(\&Math::Cephes::stdtr ,$safeeval,'&stdtr' ); |
$safehole->wrap(\&Math::Cephes::stdtr ,$safeeval,'&stdtr' ); |
$safehole->wrap(\&Math::Cephes::stdtri,$safeeval,'&stdtri'); |
$safehole->wrap(\&Math::Cephes::stdtri,$safeeval,'&stdtri'); |
|
|
|
$safehole->wrap(\&Math::Cephes::Matrix::mat,$safeeval,'&mat'); |
|
$safehole->wrap(\&Math::Cephes::Matrix::new,$safeeval, |
|
'&Math::Cephes::Matrix::new'); |
|
$safehole->wrap(\&Math::Cephes::Matrix::coef,$safeeval, |
|
'&Math::Cephes::Matrix::coef'); |
|
$safehole->wrap(\&Math::Cephes::Matrix::clr,$safeeval, |
|
'&Math::Cephes::Matrix::clr'); |
|
$safehole->wrap(\&Math::Cephes::Matrix::add,$safeeval, |
|
'&Math::Cephes::Matrix::add'); |
|
$safehole->wrap(\&Math::Cephes::Matrix::sub,$safeeval, |
|
'&Math::Cephes::Matrix::sub'); |
|
$safehole->wrap(\&Math::Cephes::Matrix::mul,$safeeval, |
|
'&Math::Cephes::Matrix::mul'); |
|
$safehole->wrap(\&Math::Cephes::Matrix::div,$safeeval, |
|
'&Math::Cephes::Matrix::div'); |
|
$safehole->wrap(\&Math::Cephes::Matrix::inv,$safeeval, |
|
'&Math::Cephes::Matrix::inv'); |
|
$safehole->wrap(\&Math::Cephes::Matrix::transp,$safeeval, |
|
'&Math::Cephes::Matrix::transp'); |
|
$safehole->wrap(\&Math::Cephes::Matrix::simq,$safeeval, |
|
'&Math::Cephes::Matrix::simq'); |
|
$safehole->wrap(\&Math::Cephes::Matrix::mat_to_vec,$safeeval, |
|
'&Math::Cephes::Matrix::mat_to_vec'); |
|
$safehole->wrap(\&Math::Cephes::Matrix::vec_to_mat,$safeeval, |
|
'&Math::Cephes::Matrix::vec_to_mat'); |
|
$safehole->wrap(\&Math::Cephes::Matrix::check,$safeeval, |
|
'&Math::Cephes::Matrix::check'); |
|
$safehole->wrap(\&Math::Cephes::Matrix::check,$safeeval, |
|
'&Math::Cephes::Matrix::check'); |
|
|
# $safehole->wrap(\&Math::Cephes::new_fract,$safeeval,'&new_fract'); |
# $safehole->wrap(\&Math::Cephes::new_fract,$safeeval,'&new_fract'); |
# $safehole->wrap(\&Math::Cephes::radd,$safeeval,'&radd'); |
# $safehole->wrap(\&Math::Cephes::radd,$safeeval,'&radd'); |
# $safehole->wrap(\&Math::Cephes::rsub,$safeeval,'&rsub'); |
# $safehole->wrap(\&Math::Cephes::rsub,$safeeval,'&rsub'); |
Line 844 sub startredirection {
|
Line 857 sub startredirection {
|
|
|
sub endredirection { |
sub endredirection { |
if (!$Apache::lonxml::redirection) { |
if (!$Apache::lonxml::redirection) { |
&Apache::lonxml::error("Endredirection was called, before a startredirection, perhaps you have unbalanced tags. Some debuging information:".join ":",caller); |
&Apache::lonxml::error("Endredirection was called before a startredirection, perhaps you have unbalanced tags. Some debugging information:".join ":",caller); |
return ''; |
return ''; |
} |
} |
$Apache::lonxml::redirection--; |
$Apache::lonxml::redirection--; |
Line 919 sub get_all_text_unbalanced {
|
Line 932 sub get_all_text_unbalanced {
|
$tag='<'.$tag.'>'; |
$tag='<'.$tag.'>'; |
while ($token = $$pars[-1]->get_token) { |
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')||($token->[0] eq 'D')) { |
$result.=$token->[1]; |
if ($token->[0] eq 'T' && $token->[2]) { |
|
$result.='<![CDATA['.$token->[1].']]>'; |
|
} else { |
|
$result.=$token->[1]; |
|
} |
} elsif ($token->[0] eq 'PI') { |
} elsif ($token->[0] eq 'PI') { |
$result.=$token->[2]; |
$result.=$token->[2]; |
} elsif ($token->[0] eq 'S') { |
} elsif ($token->[0] eq 'S') { |
Line 985 sub get_all_text {
|
Line 1002 sub get_all_text {
|
while (($depth >=0) && ($token = $$pars[-1]->get_token)) { |
while (($depth >=0) && ($token = $$pars[-1]->get_token)) { |
#&Apache::lonxml::debug("e token:$token->[0]:$depth:$token->[1]:".$#$pars.":".$#Apache::lonxml::pwd); |
#&Apache::lonxml::debug("e token:$token->[0]:$depth:$token->[1]:".$#$pars.":".$#Apache::lonxml::pwd); |
if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) { |
if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) { |
$result.=$token->[1]; |
if ($token->[2]) { |
|
$result.='<![CDATA['.$token->[1].']]>'; |
|
} else { |
|
$result.=$token->[1]; |
|
} |
} elsif ($token->[0] eq 'PI') { |
} elsif ($token->[0] eq 'PI') { |
$result.=$token->[2]; |
$result.=$token->[2]; |
} elsif ($token->[0] eq 'S') { |
} elsif ($token->[0] eq 'S') { |
Line 1037 sub get_all_text {
|
Line 1058 sub get_all_text {
|
#&Apache::lonxml::debug("s token:$token->[0]:$depth:$token->[1]"); |
#&Apache::lonxml::debug("s token:$token->[0]:$depth:$token->[1]"); |
if (($token->[0] eq 'T')||($token->[0] eq 'C')|| |
if (($token->[0] eq 'T')||($token->[0] eq 'C')|| |
($token->[0] eq 'D')) { |
($token->[0] eq 'D')) { |
$result.=$token->[1]; |
if ($token->[2]) { |
|
$result.='<![CDATA['.$token->[1].']]>'; |
|
} else { |
|
$result.=$token->[1]; |
|
} |
} elsif ($token->[0] eq 'PI') { |
} elsif ($token->[0] eq 'PI') { |
$result.=$token->[2]; |
$result.=$token->[2]; |
} elsif ($token->[0] eq 'S') { |
} elsif ($token->[0] eq 'S') { |
Line 1090 sub parstring {
|
Line 1115 sub parstring {
|
return $temp; |
return $temp; |
} |
} |
|
|
|
sub extlink { |
|
my ($res,$exact)=@_; |
|
if (!$exact) { |
|
$res=&Apache::lonnet::hreflocation($Apache::lonxml::pwd[-1],$res); |
|
} |
|
push(@Apache::lonxml::extlinks,$res) |
|
} |
|
|
sub writeallows { |
sub writeallows { |
unless ($#extlinks>=0) { return; } |
unless ($#extlinks>=0) { return; } |
my $thisurl='/res/'.&Apache::lonnet::declutter(shift); |
my $thisurl = &Apache::lonnet::clutter(shift); |
if ($env{'httpref.'.$thisurl}) { |
if ($env{'httpref.'.$thisurl}) { |
$thisurl=$env{'httpref.'.$thisurl}; |
$thisurl=$env{'httpref.'.$thisurl}; |
} |
} |
Line 1174 sub createnewhtml {
|
Line 1207 sub createnewhtml {
|
my $title=&mt('Title of document goes here'); |
my $title=&mt('Title of document goes here'); |
my $body=&mt('Body of document goes here'); |
my $body=&mt('Body of document goes here'); |
my $filecontents=(<<SIMPLECONTENT); |
my $filecontents=(<<SIMPLECONTENT); |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml/11/DTD/xhtml11.dtd"> |
|
<html> |
<html> |
<head> |
<head> |
<title>$title</title> |
<title>$title</title> |
Line 1238 FULLPAGE
|
Line 1270 FULLPAGE
|
$xml_help=&Apache::loncommon::helpLatexCheatsheet(); |
$xml_help=&Apache::loncommon::helpLatexCheatsheet(); |
} |
} |
my $cleanbut = ''; |
my $cleanbut = ''; |
if ($filetype eq 'html') { |
|
$cleanbut='<input type="submit" name="attemptclean" value="'. |
|
&mt('Save and then attempt to clean HTML').'" />'; |
|
} |
|
my $titledisplay=&display_title(); |
my $titledisplay=&display_title(); |
my %lt=&Apache::lonlocal::texthash('st' => 'Save this', |
my %lt=&Apache::lonlocal::texthash('st' => 'Save this', |
'vi' => 'View', |
'vi' => 'View', |
Line 1329 sub handler {
|
Line 1358 sub handler {
|
# Edit action? Save file. |
# Edit action? Save file. |
# |
# |
unless ($env{'request.state'} eq 'published') { |
unless ($env{'request.state'} eq 'published') { |
if (($env{'form.savethisfile'}) || ($env{'form.attemptclean'})) { |
if ($env{'form.savethisfile'}) { |
if (&storefile($file,$env{'form.filecont'})) { |
if (&storefile($file,$env{'form.filecont'})) { |
&Apache::lonxml::info("<font COLOR=\"#0000FF\">". |
&Apache::lonxml::info("<font COLOR=\"#0000FF\">". |
&mt('Updated').": ". |
&mt('Updated').": ". |
Line 1366 ENDNOTFOUND
|
Line 1395 ENDNOTFOUND
|
} else { |
} else { |
unless ($env{'request.state'} eq 'published') { |
unless ($env{'request.state'} eq 'published') { |
if ($filecontents=~/BEGIN LON-CAPA Internal/) { |
if ($filecontents=~/BEGIN LON-CAPA Internal/) { |
&Apache::lonxml::error(&mt('This file appears to be a rendering of a Lon-CAPA resource. If this is correct, this resource will act very oddly and incorrectly.')); |
&Apache::lonxml::error(&mt('This file appears to be a rendering of a LON-CAPA resource. If this is correct, this resource will act very oddly and incorrectly.')); |
} |
|
|
|
if ($env{'form.attemptclean'}) { |
|
$filecontents=&htmlclean($filecontents,1); |
|
} |
} |
# |
# |
# we are in construction space, see if edit mode forced |
# we are in construction space, see if edit mode forced |
&Apache::loncommon::get_unprocessed_cgi |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
($ENV{'QUERY_STRING'},['editmode']); |
['editmode']); |
} |
} |
if (!$env{'form.editmode'} || $env{'form.viewmode'}) { |
if (!$env{'form.editmode'} || $env{'form.viewmode'}) { |
$result = &Apache::lonxml::xmlparse($request,$target,$filecontents, |
$result = &Apache::lonxml::xmlparse($request,$target,$filecontents, |
'',%mystyle); |
'',%mystyle); |
undef($Apache::lonhomework::parsing_a_task); |
undef($Apache::lonhomework::parsing_a_task); |
|
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
|
['rawmode']); |
|
if ($env{'rawmode'}) { $result = $filecontents; } |
} |
} |
} |
} |
|
|
Line 1465 sub error {
|
Line 1493 sub error {
|
&Apache::lonmsg::author_res_msg($env{'request.filename'},join('<br />',@_)); |
&Apache::lonmsg::author_res_msg($env{'request.filename'},join('<br />',@_)); |
#notify course |
#notify course |
if ( $symb && $env{'request.course.id'} ) { |
if ( $symb && $env{'request.course.id'} ) { |
|
my $cnum=$env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my $cdom=$env{'course.'.$env{'request.course.id'}.'.domain'}; |
my (undef,%users)=&Apache::lonfeedback::decide_receiver(undef,0,1,1,1); |
my (undef,%users)=&Apache::lonfeedback::decide_receiver(undef,0,1,1,1); |
my $declutter=&Apache::lonnet::declutter($env{'request.filename'}); |
my $declutter=&Apache::lonnet::declutter($env{'request.filename'}); |
my @userlist; |
my @userlist; |
foreach (keys %users) { |
foreach (keys %users) { |
my ($user,$domain) = split(/:/, $_); |
my ($user,$domain) = split(/:/, $_); |
push(@userlist,"$user\@$domain"); |
push(@userlist,"$user\@$domain"); |
&Apache::lonmsg::user_normal_msg($user,$domain, |
my $key=$declutter.'_'.$user.'_'.$domain; |
|
my %lastnotified=&Apache::lonnet::get('nohist_xmlerrornotifications', |
|
[$key], |
|
$cdom,$cnum); |
|
my $now=time; |
|
if ($now-$lastnotified{$key}>86400) { |
|
&Apache::lonmsg::user_normal_msg($user,$domain, |
"Error [$declutter]",join('<br />',@_)); |
"Error [$declutter]",join('<br />',@_)); |
|
&Apache::lonnet::put('nohist_xmlerrornotifications', |
|
{$key => $now}, |
|
$cdom,$cnum); |
|
} |
} |
} |
if ($env{'request.role.adv'}) { |
if ($env{'request.role.adv'}) { |
$errormsg=&mt("An error occured while processing this resource. The course personnel ([_1]) and the author have been notified.",join(', ',@userlist)); |
$errormsg=&mt("An error occured while processing this resource. The course personnel ([_1]) and the author have been notified.",join(', ',@userlist)); |
Line 1489 sub warning {
|
Line 1529 sub warning {
|
|
|
if ($env{'form.grade_target'} ne 'tex') { |
if ($env{'form.grade_target'} ne 'tex') { |
if ( &show_error_warn_msg() ) { |
if ( &show_error_warn_msg() ) { |
my $request=$Apache::lonxml::request; |
|
if (!$request) { $request=Apache->request; } |
|
push(@Apache::lonxml::warning_messages, |
push(@Apache::lonxml::warning_messages, |
$Apache::lonxml::warnings_error_header. |
$Apache::lonxml::warnings_error_header. |
"<b>W</b>ARNING<b>:</b>".join('<br />',@_)."<br />\n"); |
"<b>W</b>ARNING<b>:</b>".join('<br />',@_)."<br />\n"); |