version 1.468, 2007/10/30 00:22:27
|
version 1.494.4.5, 2010/10/01 14:21:55
|
Line 37
|
Line 37
|
# to any other parties under any circumstances. |
# to any other parties under any circumstances. |
# |
# |
|
|
|
=pod |
|
|
|
=head1 NAME |
|
|
|
Apache::lonxml |
|
|
|
=head1 SYNOPSIS |
|
|
|
XML Parsing Module |
|
|
|
This is part of the LearningOnline Network with CAPA project |
|
described at http://www.lon-capa.org. |
|
|
|
|
|
=head1 SUBROUTINES |
|
|
|
=cut |
|
|
|
|
|
|
package Apache::lonxml; |
package Apache::lonxml; |
use vars |
use vars |
Line 90 use Apache::lonfeedback();
|
Line 109 use Apache::lonfeedback();
|
use Apache::lonmsg(); |
use Apache::lonmsg(); |
use Apache::loncacc(); |
use Apache::loncacc(); |
use Apache::lonmaxima(); |
use Apache::lonmaxima(); |
|
use Apache::lonr(); |
use Apache::lonlocal; |
use Apache::lonlocal; |
|
|
#==================================== Main subroutine: xmlparse |
#==================================== Main subroutine: xmlparse |
Line 223 sub tokeninputfield {
|
Line 243 sub tokeninputfield {
|
document.tokeninput.barcode.value=''; |
document.tokeninput.barcode.value=''; |
} |
} |
</script> |
</script> |
<form method="post" name="tokeninput"> |
<form method="post" name="tokeninput" action=""> |
<table border="2" bgcolor="#FFFFBB"> |
<table border="2" bgcolor="#FFFFBB"> |
<tr><th>DocID Checkin</th></tr> |
<tr><th>DocID Checkin</th></tr> |
<tr><td> |
<tr><td> |
Line 231 sub tokeninputfield {
|
Line 251 sub tokeninputfield {
|
<tr> |
<tr> |
<td>Scan in Barcode</td> |
<td>Scan in Barcode</td> |
<td><input type="text" size="22" name="barcode" |
<td><input type="text" size="22" name="barcode" |
onChange="updatetoken()"/></td> |
onchange="updatetoken()"/></td> |
</tr> |
</tr> |
<tr><td><i>or</i> Type in DocID</td> |
<tr><td><i>or</i> Type in DocID</td> |
<td> |
<td> |
Line 240 onChange="updatetoken()"/></td>
|
Line 260 onChange="updatetoken()"/></td>
|
<input type="text" size="5" name="codetwo" /> |
<input type="text" size="5" name="codetwo" /> |
<b><font size="+2">*</font></b> |
<b><font size="+2">*</font></b> |
<input type="text" size="10" name="codethree" value="$defhost" |
<input type="text" size="10" name="codethree" value="$defhost" |
onChange="this.value=this.value.toUpperCase()" /> |
onchange="this.value=this.value.toUpperCase()" /> |
</td></tr> |
</td></tr> |
</table> |
</table> |
</td></tr> |
</td></tr> |
Line 361 sub xmlparse {
|
Line 381 sub xmlparse {
|
$safeeval,\%style_for_target,1); |
$safeeval,\%style_for_target,1); |
|
|
if (@stack) { |
if (@stack) { |
&warning("At end of file some tags were still left unclosed, ". |
&warning(&mt('At end of file some tags were still left unclosed:'). |
'<tt><'.join('></tt>, <tt><',reverse(@stack)). |
' <tt><'.join('></tt>, <tt><',reverse(@stack)). |
'></tt>'); |
'></tt>'); |
} |
} |
if ($env{'request.uri'}) { |
if ($env{'request.uri'}) { |
Line 377 sub xmlparse {
|
Line 397 sub xmlparse {
|
$finaloutput .= join('',@script_var_displays); |
$finaloutput .= join('',@script_var_displays); |
undef(@script_var_displays); |
undef(@script_var_displays); |
} |
} |
|
&init_state(); |
if ($env{'form.return_only_error_and_warning_counts'}) { |
if ($env{'form.return_only_error_and_warning_counts'}) { |
|
if ($env{'request.filename'}=~/\.(html|htm|xml)$/i) { |
|
my $error=&verify_html($content_file_string); |
|
if ($error) { $errorcount++; } |
|
} |
return "$errorcount:$warningcount"; |
return "$errorcount:$warningcount"; |
} |
} |
return $finaloutput; |
return $finaloutput; |
Line 482 sub inner_xmlparse {
|
Line 506 sub inner_xmlparse {
|
while ($token->[1] ne $$stack['-1'] && ($#$stack > -1)) { |
while ($token->[1] ne $$stack['-1'] && ($#$stack > -1)) { |
my $lasttag=$$stack[-1]; |
my $lasttag=$$stack[-1]; |
if ($token->[1] =~ /^\Q$lasttag\E$/i) { |
if ($token->[1] =~ /^\Q$lasttag\E$/i) { |
&Apache::lonxml::warning('Using tag </'.$token->[1].'> on line '.$token->[3].' as end tag to <'.$$stack[-1].'>'); |
&Apache::lonxml::warning(&mt('Using tag [_1] on line [_2] as end tag to [_3]','</'.$token->[1].'>','.$token->[3].','<'.$$stack[-1].'>')); |
last; |
last; |
} else { |
} else { |
&Apache::lonxml::warning('Found tag </'.$token->[1].'> on line '.$token->[3].' when looking for </'.$$stack[-1].'> in file'); |
&Apache::lonxml::warning(&mt('Found tag [_1] on line [_2] when looking for [_3] in file.','</'.$token->[1].'>',$token->[3],'</'.$$stack[-1].'>')); |
&end_tag($stack,$parstack,$token); |
&end_tag($stack,$parstack,$token); |
} |
} |
} |
} |
Line 501 sub inner_xmlparse {
|
Line 525 sub inner_xmlparse {
|
if (!$Apache::lonxml::usestyle) { |
if (!$Apache::lonxml::usestyle) { |
$extras=$Apache::lonxml::style_values; |
$extras=$Apache::lonxml::style_values; |
} |
} |
if ( $#$parstack > -1 ) { |
if ( $#$parstack > -1 ) { |
$result=&Apache::run::evaluate($result,$safeeval,$extras.$$parstack[-1]); |
$result=&Apache::run::evaluate($result,$safeeval,$extras.$$parstack[-1]); |
} else { |
} else { |
$result= &Apache::run::evaluate($result,$safeeval,$extras); |
$result= &Apache::run::evaluate($result,$safeeval,$extras); |
} |
} |
} |
} |
$Apache::lonxml::post_evaluate=1; |
$Apache::lonxml::post_evaluate=1; |
|
|
Line 654 sub setup_globals {
|
Line 678 sub setup_globals {
|
$Apache::lonxml::request=$request; |
$Apache::lonxml::request=$request; |
$errorcount=0; |
$errorcount=0; |
$warningcount=0; |
$warningcount=0; |
|
$Apache::lonxml::internal_error=0; |
$Apache::lonxml::default_homework_loaded=0; |
$Apache::lonxml::default_homework_loaded=0; |
$Apache::lonxml::usestyle=1; |
$Apache::lonxml::usestyle=1; |
&init_counter(); |
&init_counter(); |
&clear_bubble_lines_for_part(); |
&clear_bubble_lines_for_part(); |
&init_state(); |
&init_state(); |
|
&set_state('target',$target); |
@Apache::lonxml::pwd=(); |
@Apache::lonxml::pwd=(); |
@Apache::lonxml::extlinks=(); |
@Apache::lonxml::extlinks=(); |
@script_var_displays=(); |
@script_var_displays=(); |
Line 713 sub init_safespace {
|
Line 739 sub init_safespace {
|
$safeeval->permit(":base_math"); |
$safeeval->permit(":base_math"); |
$safeeval->permit("sort"); |
$safeeval->permit("sort"); |
$safeeval->permit("time"); |
$safeeval->permit("time"); |
|
$safeeval->permit("caller"); |
$safeeval->deny("rand"); |
$safeeval->deny("rand"); |
$safeeval->deny("srand"); |
$safeeval->deny("srand"); |
$safeeval->deny(":base_io"); |
$safeeval->deny(":base_io"); |
Line 722 sub init_safespace {
|
Line 749 sub init_safespace {
|
$safehole->wrap(\&Apache::chemresponse::chem_standard_order,$safeeval, |
$safehole->wrap(\&Apache::chemresponse::chem_standard_order,$safeeval, |
'&chem_standard_order'); |
'&chem_standard_order'); |
$safehole->wrap(\&Apache::response::check_status,$safeeval,'&check_status'); |
$safehole->wrap(\&Apache::response::check_status,$safeeval,'&check_status'); |
|
$safehole->wrap(\&Apache::response::implicit_multiplication,$safeeval,'&implicit_multiplication'); |
|
|
$safehole->wrap(\&Apache::lonmaxima::maxima_eval,$safeeval,'&maxima_eval'); |
$safehole->wrap(\&Apache::lonmaxima::maxima_eval,$safeeval,'&maxima_eval'); |
$safehole->wrap(\&Apache::lonmaxima::maxima_check,$safeeval,'&maxima_check'); |
$safehole->wrap(\&Apache::lonmaxima::maxima_check,$safeeval,'&maxima_check'); |
$safehole->wrap(\&Apache::lonmaxima::maxima_cas_formula_fix,$safeeval, |
$safehole->wrap(\&Apache::lonmaxima::maxima_cas_formula_fix,$safeeval, |
'&maxima_cas_formula_fix'); |
'&maxima_cas_formula_fix'); |
|
|
|
$safehole->wrap(\&Apache::lonr::r_eval,$safeeval,'&r_eval'); |
|
$safehole->wrap(\&Apache::lonr::Rentry,$safeeval,'&Rentry'); |
|
$safehole->wrap(\&Apache::lonr::Rarray,$safeeval,'&Rarray'); |
|
$safehole->wrap(\&Apache::lonr::r_check,$safeeval,'&r_check'); |
|
$safehole->wrap(\&Apache::lonr::r_cas_formula_fix,$safeeval, |
|
'&r_cas_formula_fix'); |
|
|
$safehole->wrap(\&Apache::caparesponse::capa_formula_fix,$safeeval, |
$safehole->wrap(\&Apache::caparesponse::capa_formula_fix,$safeeval, |
'&capa_formula_fix'); |
'&capa_formula_fix'); |
|
|
|
$safehole->wrap(\&Apache::lonlocal::locallocaltime,$safeeval, |
|
'&locallocaltime'); |
|
|
$safehole->wrap(\&Math::Cephes::asin,$safeeval,'&asin'); |
$safehole->wrap(\&Math::Cephes::asin,$safeeval,'&asin'); |
$safehole->wrap(\&Math::Cephes::acos,$safeeval,'&acos'); |
$safehole->wrap(\&Math::Cephes::acos,$safeeval,'&acos'); |
$safehole->wrap(\&Math::Cephes::atan,$safeeval,'&atan'); |
$safehole->wrap(\&Math::Cephes::atan,$safeeval,'&atan'); |
Line 1005 sub get_id {
|
Line 1043 sub get_id {
|
my ($parstack,$safeeval)=@_; |
my ($parstack,$safeeval)=@_; |
my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval); |
my $id= &Apache::lonxml::get_param('id',$parstack,$safeeval); |
if ($env{'request.state'} eq 'construct' && $id =~ /([._]|[^\w\d\s[:punct:]])/) { |
if ($env{'request.state'} eq 'construct' && $id =~ /([._]|[^\w\d\s[:punct:]])/) { |
&error(&mt("ID "[_1]" contains invalid characters, IDs are only allowed to contain letters, numbers, spaces and -",'<tt>'.$id.'</tt>')); |
&error(&mt("ID [_1] contains invalid characters, IDs are only allowed to contain letters, numbers, spaces and -",'<tt>'.$id.'</tt>')); |
} |
} |
if ($id =~ /^\s*$/) { $id = $Apache::lonxml::curdepth; } |
if ($id =~ /^\s*$/) { $id = $Apache::lonxml::curdepth; } |
return $id; |
return $id; |
Line 1074 Optional Arguments:
|
Line 1112 Optional Arguments:
|
|
|
sub increment_counter { |
sub increment_counter { |
my ($increment, $part_response) = @_; |
my ($increment, $part_response) = @_; |
|
if ($env{'form.grade_noincrement'}) { return; } |
if (!defined($increment) || $increment le 0) { |
if (!defined($increment) || $increment le 0) { |
$increment = 1; |
$increment = 1; |
} |
} |
Line 1082 sub increment_counter {
|
Line 1121 sub increment_counter {
|
# If the caller supplied the response_id parameter, |
# If the caller supplied the response_id parameter, |
# Maintain its counter.. creating if necessary. |
# Maintain its counter.. creating if necessary. |
|
|
if(defined($part_response)) { |
if (defined($part_response)) { |
if (!defined($Apache::lonxml::counters_per_part{$part_response})) { |
if (!defined($Apache::lonxml::counters_per_part{$part_response})) { |
$Apache::lonxml::counters_per_part{$part_response} = 0; |
$Apache::lonxml::counters_per_part{$part_response} = 0; |
} |
} |
Line 1115 sub init_counter {
|
Line 1154 sub init_counter {
|
} |
} |
|
|
sub store_counter { |
sub store_counter { |
&Apache::lonnet::appenv(('form.counter' => $Apache::lonxml::counter)); |
&Apache::lonnet::appenv({'form.counter' => $Apache::lonxml::counter}); |
$Apache::lonxml::counter_changed=0; |
$Apache::lonxml::counter_changed=0; |
return ''; |
return ''; |
} |
} |
Line 1136 sub store_counter {
|
Line 1175 sub store_counter {
|
|
|
sub restore_problem_counter { |
sub restore_problem_counter { |
if (defined($state)) { |
if (defined($state)) { |
&Apache::lonnet::appenv(('form.counter' => $state)); |
&Apache::lonnet::appenv({'form.counter' => $state}); |
} |
} |
} |
} |
sub get_problem_counter { |
sub get_problem_counter { |
Line 1163 sub bubble_lines_for_part {
|
Line 1202 sub bubble_lines_for_part {
|
} else { |
} else { |
return $Apache::lonxml::counters_per_part{$part_response}; |
return $Apache::lonxml::counters_per_part{$part_response}; |
} |
} |
|
|
} |
} |
|
|
=pod |
=pod |
Line 1374 sub writeallows {
|
Line 1412 sub writeallows {
|
&Apache::lonnet::hreflocation($thisdir,&unescape($_))}=$thisurl; |
&Apache::lonnet::hreflocation($thisdir,&unescape($_))}=$thisurl; |
} |
} |
@extlinks=(); |
@extlinks=(); |
&Apache::lonnet::appenv(%httpref); |
&Apache::lonnet::appenv(\%httpref); |
} |
} |
|
|
sub register_ssi { |
sub register_ssi { |
Line 1441 sub storefile {
|
Line 1479 sub storefile {
|
$fh->close(); |
$fh->close(); |
return 1; |
return 1; |
} else { |
} else { |
&warning("Unable to save file $file"); |
&warning(&mt('Unable to save file [_1]','<tt>'.$file.'</tt>')); |
return 0; |
return 0; |
} |
} |
} |
} |
Line 1474 SIMPLECONTENT
|
Line 1512 SIMPLECONTENT
|
return $filecontents; |
return $filecontents; |
} |
} |
|
|
|
sub createnewjs { |
|
my $filecontents=(<<SIMPLECONTENT); |
|
<script type="text/javascript" language="Javascript"> |
|
|
|
</script> |
|
SIMPLECONTENT |
|
return $filecontents; |
|
} |
|
|
|
sub verify_html { |
|
my ($filecontents)=@_; |
|
my ($is_html,$is_xml); |
|
if ($filecontents =~/(?:\<|\<\;)\?xml[^\<]*\?(?:\>|\>\;)/is) { |
|
$is_xml = 1; |
|
} elsif ($filecontents =~/(?:\<|\<\;)html(?:\s+[^\<]+|\s*)(?:\>|\>\;)/is) { |
|
$is_html = 1; |
|
} |
|
unless ($is_xml || $is_html) { |
|
return &mt('File does not have [_1] or [_2] starting tag','<html>','<?xml ?>'); |
|
} |
|
if ($is_html) { |
|
if ($filecontents!~/(?:\<|\<\;)\/html(?:\>|\>\;)/is) { |
|
return &mt('File does not have [_1] ending tag','<html>'); |
|
} |
|
if ($filecontents!~/(?:\<|\<\;)(?:body|frameset)[^\<]*(?:\>|\>\;)/is) { |
|
return &mt('File does not have [_1] or [_2] starting tag','<body>','<frameset>'); |
|
} |
|
if ($filecontents!~/(?:\<|\<\;)\/(?:body|frameset)[^\<]*(?:\>|\>\;)/is) { |
|
return &mt('File does not have [_1] or [_2] ending tag','<body>','<frameset>'); |
|
} |
|
} |
|
return ''; |
|
} |
|
|
|
sub renderingoptions { |
|
my %langchoices=('' => ''); |
|
foreach (&Apache::loncommon::languageids()) { |
|
if (&Apache::loncommon::supportedlanguagecode($_)) { |
|
$langchoices{&Apache::loncommon::supportedlanguagecode($_)} |
|
= &Apache::loncommon::plainlanguagedescription($_); |
|
} |
|
} |
|
my $output; |
|
unless ($env{'form.forceedit'}) { |
|
$output .= |
|
'<span class="LC_nobreak">'. |
|
&mt('Language:').' '. |
|
&Apache::loncommon::select_form( |
|
$env{'form.languages'}, |
|
'languages', |
|
&Apache::lonlocal::texthash(%langchoices)). |
|
'</span>'; |
|
} |
|
$output .= |
|
' <span class="LC_nobreak">'. |
|
&mt('Math Rendering:').' '. |
|
&Apache::loncommon::select_form( |
|
$env{'form.texengine'}, |
|
'texengine', |
|
&Apache::lonlocal::texthash |
|
('' => '', |
|
'tth' => 'tth (TeX to HTML)', |
|
'jsMath' => 'jsMath', |
|
'mimetex' => 'mimetex (Convert to Images)')). |
|
'</span>'; |
|
return $output; |
|
} |
|
|
sub inserteditinfo { |
sub inserteditinfo { |
my ($filecontents,$filetype)=@_; |
my ($filecontents, $filetype, $filename)=@_; |
$filecontents = &HTML::Entities::encode($filecontents,'<>&"'); |
$filecontents = &HTML::Entities::encode($filecontents,'<>&"'); |
# my $editheader='<a href="#editsection">Edit below</a><hr />'; |
|
my $xml_help = ''; |
my $xml_help = ''; |
my $initialize=''; |
my $initialize=''; |
my $textarea_id = 'filecont'; |
my $textarea_id = 'filecont'; |
|
my $dragmath_button; |
my ($add_to_onload, $add_to_onresize); |
my ($add_to_onload, $add_to_onresize); |
$initialize=&Apache::lonhtmlcommon::spellheader(); |
$initialize=&Apache::lonhtmlcommon::spellheader(); |
if ($filetype eq 'html' |
if ($filetype eq 'html' |
Line 1519 FULLPAGE
|
Line 1624 FULLPAGE
|
} |
} |
</script> |
</script> |
FULLPAGE |
FULLPAGE |
|
if ($filetype eq 'html') { |
|
$initialize .= "\n".&Apache::lonhtmlcommon::dragmath_js('EditMathPopup'); |
|
$dragmath_button = &Apache::lonhtmlcommon::dragmath_button('filecont',1); |
|
} |
} |
} |
|
|
$add_to_onload = 'initDocument();'; |
$add_to_onload = 'initDocument();'; |
Line 1528 FULLPAGE
|
Line 1637 FULLPAGE
|
$xml_help=&Apache::loncommon::helpLatexCheatsheet(); |
$xml_help=&Apache::loncommon::helpLatexCheatsheet(); |
} |
} |
|
|
my $cleanbut = ''; |
|
|
|
my $titledisplay=&display_title(); |
my $titledisplay=&display_title(); |
my %lt=&Apache::lonlocal::texthash('st' => 'Save and Edit', |
my %lt=&Apache::lonlocal::texthash('st' => 'Save and Edit', |
'vi' => 'Save and View', |
'vi' => 'Save and View', |
'dv' => 'Discard Edits and View', |
'dv' => 'Discard Edits and View', |
'un' => 'undo', |
'un' => 'undo', |
'ed' => 'Edit'); |
'ed' => 'Edit'); |
my $buttons=(<<BUTTONS); |
my $spelllink .=&Apache::lonhtmlcommon::spelllink('xmledit','filecont'); |
$cleanbut |
|
<input type="submit" name="discardview" accesskey="d" value="$lt{'dv'}" /> |
|
<input type="submit" name="Undo" accesskey="u" value="$lt{'un'}" /><hr /> |
|
<input type="submit" name="savethisfile" accesskey="s" value="$lt{'st'}" /> |
|
<input type="submit" name="viewmode" accesskey="v" value="$lt{'vi'}" /> |
|
BUTTONS |
|
$buttons.=&Apache::lonhtmlcommon::spelllink('xmledit','filecont'); |
|
my $textarea_events = &Apache::edit::element_change_detection(); |
my $textarea_events = &Apache::edit::element_change_detection(); |
my $form_events = &Apache::edit::form_change_detection(); |
my $form_events = &Apache::edit::form_change_detection(); |
|
my $htmlerror; |
|
if ($filetype eq 'html') { |
|
$htmlerror=&verify_html($filecontents); |
|
if ($htmlerror) { |
|
$htmlerror='<span class="LC_error">'.$htmlerror.'</span>'; |
|
} |
|
} |
my $editfooter=(<<ENDFOOTER); |
my $editfooter=(<<ENDFOOTER); |
$initialize |
$initialize |
<hr /> |
|
<a name="editsection" /> |
<a name="editsection" /> |
<form $form_events method="post" name="xmledit"> |
<form $form_events method="post" name="xmledit"> |
$xml_help |
<div class="LC_edit_problem_editxml_header"> |
<input type="hidden" name="editmode" value="$lt{'ed'}" /> |
<table class="LC_edit_problem_header_title"><tr><td> |
$buttons<br /> |
$filename |
<textarea $textarea_events style="width:100%" cols="80" rows="44" name="filecont" id="filecont">$filecontents</textarea> |
</td><td align="right"> |
<div id="LC_aftertextarea"> |
$xml_help |
<br />$buttons |
</td></tr> |
<br /> |
</table> |
$titledisplay |
<div class="LC_edit_problem_discards"> |
</div> |
<input type="submit" name="discardview" accesskey="d" value="$lt{'dv'}" /> |
|
<input type="submit" name="Undo" accesskey="u" value="$lt{'un'}" /> |
|
$dragmath_button $spelllink $htmlerror |
|
</div> |
|
<div class="LC_edit_problem_saves"> |
|
<input type="submit" name="savethisfile" accesskey="s" value="$lt{'st'}" /> |
|
<input type="submit" name="viewmode" accesskey="v" value="$lt{'vi'}" /> |
|
</div> |
|
</div> |
|
<textarea $textarea_events style="width:100%" cols="80" rows="44" name="filecont" id="filecont">$filecontents</textarea> |
|
<div id="LC_aftertextarea"> |
|
<br /> |
|
$titledisplay |
|
</div> |
</form> |
</form> |
</body> |
</body> |
ENDFOOTER |
ENDFOOTER |
Line 1595 sub get_target {
|
Line 1714 sub get_target {
|
|
|
sub handler { |
sub handler { |
my $request=shift; |
my $request=shift; |
|
|
my $target=&get_target(); |
my $target=&get_target(); |
|
|
$Apache::lonxml::debug=$env{'user.debug'}; |
$Apache::lonxml::debug=$env{'user.debug'}; |
|
|
&Apache::loncommon::content_type($request,'text/html'); |
&Apache::loncommon::content_type($request,'text/html'); |
Line 1606 sub handler {
|
Line 1724 sub handler {
|
$request->set_last_modified(&Apache::lonnet::metadata($request->uri, |
$request->set_last_modified(&Apache::lonnet::metadata($request->uri, |
'lastrevisiondate')); |
'lastrevisiondate')); |
} |
} |
|
# Embedded Flash movies (e.g., from Camtasia) served from https will not display in IE |
|
# if XML config file has expired from cache. |
|
if ($ENV{'SERVER_PORT'} == 443) { |
|
if ($request->uri =~ /\.xml$/) { |
|
my ($httpbrowser,$clientbrowser) = |
|
&Apache::loncommon::decode_user_agent($request); |
|
if ($clientbrowser =~ /^explorer$/i) { |
|
delete $request->headers_out->{'Cache-control'}; |
|
delete $request->headers_out->{'Pragma'}; |
|
my $expiration = time + 60; |
|
my $date=strftime("%a, %d %b %Y %H:%M:%S GMT",gmtime($expiration)); |
|
$request->headers_out->set("Expires" => $date); |
|
} |
|
} |
|
} |
$request->send_http_header; |
$request->send_http_header; |
|
|
return OK if $request->header_only; |
return OK if $request->header_only; |
Line 1613 sub handler {
|
Line 1746 sub handler {
|
|
|
my $file=&Apache::lonnet::filelocation("",$request->uri); |
my $file=&Apache::lonnet::filelocation("",$request->uri); |
my $filetype; |
my $filetype; |
if ($file =~ /\.sty$/) { |
if ($file =~ /\.(sty|css|js|txt)$/) { |
$filetype='sty'; |
$filetype=$1; |
} else { |
} else { |
$filetype='html'; |
$filetype='html'; |
} |
} |
|
|
# |
# |
# Edit action? Save file. |
# Edit action? Save file. |
# |
# |
Line 1625 sub handler {
|
Line 1759 sub handler {
|
if ($env{'form.savethisfile'} || $env{'form.viewmode'} || $env{'form.Undo'}) { |
if ($env{'form.savethisfile'} || $env{'form.viewmode'} || $env{'form.Undo'}) { |
my $html_file=&Apache::lonnet::getfile($file); |
my $html_file=&Apache::lonnet::getfile($file); |
my $error = &Apache::lonhomework::handle_save_or_undo($request, \$html_file, \$env{'form.filecont'}); |
my $error = &Apache::lonhomework::handle_save_or_undo($request, \$html_file, \$env{'form.filecont'}); |
|
if ($env{'form.savethisfile'}) { |
|
$env{'form.editmode'}='Edit'; #force edit mode |
|
} |
} |
} |
} |
} |
my %mystyle; |
my %mystyle; |
Line 1643 ENDNOTFOUND
|
Line 1780 ENDNOTFOUND
|
if ($env{'request.state'} ne 'published') { |
if ($env{'request.state'} ne 'published') { |
if ($filetype eq 'sty') { |
if ($filetype eq 'sty') { |
$filecontents=&createnewsty(); |
$filecontents=&createnewsty(); |
} else { |
} elsif ($filetype eq 'js') { |
|
$filecontents=&createnewjs(); |
|
} elsif (($filetype ne 'css') && ($filetype ne 'txt')) { |
$filecontents=&createnewhtml(); |
$filecontents=&createnewhtml(); |
} |
} |
$env{'form.editmode'}='Edit'; #force edit mode |
$env{'form.editmode'}='Edit'; #force edit mode |
Line 1659 ENDNOTFOUND
|
Line 1798 ENDNOTFOUND
|
['editmode']); |
['editmode']); |
} |
} |
if (!$env{'form.editmode'} || $env{'form.viewmode'} || $env{'form.discardview'}) { |
if (!$env{'form.editmode'} || $env{'form.viewmode'} || $env{'form.discardview'}) { |
&Apache::structuretags::reset_problem_globals(); |
if ($filetype eq 'html' || $filetype eq 'sty') { |
$result = &Apache::lonxml::xmlparse($request,$target,$filecontents, |
&Apache::structuretags::reset_problem_globals(); |
'',%mystyle); |
$result = &Apache::lonxml::xmlparse($request,$target, |
|
$filecontents,'',%mystyle); |
# .html files may contain <problem> or <Task> need to clean |
# .html files may contain <problem> or <Task> need to clean |
# up if it did |
# up if it did |
&Apache::structuretags::reset_problem_globals(); |
&Apache::structuretags::reset_problem_globals(); |
&Apache::lonhomework::finished_parsing(); |
&Apache::lonhomework::finished_parsing(); |
|
} else { |
|
$result = $filecontents; |
|
} |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, |
['rawmode']); |
['rawmode']); |
if ($env{'form.rawmode'}) { $result = $filecontents; } |
if ($env{'form.rawmode'}) { $result = $filecontents; } |
if ($filetype eq 'sty') { |
if ($filetype ne 'html') { |
|
my $nochgview = 1; |
my $controls = |
my $controls = |
($env{'request.state'} eq 'construct') ? &Apache::londefdef::edit_controls() |
($env{'request.state'} eq 'construct') ? &Apache::londefdef::edit_controls($nochgview) |
: ''; |
: ''; |
my %options = ('bgcolor' => '#FFFFFF'); |
if ($filetype ne 'sty') { |
$result = |
$result =~ s/</</g; |
&Apache::loncommon::start_page(undef,undef,\%options). |
$result =~ s/>/>/g; |
$controls. |
$result = '<table class="LC_sty_begin">'. |
$result. |
'<tr><td><b><pre>'.$result. |
&Apache::loncommon::end_page(); |
'</pre></b></td></tr></table>'; |
} |
} |
|
if ($env{'environment.remote'} eq 'off') { |
|
my %options = ('bgcolor' => '#FFFFFF'); |
|
$result = |
|
&Apache::loncommon::start_page(undef,undef,\%options). |
|
$controls. |
|
$result. |
|
&Apache::loncommon::end_page(); |
|
} else { |
|
$result = $controls.$result; |
|
} |
|
} |
} |
} |
} |
} |
|
|
Line 1689 ENDNOTFOUND
|
Line 1844 ENDNOTFOUND
|
unless ($env{'request.state'} eq 'published') { |
unless ($env{'request.state'} eq 'published') { |
if ($env{'form.editmode'} && (!($env{'form.viewmode'})) && (!($env{'form.discardview'}))) |
if ($env{'form.editmode'} && (!($env{'form.viewmode'})) && (!($env{'form.discardview'}))) |
{ |
{ |
my ($edit_info, $add_to_onload, $add_to_onresize)= |
|
&inserteditinfo($filecontents,$filetype); |
|
|
|
my $displayfile=$request->uri; |
my $displayfile=$request->uri; |
$displayfile=~s/^\/[^\/]*//; |
$displayfile=~s/^\/[^\/]*//; |
|
|
|
my ($edit_info, $add_to_onload, $add_to_onresize)= |
|
&inserteditinfo($filecontents,$filetype,$displayfile); |
|
|
my %options = |
my %options = |
('add_entries' => |
('add_entries' => |
{'onresize' => $add_to_onresize, |
{'onresize' => $add_to_onresize, |
Line 1709 ENDNOTFOUND
|
Line 1865 ENDNOTFOUND
|
my $start_page = &Apache::loncommon::start_page(undef,$js, |
my $start_page = &Apache::loncommon::start_page(undef,$js, |
\%options); |
\%options); |
$result=$start_page. |
$result=$start_page. |
&Apache::lonxml::message_location().'<h3>'. |
&Apache::lonxml::message_location(). |
$displayfile. |
|
'</h3>'. |
|
$edit_info. |
$edit_info. |
&Apache::loncommon::end_page(); |
&Apache::loncommon::end_page(); |
} |
} |
} |
} |
if ($filetype eq 'html') { &writeallows($request->uri); } |
if ($filetype eq 'html') { &writeallows($request->uri); } |
|
|
Line 1732 sub display_title {
|
Line 1886 sub display_title {
|
$title = $env{'request.filename'}; |
$title = $env{'request.filename'}; |
$title = substr($title, rindex($title, '/') + 1); |
$title = substr($title, rindex($title, '/') + 1); |
} |
} |
$result = "<script type='text/javascript'>top.document.title = '$title - LON-CAPA Construction Space';</script>"; |
$result = "<script type='text/javascript'>top.document.title = '$title - LON-CAPA " |
|
.&mt('Construction Space')."';</script>"; |
} |
} |
return $result; |
return $result; |
} |
} |
Line 1769 sub error {
|
Line 1924 sub error {
|
|
|
$errorcount++; |
$errorcount++; |
|
|
|
$Apache::lonxml::internal_error=1; |
|
|
if (defined($Apache::inputtags::part)) { |
if (defined($Apache::inputtags::part)) { |
if ( @Apache::inputtags::response ) { |
if ( @Apache::inputtags::response ) { |
push(@errors, |
push(@errors, |
Line 1785 sub error {
|
Line 1942 sub error {
|
if ( &show_error_warn_msg() ) { |
if ( &show_error_warn_msg() ) { |
# If printing in construction space, put the error inside <pre></pre> |
# If printing in construction space, put the error inside <pre></pre> |
push(@Apache::lonxml::error_messages, |
push(@Apache::lonxml::error_messages, |
$Apache::lonxml::warnings_error_header. |
$Apache::lonxml::warnings_error_header |
"<b>ERROR:</b>".join("<br />\n",@errors)."<br />\n"); |
.'<div class="LC_error">' |
|
.'<b>'.&mt('ERROR:').' </b>'.join("<br />\n",@errors) |
|
."</div>\n"); |
$Apache::lonxml::warnings_error_header=''; |
$Apache::lonxml::warnings_error_header=''; |
} else { |
} else { |
my $errormsg; |
my $errormsg; |
my ($symb)=&Apache::lonnet::symbread(); |
my ($symb)=&Apache::lonnet::symbread(); |
if ( !$symb ) { |
if ( !$symb ) { |
#public or browsers |
#public or browsers |
$errormsg=&mt("An error occured while processing this resource. The author has been notified."); |
$errormsg=&mt("An error occurred while processing this resource. The author has been notified."); |
} |
} |
my $host=$Apache::lonnet::perlvar{'lonHostID'}; |
my $host=$Apache::lonnet::perlvar{'lonHostID'}; |
push(@errors, "The error occurred on host <tt>$host</tt>"); |
push(@errors, |
|
&mt("The error occurred on host [_1]", |
|
"<tt>$host</tt>")); |
|
|
my $msg = join('<br />', @errors); |
my $msg = join('<br />', @errors); |
|
|
Line 1830 sub error {
|
Line 1991 sub error {
|
} |
} |
} |
} |
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 occurred while processing this resource. The course personnel ([_1]) and the author have been notified.",join(', ',@userlist)); |
} else { |
} else { |
$errormsg=&mt("An error occured while processing this resource. The instructor has been notified."); |
$errormsg=&mt("An error occurred while processing this resource. The instructor has been notified."); |
} |
} |
} |
} |
push(@Apache::lonxml::error_messages,"<b>$errormsg</b> <br />"); |
push(@Apache::lonxml::error_messages,"<b>$errormsg</b> <br />"); |
Line 1845 sub warning {
|
Line 2006 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() ) { |
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"); |
.'<div class="LC_warning">' |
|
.&mt('[_1]W[_2]ARNING','<b>','</b>')."<b>:</b> ".join('<br />',@_) |
|
."</div>\n" |
|
); |
$Apache::lonxml::warnings_error_header=''; |
$Apache::lonxml::warnings_error_header=''; |
} |
} |
} |
} |
Line 2071 sub get_tag {
|
Line 2235 sub get_tag {
|
return $insertlist{"$tagnum.tag"}; |
return $insertlist{"$tagnum.tag"}; |
} |
} |
|
|
|
############################################################ |
|
# PDF-FORM-METHODS |
|
|
|
=pod |
|
|
|
=item &print_pdf_radiobutton(fieldname, value, text) |
|
|
|
Returns a latexline to generate a PDF-Form-Radiobutton with Text. |
|
|
|
$fieldname: PDF internalname of the radiobutton |
|
$value: Value of radiobutton (read when dumping the PDF data) |
|
$text: Text on the rightside of the radiobutton |
|
|
|
=cut |
|
sub print_pdf_radiobutton { |
|
my $result = ''; |
|
my ($fieldName, $value, $text) = @_; |
|
$result .= '\begin{tabularx}{\textwidth}{p{0cm}X}'."\n"; |
|
$result .= '\radioButton[\symbolchoice{circle}]{'. |
|
$fieldName.'}{10bp}{10bp}{'.$value.'}&'.$text."\n"; |
|
$result .= '\end{tabularx}' . "\n"; |
|
$result .= '\hspace{2mm}' . "\n"; |
|
return $result; |
|
} |
|
|
|
|
|
=pod |
|
|
|
=item &print_pdf_start_combobox(fieldname) |
|
|
|
Starts a latexline to generate a PDF-Form-Combobox with text. |
|
|
|
$fieldname: PDF internal name of the Combobox |
|
|
|
=cut |
|
sub print_pdf_start_combobox { |
|
my $result; |
|
my ($fieldName) = @_; |
|
$result .= '\begin{tabularx}{\textwidth}{p{2.5cm}X}'."\n"; |
|
$result .= '\comboBox[]{'.$fieldName.'}{2.3cm}{14bp}{'; # |
|
|
|
return $result; |
|
} |
|
|
|
|
|
=pod |
|
|
|
=item &print_pdf_add_combobox_option(options) |
|
|
|
Generates a latexline to add Options to a PDF-Form-ComboBox. |
|
|
|
$option: PDF internal name of the Combobox-Option |
|
|
|
=cut |
|
sub print_pdf_add_combobox_option { |
|
|
|
my $result; |
|
my ($option) = @_; |
|
|
|
$result .= '('.$option.')'; |
|
|
|
return $result; |
|
} |
|
|
|
|
|
=pod |
|
|
|
=item &print_pdf_end_combobox(text) { |
|
|
|
Returns latexcode to end a PDF-Form-Combobox with text. |
|
|
|
=cut |
|
sub print_pdf_end_combobox { |
|
my $result; |
|
my ($text) = @_; |
|
|
|
$result .= '}&'.$text."\\\\\n"; |
|
$result .= '\end{tabularx}' . "\n"; |
|
$result .= '\hspace{2mm}' . "\n"; |
|
return $result; |
|
} |
|
|
|
|
|
=pod |
|
|
|
=item &print_pdf_hiddenField(fieldname, user, domain) |
|
|
|
Returns a latexline to generate a PDF-Form-hiddenField with userdata. |
|
|
|
$fieldname label for hiddentextfield |
|
$user: name of user |
|
$domain: domain of user |
|
|
|
=cut |
|
sub print_pdf_hiddenfield { |
|
my $result; |
|
my ($fieldname, $user, $domain) = @_; |
|
|
|
$result .= '\textField [\F{\FHidden}\F{-\FPrint}\V{'.$domain.'&'.$user.'}]{'.$fieldname.'}{0in}{0in}'."\n"; |
|
|
|
return $result; |
|
} |
|
|
1; |
1; |
__END__ |
__END__ |
|
|
|
|