version 1.462, 2007/10/08 09:20:22
|
version 1.480, 2008/06/10 16:20:39
|
Line 377 sub xmlparse {
|
Line 377 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 631 sub callsub {
|
Line 635 sub callsub {
|
return $currentstring; |
return $currentstring; |
} |
} |
|
|
|
{ |
|
my %state; |
|
|
|
sub init_state { |
|
undef(%state); |
|
} |
|
|
|
sub set_state { |
|
my ($key,$value) = @_; |
|
$state{$key} = $value; |
|
return $value; |
|
} |
|
sub get_state { |
|
my ($key) = @_; |
|
return $state{$key}; |
|
} |
|
} |
|
|
sub setup_globals { |
sub setup_globals { |
my ($request,$target)=@_; |
my ($request,$target)=@_; |
$Apache::lonxml::request=$request; |
$Apache::lonxml::request=$request; |
Line 640 sub setup_globals {
|
Line 662 sub setup_globals {
|
$Apache::lonxml::usestyle=1; |
$Apache::lonxml::usestyle=1; |
&init_counter(); |
&init_counter(); |
&clear_bubble_lines_for_part(); |
&clear_bubble_lines_for_part(); |
|
&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 694 sub init_safespace {
|
Line 718 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 703 sub init_safespace {
|
Line 728 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'); |
Line 712 sub init_safespace {
|
Line 738 sub init_safespace {
|
$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 1047 Increments the internal counter environm
|
Line 1076 Increments the internal counter environm
|
Optional Arguments: |
Optional Arguments: |
$increment - amount to increment by (defaults to 1) |
$increment - amount to increment by (defaults to 1) |
Also 1 if the value is negative or zero. |
Also 1 if the value is negative or zero. |
$part_id - optional part id.. during analysis, this |
$part_response - A concatenation of the part and response id |
indicates whic part of a problem is being |
identifying exactly what is being 'answered'. |
counted. |
|
|
|
=cut |
=cut |
|
|
sub increment_counter { |
sub increment_counter { |
my ($increment, $part_id) = @_; |
my ($increment, $part_response) = @_; |
|
if ($env{'form.grade_target'} eq 'analyze') { return; } |
if (!defined($increment) || $increment le 0) { |
if (!defined($increment) || $increment le 0) { |
$increment = 1; |
$increment = 1; |
} |
} |
$Apache::lonxml::counter += $increment; |
$Apache::lonxml::counter += $increment; |
|
|
# If the caller supplied the part_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_id)) { |
if (defined($part_response)) { |
if (!defined($Apache::lonxml::counters_per_part{$part_id})) { |
if (!defined($Apache::lonxml::counters_per_part{$part_response})) { |
$Apache::lonxml::counters_per_part{$part_id} = 0; |
$Apache::lonxml::counters_per_part{$part_response} = 0; |
} |
} |
$Apache::lonxml::counters_per_part{$part_id} += $increment; |
$Apache::lonxml::counters_per_part{$part_response} += $increment; |
my $new_value = $Apache::lonxml::counters_per_part{$part_id}; |
my $new_value = $Apache::lonxml::counters_per_part{$part_response}; |
} |
} |
|
|
$Apache::lonxml::counter_changed=1; |
$Apache::lonxml::counter_changed=1; |
Line 1096 sub init_counter {
|
Line 1126 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 1117 sub store_counter {
|
Line 1147 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 1129 sub store_counter {
|
Line 1159 sub store_counter {
|
|
|
=pod |
=pod |
|
|
=item bubble_lines_for_part(part_id) |
=item bubble_lines_for_part(part_response) |
|
|
Returns the number of lines required to get a response for |
Returns the number of lines required to get a response for |
$part_id (this is just $Apache::lonxml::counters_per_part{$part_id} |
$part_response (this is just $Apache::lonxml::counters_per_part{$part_response} |
|
|
=cut |
=cut |
|
|
sub bubble_lines_for_part { |
sub bubble_lines_for_part { |
my ($part_id) = @_; |
my ($part_response) = @_; |
|
|
if (!defined($Apache::lonxml::counters_per_part{$part_id})) { |
if (!defined($Apache::lonxml::counters_per_part{$part_response})) { |
return 0; |
return 0; |
} else { |
} else { |
return $Apache::lonxml::counters_per_part{$part_id}; |
return $Apache::lonxml::counters_per_part{$part_response}; |
} |
} |
|
|
} |
} |
|
|
=pod |
=pod |
Line 1163 sub clear_bubble_lines_for_part {
|
Line 1192 sub clear_bubble_lines_for_part {
|
|
|
=pod |
=pod |
|
|
=item set_bubble_lines(part_id, value) |
=item set_bubble_lines(part_response, value) |
|
|
If there is a problem part, that for whatever reason |
If there is a problem part, that for whatever reason |
requires bubble lines that are not |
requires bubble lines that are not |
Line 1173 analysis to set its hash value explicitl
|
Line 1202 analysis to set its hash value explicitl
|
=cut |
=cut |
|
|
sub set_bubble_lines { |
sub set_bubble_lines { |
my ($part_id, $value) = @_; |
my ($part_response, $value) = @_; |
|
|
$Apache::lonxml::counters_per_part{$part_id} = $value; |
$Apache::lonxml::counters_per_part{$part_response} = $value; |
} |
} |
|
|
=pod |
=pod |
Line 1355 sub writeallows {
|
Line 1384 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 1455 SIMPLECONTENT
|
Line 1484 SIMPLECONTENT
|
return $filecontents; |
return $filecontents; |
} |
} |
|
|
|
sub verify_html { |
|
my ($filecontents)=@_; |
|
if ($filecontents!~/(?:\<|\<\;)(?:html|xml)[^\<]*(?:\>|\>\;)/is) { |
|
return &mt('File does not have [_1] or [_2] starting tag','<html>','<xml>'); |
|
} |
|
if ($filecontents!~/(?:\<|\<\;)\/(?:html|xml)(?:\>|\>\;)/is) { |
|
return &mt('File does not have [_1] or [_2] ending tag','<html>','<xml>'); |
|
} |
|
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($_); |
|
} |
|
} |
|
return |
|
'<span class="LC_nobreak">'. |
|
&mt('Language:').' '. |
|
&Apache::loncommon::select_form($env{'form.languages'},'languages', |
|
%langchoices).' |
|
</span> |
|
<span class="LC_nobreak">'. |
|
&mt('Math Rendering:').' '. |
|
&Apache::loncommon::select_form($env{'form.texengine'},'texengine', |
|
('' => '', |
|
'tth' => 'tth (Tex-to-HTML)', |
|
'jsMath' => 'jsMath', |
|
'mimetex' => 'mimetex (Convert to Images)')).' |
|
</span>'; |
|
} |
|
|
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 ($add_to_onload, $add_to_onresize); |
my ($add_to_onload, $add_to_onresize); |
my $addbuttons=&Apache::lonhtmlcommon::htmlareaaddbuttons(); |
|
$initialize=&Apache::lonhtmlcommon::spellheader(); |
$initialize=&Apache::lonhtmlcommon::spellheader(); |
if ($filetype eq 'html' |
if ($filetype eq 'html' |
&& (!&Apache::lonhtmlcommon::htmlareablocked() && |
&& (!&Apache::lonhtmlcommon::htmlareablocked() && |
&Apache::lonhtmlcommon::htmlareabrowser())) { |
&Apache::lonhtmlcommon::htmlareabrowser())) { |
$textarea_id .= '_htmlarea'; |
$textarea_id .= '___Frame'; |
|
my $lang = &Apache::lonhtmlcommon::htmlarea_lang(); |
$initialize.=(<<FULLPAGE); |
$initialize.=(<<FULLPAGE); |
<script type="text/javascript"> |
<script type="text/javascript"> |
$addbuttons |
lonca |
|
|
HTMLArea.loadPlugin("FullPage"); |
|
|
|
function initDocument() { |
function initDocument() { |
var editor=new HTMLArea("filecont",config); |
var oFCKeditor = new FCKeditor('filecont'); |
editor.registerPlugin(FullPage); |
oFCKeditor.Config['CustomConfigurationsPath'] = '/fckeditor/loncapaconfig.js' ; |
editor.generate(); |
oFCKeditor.Config['FullPage'] = true |
setTimeout( |
oFCKeditor.Config['AutoDetectLanguage'] = false; |
function () { |
oFCKeditor.Config['DefaultLanguage'] = "$lang"; |
HTMLArea._addEvents(editor._doc, |
oFCKeditor.ReplaceTextarea(); |
["keypress","mousedown"], unClean); |
} |
editor._iframe.id = '$textarea_id'; |
function check_if_dirty(editor) { |
resize_textarea('$textarea_id','LC_aftertextarea'); |
if (editor.IsDirty()) { |
},300); |
unClean(); |
|
} |
|
} |
|
function FCKeditor_OnComplete(editor) { |
|
editor.Events.AttachEvent("OnSelectionChange",check_if_dirty); |
|
resize_textarea('$textarea_id','LC_aftertextarea'); |
} |
} |
</script> |
</script> |
FULLPAGE |
FULLPAGE |
} else { |
} else { |
$initialize.=(<<FULLPAGE); |
$initialize.=(<<FULLPAGE); |
<script type="text/javascript"> |
<script type="text/javascript"> |
$addbuttons |
|
function initDocument() { |
function initDocument() { |
resize_textarea('$textarea_id','LC_aftertextarea'); |
resize_textarea('$textarea_id','LC_aftertextarea'); |
} |
} |
Line 1508 FULLPAGE
|
Line 1577 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=&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'}" /> |
|
$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 1605 sub handler {
|
Line 1681 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 1669 ENDNOTFOUND
|
Line 1748 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 1689 ENDNOTFOUND
|
Line 1769 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(); |
} |
} |
Line 1712 sub display_title {
|
Line 1790 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 1766 sub error {
|
Line 1845 sub error {
|
# 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"); |
"<b>".&mt('ERROR:')."</b>".join("<br />\n",@errors)."<br />\n"); |
$Apache::lonxml::warnings_error_header=''; |
$Apache::lonxml::warnings_error_header=''; |
} else { |
} else { |
my $errormsg; |
my $errormsg; |
Line 1776 sub error {
|
Line 1855 sub error {
|
$errormsg=&mt("An error occured while processing this resource. The author has been notified."); |
$errormsg=&mt("An error occured 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); |
|
|