version 1.276, 2003/09/14 23:57:18
|
version 1.302, 2004/02/19 19:29:40
|
Line 96 use Apache::style();
|
Line 96 use Apache::style();
|
use Apache::run(); |
use Apache::run(); |
use Apache::londefdef(); |
use Apache::londefdef(); |
use Apache::scripttag(); |
use Apache::scripttag(); |
|
use Apache::languagetags(); |
use Apache::edit(); |
use Apache::edit(); |
use Apache::inputtags(); |
use Apache::inputtags(); |
use Apache::outputtags(); |
use Apache::outputtags(); |
Line 105 use Apache::loncommon();
|
Line 106 use Apache::loncommon();
|
use Apache::lonfeedback(); |
use Apache::lonfeedback(); |
use Apache::lonmsg(); |
use Apache::lonmsg(); |
use Apache::loncacc(); |
use Apache::loncacc(); |
|
use Apache::lonlocal; |
|
|
#================================================== Main subroutine: xmlparse |
#================================================== Main subroutine: xmlparse |
#debugging control, to turn on debugging modify the correct handler |
#debugging control, to turn on debugging modify the correct handler |
Line 159 $Apache::lonxml::usestyle=1;
|
Line 161 $Apache::lonxml::usestyle=1;
|
$Apache::lonxml::style_values=''; |
$Apache::lonxml::style_values=''; |
$Apache::lonxml::style_end_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; |
|
|
|
#a header message to emit in the case of any generated warning or errors |
|
$Apache::lonxml::warnings_error_header=''; |
|
|
sub xmlbegin { |
sub xmlbegin { |
my $output=''; |
my $output=''; |
if ($ENV{'browser.mathml'}) { |
if ($ENV{'browser.mathml'}) { |
Line 175 sub xmlbegin {
|
Line 186 sub xmlbegin {
|
} |
} |
|
|
sub xmlend { |
sub xmlend { |
my ($discussiononly,$symb)=@_; |
my $mode='xml'; |
my $discussion=''; |
my $status='OPEN'; |
if ($ENV{'request.course.id'}) { |
if ($Apache::lonhomework::parsing_a_problem) { |
my $crs='/'.$ENV{'request.course.id'}; |
$mode='problem'; |
if ($ENV{'request.course.sec'}) { |
$status=$Apache::inputtags::status[-1]; |
$crs.='_'.$ENV{'request.course.sec'}; |
|
} |
|
$crs=~s/\_/\//g; |
|
$discussion=&Apache::lonfeedback::list_discussion |
|
($crs,$symb,$discussiononly); |
|
} |
} |
return $discussion.($discussiononly?'':'</html>'); |
return &Apache::lonfeedback::list_discussion($mode,$status).'</html>'; |
} |
} |
|
|
sub tokeninputfield { |
sub tokeninputfield { |
Line 278 sub printtokenheader {
|
Line 284 sub printtokenheader {
|
my %idhash=&Apache::lonnet::idrget($tudom,($tuname)); |
my %idhash=&Apache::lonnet::idrget($tudom,($tuname)); |
return |
return |
'<img align="right" src="/cgi-bin/barcode.png?encode='.$token.'" />'. |
'<img align="right" src="/cgi-bin/barcode.png?encode='.$token.'" />'. |
'Checked out for '.$plainname. |
&mt('Checked out for').' '.$plainname. |
'<br />User: '.$tuname.' at '.$tudom. |
'<br />'.&mt('User').': '.$tuname.' at '.$tudom. |
'<br />ID: '.$idhash{$tuname}. |
'<br />'.&mt('ID').': '.$idhash{$tuname}. |
'<br />CourseID: '.$tcrsid. |
'<br />'.&mt('CourseID').': '.$tcrsid. |
'<br />Course: '.$ENV{'course.'.$tcrsid.'.description'}. |
'<br />'.&mt('Course').': '.$ENV{'course.'.$tcrsid.'.description'}. |
'<br />DocID: '.$token. |
'<br />'.&mt('DocID').': '.$token. |
'<br />Time: '.localtime().'<hr />'; |
'<br />'.&mt('Time').': '.&Apache::lonlocal::locallocaltime().'<hr />'; |
} else { |
} else { |
return $token; |
return $token; |
} |
} |
Line 317 sub xmlparse {
|
Line 323 sub xmlparse {
|
&Apache::inputtags::initialize_inputtags(); |
&Apache::inputtags::initialize_inputtags(); |
&Apache::outputtags::initialize_outputtags(); |
&Apache::outputtags::initialize_outputtags(); |
&Apache::edit::initialize_edit(); |
&Apache::edit::initialize_edit(); |
|
&Apache::londefdef::initialize_londefdef(); |
|
|
# |
# |
# do we have a course style file? |
# do we have a course style file? |
Line 333 sub xmlparse {
|
Line 340 sub xmlparse {
|
&Apache::style::styleparser($target,$styletext)); |
&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(); |
#&printalltags(); |
my @pars = (); |
my @pars = (); |
Line 357 sub xmlparse {
|
Line 371 sub xmlparse {
|
if ($ENV{'request.uri'}) { |
if ($ENV{'request.uri'}) { |
&writeallows($ENV{'request.uri'}); |
&writeallows($ENV{'request.uri'}); |
} |
} |
|
&do_registered_ssi(); |
if ($Apache::lonxml::counter_changed) { &store_counter() } |
if ($Apache::lonxml::counter_changed) { &store_counter() } |
return $finaloutput; |
return $finaloutput; |
} |
} |
Line 390 sub latex_special_symbols {
|
Line 405 sub latex_special_symbols {
|
$string =~ s/_/ /g; |
$string =~ s/_/ /g; |
} else { |
} else { |
$string=~s/\\ /\\char92 /g; |
$string=~s/\\ /\\char92 /g; |
$string=~s/\^/\\char94 /g; |
$string=~s/\^/\\\^\\strut /g; |
$string=~s/\~/\\char126 /g; |
$string=~s/\~/\\char126 /g; |
$string=~s/(&[^A-Za-z\#])/\\$1/g; |
#fixup & if it doesn't look like |
$string=~s/([^&])\#/$1\\#/g; |
# { or α |
|
$string=~s/(&(?!((\#[0-9]+)|([a-z]+));))/\\$1/gi; |
|
$string=~s/([^&\\])\#/$1\\#/g; |
|
$string=~s/\#\#/\#\\#/g; |
$string=~s/(\$|_|{|})/\\$1/g; |
$string=~s/(\$|_|{|})/\\$1/g; |
$string=~s/\\char92 /\\texttt{\\char92}/g; |
$string=~s/\\char92 /\\texttt{\\char92}/g; |
$string=~s/(>|<)/\$$1\$/g; #more or less |
$string=~s/(>|<)/\$$1\$/g; #more or less |
Line 477 sub inner_xmlparse {
|
Line 495 sub inner_xmlparse {
|
&Apache::lonxml::error("Unknown token event :$token->[0]:$token->[1]:"); |
&Apache::lonxml::error("Unknown token event :$token->[0]:$token->[1]:"); |
} |
} |
#evaluate variable refs in result |
#evaluate variable refs in result |
if ($result ne "") { |
if ($Apache::lonxml::post_evaluate &&$result ne "") { |
my $extras; |
my $extras; |
if (!$Apache::lonxml::usestyle) { |
if (!$Apache::lonxml::usestyle) { |
$extras=$Apache::lonxml::style_values; |
$extras=$Apache::lonxml::style_values; |
Line 488 sub inner_xmlparse {
|
Line 506 sub inner_xmlparse {
|
$result= &Apache::run::evaluate($result,$safeeval,$extras); |
$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') ) { |
if (($token->[0] eq 'T') || ($token->[0] eq 'C') || ($token->[0] eq 'D') ) { |
#Style file definitions should be correct |
#Style file definitions should be correct |
if ($target eq 'tex' && ($Apache::lonxml::usestyle)) { |
if ($target eq 'tex' && ($Apache::lonxml::usestyle)) { |
Line 496 sub inner_xmlparse {
|
Line 516 sub inner_xmlparse {
|
} |
} |
|
|
# Encode any high ASCII characters |
# Encode any high ASCII characters |
if (!$Apache::lonxml::prevent_entity_encode) { |
# if (!$Apache::lonxml::prevent_entity_encode) { |
$result=&HTML::Entities::encode($result,"\200-\377"); |
# $result=&HTML::Entities::encode($result,"\200-\377"); |
} |
# } |
if ($Apache::lonxml::redirection) { |
if ($Apache::lonxml::redirection) { |
$Apache::lonxml::outputstack['-1'] .= $result; |
$Apache::lonxml::outputstack['-1'] .= $result; |
} else { |
} else { |
Line 607 sub setup_globals {
|
Line 627 sub setup_globals {
|
&init_counter(); |
&init_counter(); |
@Apache::lonxml::pwd=(); |
@Apache::lonxml::pwd=(); |
@Apache::lonxml::extlinks=(); |
@Apache::lonxml::extlinks=(); |
|
@Apache::lonxml::ssi_info=(); |
|
$Apache::lonxml::post_evaluate=1; |
|
$Apache::lonxml::warnings_error_header=''; |
if ($target eq 'meta') { |
if ($target eq 'meta') { |
$Apache::lonxml::redirection = 0; |
$Apache::lonxml::redirection = 0; |
$Apache::lonxml::metamode = 1; |
$Apache::lonxml::metamode = 1; |
Line 650 sub init_safespace {
|
Line 673 sub init_safespace {
|
$safeeval->permit("entereval"); |
$safeeval->permit("entereval"); |
$safeeval->permit(":base_math"); |
$safeeval->permit(":base_math"); |
$safeeval->permit("sort"); |
$safeeval->permit("sort"); |
|
$safeeval->permit("time"); |
$safeeval->deny(":base_io"); |
$safeeval->deny(":base_io"); |
$safehole->wrap(\&Apache::scripttag::xmlparse,$safeeval,'&xmlparse'); |
$safehole->wrap(\&Apache::scripttag::xmlparse,$safeeval,'&xmlparse'); |
$safehole->wrap(\&Apache::outputtags::multipart,$safeeval,'&multipart'); |
$safehole->wrap(\&Apache::outputtags::multipart,$safeeval,'&multipart'); |
Line 797 sub decreasedepth {
|
Line 821 sub decreasedepth {
|
$Apache::lonxml::olddepth=$Apache::lonxml::depth+1; |
$Apache::lonxml::olddepth=$Apache::lonxml::depth+1; |
} |
} |
if ( $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'; |
$Apache::lonxml::depth='-1'; |
} |
} |
my $curdepth=join('_',@Apache::lonxml::depthcounter); |
my $curdepth=join('_',@Apache::lonxml::depthcounter); |
Line 860 sub store_counter {
|
Line 884 sub store_counter {
|
|
|
sub get_all_text { |
sub get_all_text { |
my($tag,$pars,$style)= @_; |
my($tag,$pars,$style)= @_; |
&Apache::lonxml::debug("Got a ".ref($pars)); |
|
my $gotfullstack=1; |
my $gotfullstack=1; |
if (ref($pars) ne 'ARRAY') { |
if (ref($pars) ne 'ARRAY') { |
$gotfullstack=0; |
$gotfullstack=0; |
$pars=[$pars]; |
$pars=[$pars]; |
} |
} |
&Apache::lonxml::debug("Got a ".ref($style)); |
|
if (ref($style) ne 'HASH') { |
if (ref($style) ne 'HASH') { |
$style={}; |
$style={}; |
} else { |
|
&Apache::lonhomework::showhash(%$style); |
|
} |
} |
my $depth=0; |
my $depth=0; |
my $token; |
my $token; |
Line 894 sub get_all_text {
|
Line 914 sub get_all_text {
|
} elsif ($token->[0] eq 'E') { |
} elsif ($token->[0] eq 'E') { |
if ( $token->[1] =~ /^$tag$/i) { $depth--; } |
if ( $token->[1] =~ /^$tag$/i) { $depth--; } |
#skip sending back the last end tag |
#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= |
my $string= |
'<LONCAPA_INTERNAL_TURN_STYLE_OFF end="yes" />'. |
'<LONCAPA_INTERNAL_TURN_STYLE_OFF end="yes" />'. |
$$style{'/'.$token->[1]}. |
$$style{'/'.$token->[1]}. |
Line 1002 sub writeallows {
|
Line 1022 sub writeallows {
|
&Apache::lonnet::appenv(%httpref); |
&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 |
# Afterburner handles anchors, highlights and links |
# |
# |
Line 1041 ENDSCRIPT
|
Line 1074 ENDSCRIPT
|
|
|
sub storefile { |
sub storefile { |
my ($file,$contents)=@_; |
my ($file,$contents)=@_; |
|
&Apache::lonnet::correct_line_ends(\$contents); |
if (my $fh=Apache::File->new('>'.$file)) { |
if (my $fh=Apache::File->new('>'.$file)) { |
print $fh $contents; |
print $fh $contents; |
$fh->close(); |
$fh->close(); |
Line 1092 sub inserteditinfo {
|
Line 1126 sub inserteditinfo {
|
} |
} |
my $cleanbut = ''; |
my $cleanbut = ''; |
if ($filetype eq 'html') { |
if ($filetype eq 'html') { |
$cleanbut='<input type="submit" name="attemptclean" |
$cleanbut='<input type="submit" name="attemptclean" value="'. |
value="Save and then attempt to clean HTML" />'; |
&mt('Save and then attempt to clean HTML').'" />'; |
} |
} |
my $titledisplay=&display_title(); |
my $titledisplay=&display_title(); |
|
my %lt=&Apache::lonlocal::texthash('st' => 'Save this', |
|
'vi' => 'View', |
|
'ed' => 'Edit'); |
my $buttons=(<<BUTTONS); |
my $buttons=(<<BUTTONS); |
$cleanbut |
$cleanbut |
<input type="submit" name="savethisfile" value="Save this" /> |
<input type="submit" name="savethisfile" value="$lt{'st'}" /> |
<input type="submit" name="viewmode" value="View" /> |
<input type="submit" name="viewmode" value="$lt{'vi'}" /> |
BUTTONS |
BUTTONS |
my $editfooter=(<<ENDFOOTER); |
my $editfooter=(<<ENDFOOTER); |
<hr /> |
<hr /> |
<a name="editsection" /> |
<a name="editsection" /> |
<form method="post"> |
<form method="post"> |
$xml_help |
$xml_help |
<input type="hidden" name="editmode" value="Edit" /> |
<input type="hidden" name="editmode" value="$lt{'ed'}" /> |
$buttons<br /> |
$buttons<br /> |
<textarea cols="80" rows="40" name="filecont">$filecontents</textarea> |
<textarea cols="80" rows="40" name="filecont">$filecontents</textarea> |
<br />$buttons |
<br />$buttons |
Line 1154 sub handler {
|
Line 1191 sub handler {
|
$Apache::lonxml::debug=$ENV{'user.debug'}; |
$Apache::lonxml::debug=$ENV{'user.debug'}; |
|
|
if ($ENV{'browser.mathml'}) { |
if ($ENV{'browser.mathml'}) { |
$request->content_type('text/xml'); |
&Apache::loncommon::content_type($request,'text/xml'); |
} else { |
} else { |
$request->content_type('text/html'); |
&Apache::loncommon::content_type($request,'text/html'); |
} |
} |
&Apache::loncommon::no_cache($request); |
&Apache::loncommon::no_cache($request); |
$request->send_http_header; |
$request->send_http_header; |
Line 1177 sub handler {
|
Line 1214 sub handler {
|
unless ($ENV{'request.state'} eq 'published') { |
unless ($ENV{'request.state'} eq 'published') { |
if (($ENV{'form.savethisfile'}) || ($ENV{'form.attemptclean'})) { |
if (($ENV{'form.savethisfile'}) || ($ENV{'form.attemptclean'})) { |
if (&storefile($file,$ENV{'form.filecont'})) { |
if (&storefile($file,$ENV{'form.filecont'})) { |
$request->print("<font COLOR=\"#0000FF\">Updated: ". strftime("%d %b %H:%M:%S",localtime())." </font>"); |
$request->print("<font COLOR=\"#0000FF\">".&mt('Updated').": ". |
|
&Apache::lonlocal::locallocaltime(time)." </font>"); |
} |
} |
} |
} |
} |
} |
Line 1185 sub handler {
|
Line 1223 sub handler {
|
my $result = ''; |
my $result = ''; |
my $filecontents=&Apache::lonnet::getfile($file); |
my $filecontents=&Apache::lonnet::getfile($file); |
if ($filecontents eq -1) { |
if ($filecontents eq -1) { |
|
my $bodytag=&Apache::loncommon::bodytag('File Error'); |
|
my $fnf=&mt('File not found'); |
$result=(<<ENDNOTFOUND); |
$result=(<<ENDNOTFOUND); |
<html> |
<html> |
<head> |
<head> |
<title>File not found</title> |
<title>$fnf</title> |
</head> |
</head> |
<body bgcolor="#FFFFFF"> |
$bodytag |
<b>File not found: $file</b> |
<b>$fnf: $file</b> |
</body> |
</body> |
</html> |
</html> |
ENDNOTFOUND |
ENDNOTFOUND |
Line 1255 sub display_title {
|
Line 1295 sub display_title {
|
} |
} |
|
|
sub debug { |
sub debug { |
if ($Apache::lonxml::debug eq 1) { |
if ($Apache::lonxml::debug eq "1") { |
$|=1; |
$|=1; |
print('<font size="-2"<pre>DEBUG:'.&HTML::Entities::encode($_[0])."</pre></font>\n"); |
my $request=$Apache::lonxml::request; |
} |
if (!$request) { $request=Apache->request; } |
|
$request->print('<font size="-2"><pre>DEBUG:'.&HTML::Entities::encode($_[0])."</pre></font>\n"); |
|
} |
} |
} |
|
|
sub error { |
sub error { |
$errorcount++; |
$errorcount++; |
|
my $request=$Apache::lonxml::request; |
|
if (!$request) { $request=Apache->request; } |
if (($Apache::lonxml::debug eq 1) || ($ENV{'request.state'} eq 'construct') ) { |
if (($Apache::lonxml::debug eq 1) || ($ENV{'request.state'} eq 'construct') ) { |
# If printing in construction space, put the error inside <pre></pre> |
# If printing in construction space, put the error inside <pre></pre> |
print "<b>ERROR:</b>".join("\n",@_)."\n"; |
$request->print($Apache::lonxml::warnings_error_header. |
|
"<b>ERROR:</b>".join("\n",@_)."\n"); |
|
$Apache::lonxml::warnings_error_header=''; |
} else { |
} else { |
print "<b>An Error occured while processing this resource. The instructor has been notified.</b> <br />"; |
$request->print("<b>An Error occured while processing this resource. The instructor has been notified.</b> <br />"); |
#notify author |
#notify author |
&Apache::lonmsg::author_res_msg($ENV{'request.filename'},join('<br />',@_)); |
&Apache::lonmsg::author_res_msg($ENV{'request.filename'},join('<br />',@_)); |
#notify course |
#notify course |
Line 1288 sub error {
|
Line 1334 sub error {
|
} |
} |
|
|
sub warning { |
sub warning { |
$warningcount++; |
$warningcount++; |
|
|
if ($ENV{'form.grade_target'} ne 'tex') { |
if ($ENV{'form.grade_target'} ne 'tex') { |
if ($ENV{'request.state'} eq 'construct' || $Apache::lonxml::debug) { |
if ($ENV{'request.state'} eq 'construct' || $Apache::lonxml::debug) { |
print "<b>W</b>ARNING<b>:</b>".join('<br />',@_)."<br />\n"; |
my $request=$Apache::lonxml::request; |
} |
if (!$request) { $request=Apache->request; } |
} |
$request->print($Apache::lonxml::warnings_error_header. |
|
"<b>W</b>ARNING<b>:</b>".join('<br />',@_)."<br />\n"); |
|
$Apache::lonxml::warnings_error_header=''; |
|
} |
|
} |
} |
} |
|
|
sub get_param { |
sub get_param { |
Line 1302 sub get_param {
|
Line 1352 sub get_param {
|
if ( ! $context ) { $context = -1; } |
if ( ! $context ) { $context = -1; } |
my $args =''; |
my $args =''; |
if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; } |
if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; } |
|
if ( ! $Apache::lonxml::usestyle ) { |
|
$args=$Apache::lonxml::style_values.$args; |
|
} |
if ( ! $args ) { return undef; } |
if ( ! $args ) { return undef; } |
if ( $case_insensitive ) { |
if ( $case_insensitive ) { |
if ($args =~ s/(my \$)(\Q$param\E)(=\")/$1.lc($2).$3/ei) { |
if ($args =~ s/(my \$)(\Q$param\E)(=\")/$1.lc($2).$3/ei) { |
Line 1325 sub get_param_var {
|
Line 1378 sub get_param_var {
|
if ( ! $context ) { $context = -1; } |
if ( ! $context ) { $context = -1; } |
my $args =''; |
my $args =''; |
if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; } |
if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; } |
|
if ( ! $Apache::lonxml::usestyle ) { |
|
$args=$Apache::lonxml::style_values.$args; |
|
} |
&Apache::lonxml::debug("Args are $args param is $param"); |
&Apache::lonxml::debug("Args are $args param is $param"); |
if ($case_insensitive) { |
if ($case_insensitive) { |
if (! ($args=~s/(my \$)(\Q$param\E)(=\")/$1.lc($2).$3/ei)) { |
if (! ($args=~s/(my \$)(\Q$param\E)(=\")/$1.lc($2).$3/ei)) { |