version 1.447, 2009/05/28 12:39:17
|
version 1.528, 2015/02/22 01:34:48
|
Line 61 use Apache::lonlocal;
|
Line 61 use Apache::lonlocal;
|
use Apache::lonxml; |
use Apache::lonxml; |
use Apache::londefdef; |
use Apache::londefdef; |
use Apache::lonenc(); |
use Apache::lonenc(); |
|
use Apache::loncommon(); |
use Time::HiRes qw( gettimeofday tv_interval ); |
use Time::HiRes qw( gettimeofday tv_interval ); |
use lib '/home/httpd/lib/perl/'; |
use lib '/home/httpd/lib/perl/'; |
use LONCAPA; |
use LONCAPA; |
|
|
BEGIN { |
BEGIN { |
&Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startouttext','endouttext','simpleeditbutton','definetag')); |
&Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startpartmarker','startouttext','endpartmarker','endouttext','simpleeditbutton','definetag')); |
} |
} |
|
|
|
|
|
#--------------------------------------------------------------------------------- |
|
# |
|
# This section of code deals with hyphenation management. |
|
# We must do three things: |
|
# - keep track fo the desired languages to alter the header. |
|
# - provide hyphenation selection as needed by each language that appears in the |
|
# text. |
|
# - Provide the header text needed to make available the desired hyphenations. |
|
# |
|
# |
|
|
|
# Hash whose keys are the languages encountered in the document/resource. |
|
# |
|
|
|
my %languages_required; |
|
## |
|
# Given a language selection as input returns a chunk of LaTeX that |
|
# selects the required hyphenator. |
|
# |
|
# @param language - the language being selected. |
|
# @return string |
|
# @retval The LaTeX needed to select the hyphenation appropriate to the language. |
|
# |
|
sub select_hyphenation { |
|
my $language = shift; |
|
|
|
$language = &Apache::loncommon::latexlanguage($language); # Translate -> latex language. |
|
|
|
# If there is no latex language there's not much we can do: |
|
|
|
if ($language) { |
|
&require_language($language); |
|
my $babel_hyphenation = "\\selectlanguage{$language}"; |
|
|
|
return $babel_hyphenation; |
|
} else { |
|
return ''; |
|
} |
|
} |
|
## |
|
# Selects hyphenation based on the current problem metadata. |
|
# This requires that |
|
# - There is a language metadata item set for the problem. |
|
# - The language has a latex/babel hyphenation. |
|
# |
|
# @note: Uses &Apache::lonxml::request to locate the Uri associated with |
|
# this problem. |
|
# @return string (possibly empty). |
|
# @retval If not empty an appropriate \selectlanguage{} directive. |
|
# |
|
sub select_metadata_hyphenation { |
|
my $uri = $Apache::lonxml::request->uri; |
|
my $language = &Apache::lonnet::metadata($uri, 'language'); |
|
my $latex_language = &Apache::loncommon::latexhyphenation($language); |
|
if ($latex_language) { |
|
return '\selectlanguage{'.$latex_language."}\n"; |
|
} |
|
return ''; # no latex hyphenation or no lang metadata. |
|
} |
|
|
|
|
|
## |
|
# Clears the set of languages required by the document being rendered. |
|
# |
|
sub clear_required_languages { |
|
%languages_required = (); |
|
} |
|
## |
|
# Allows an external client of this module to register a need for a language: |
|
# |
|
# @param LaTeX language required: |
|
# |
|
sub require_language { |
|
my $language = shift; |
|
$languages_required{$language} = 1; |
|
} |
|
|
|
## |
|
# Provides the header for babel that indicates the languages |
|
# the document requires. |
|
# @return string |
|
# @retval \usepackage[lang1,lang2...]{babel} |
|
# @retval '' if there are no languages_required. |
|
sub languages_header { |
|
my $header =''; |
|
my @languages = (keys(%languages_required)); |
|
|
|
# Only generate the header if there are languages: |
|
|
|
if (scalar @languages) { |
|
my $language_list = join(',', (@languages)); |
|
$header = '\usepackage['.$language_list."]{babel}\n"; |
|
} |
|
return $header; |
|
} |
|
|
|
#---------------------------------------------------------------------------------- |
|
|
sub start_web { |
sub start_web { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
if ($target ne 'edit' && $target ne 'modified') { |
if ($target ne 'edit' && $target ne 'modified') { |
Line 125 sub end_tex {
|
Line 225 sub end_tex {
|
|
|
sub homework_js { |
sub homework_js { |
return &Apache::loncommon::resize_textarea_js(). |
return &Apache::loncommon::resize_textarea_js(). |
|
&Apache::loncommon::colorfuleditor_js(). |
&setmode_javascript(). |
&setmode_javascript(). |
<<'JS'; |
<<'JS'; |
<script type="text/javascript"> |
<script type="text/javascript"> |
function setSubmittedPart (part) { |
// <![CDATA[ |
this.document.lonhomework.submitted.value="part_"+part; |
function setSubmittedPart (part,prefix) { |
|
if (typeof(prefix) == 'undefined') { |
|
this.document.lonhomework.submitted.value="part_"+part; |
|
} else { |
|
for (var i=0;i<this.document.lonhomework.elements.length;i++) { |
|
if (this.document.lonhomework.elements[i].name == prefix+'submitted') { |
|
this.document.lonhomework.elements[i].value="part_"+part; |
|
} |
|
} |
|
} |
} |
} |
|
|
function image_response_click (which, e) { |
function image_response_click (which, e) { |
Line 146 function image_response_click (which, e)
|
Line 256 function image_response_click (which, e)
|
img_element.src = '/adm/randomlabel.png?token='+token+'&clickdata='+click; |
img_element.src = '/adm/randomlabel.png?token='+token+'&clickdata='+click; |
} |
} |
|
|
|
var submithandled = 0; |
|
var keypresshandled = 0; |
|
|
|
$(document).ready(function(){ |
|
|
|
$(document).keypress(function(event){ |
|
var keycode = (event.keyCode ? event.keyCode : event.which); |
|
if ((keycode == '13') && (keypresshandled == 0)) { |
|
if ( $( document.activeElement ).hasClass("LC_textline") ) { |
|
keypresshandled = 1; |
|
var idsArray = $( document.activeElement ).attr("id").split(/HWVAL_/); |
|
if (idsArray.length) { |
|
event.preventDefault(); |
|
var itemsArray = idsArray[1].split(/_/); |
|
var buttonId = idsArray[0]+'submit_'+itemsArray[0]; |
|
$("#"+buttonId).trigger("click"); |
|
} |
|
} |
|
} |
|
}); |
|
|
|
$(document).delegate('form :submit', 'click', function( event ) { |
|
if ( $( this ).hasClass( "LC_hwk_submit" ) ) { |
|
var buttonId = this.id; |
|
if (submithandled == 0) { |
|
submithandled = 1; |
|
$( "#msg_"+buttonId ).css({"display": "inline","background-color": "#87cefa", |
|
"color": "black","padding": "2px"}) ; |
|
if (( $(this.form).id == "LC_page" ) && ($('input[name="all_submit"]').length )) { |
|
if (buttonId != "all_submit") { |
|
$( ".LC_status_"+buttonId ).hide(); |
|
if (( "#"+buttonId+"_pressed" ).length) { |
|
$( "#"+buttonId+"_pressed" ).val( "1" ); |
|
} |
|
} |
|
} else { |
|
$( ".LC_status_"+buttonId ).hide(); |
|
} |
|
$(this.form).submit(); |
|
$( ".LC_hwk_submit" ).prop( "disabled", true); |
|
$( ".LC_textline" ).prop( "readonly", "readonly"); |
|
event.preventDefault(); |
|
return true; |
|
} |
|
} |
|
}); |
|
}); |
|
|
|
// ]]> |
</script> |
</script> |
JS |
JS |
} |
} |
Line 153 JS
|
Line 312 JS
|
sub setmode_javascript { |
sub setmode_javascript { |
return <<"ENDSCRIPT"; |
return <<"ENDSCRIPT"; |
<script type="text/javascript"> |
<script type="text/javascript"> |
|
// <![CDATA[ |
function setmode(form,probmode) { |
function setmode(form,probmode) { |
form.problemmode.value = probmode; |
form.problemmode.value = probmode; |
form.submit(); |
form.submit(); |
} |
} |
|
// ]]> |
</script> |
</script> |
ENDSCRIPT |
ENDSCRIPT |
} |
} |
Line 177 sub page_start {
|
Line 338 sub page_start {
|
$parstack,$parser,$safeeval); |
$parstack,$parser,$safeeval); |
} |
} |
|
|
$extra_head .= &homework_js(); |
$extra_head .= &homework_js(). |
|
&Apache::lonhtmlcommon::dragmath_js("EditMathPopup"); |
if ($env{'environment.wysiwygeditor'} eq 'on') { |
if (&Apache::lonhtmlcommon::htmlareabrowser()) { |
$extra_head .= &Apache::lonhtmlcommon::dragmath_js("FCKEditMathPopup"); |
my %textarea_args = ( |
|
dragmath => 'math', |
|
); |
|
$extra_head .= &Apache::lonhtmlcommon::htmlareaselectactive(\%textarea_args); |
|
} |
|
my $is_task = ($env{'request.uri'} =~ /\.task$/); |
|
my ($needs_upload,$partlist); |
|
my ($symb)= &Apache::lonnet::whichuser(); |
|
my ($map,$resid,$resurl)=&Apache::lonnet::decode_symb($symb); |
|
if ($is_task) { |
|
$extra_head .= &Apache::lonhtmlcommon::file_submissionchk_js(); |
} else { |
} else { |
$extra_head .= &Apache::lonhtmlcommon::dragmath_js("EditMathPopup"); |
if (&Apache::lonnet::EXT("resource.$Apache::inputtags::part.uploadedfiletypes") ne '') { |
|
unless ($env{'request.state'} eq 'construct') { |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
if (ref($navmap)) { |
|
my $mapres = $navmap->getResourceByUrl($map); |
|
my $is_page; |
|
if (ref($mapres)) { |
|
$is_page = $mapres->is_page(); |
|
} |
|
unless ($is_page) { |
|
$needs_upload = 1; |
|
} |
|
if ((ref($tagstack) eq 'ARRAY') && ($tagstack->[-1] eq 'problem')) { |
|
my $res = $navmap->getBySymb($symb); |
|
if (ref($res)) { |
|
$partlist = $res->parts(); |
|
} |
|
} |
|
} |
|
} |
|
} else { |
|
unless ($env{'request.state'} eq 'construct') { |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
if (ref($navmap)) { |
|
my $mapres = $navmap->getResourceByUrl($map); |
|
my $is_page; |
|
if (ref($mapres)) { |
|
$is_page = $mapres->is_page(); |
|
} |
|
if ($is_page) { |
|
if ((ref($tagstack) eq 'ARRAY') && ($tagstack->[-1] eq 'problem')) { |
|
my $res = $navmap->getBySymb($symb); |
|
if (ref($res)) { |
|
$partlist = $res->parts(); |
|
} |
|
} |
|
} else { |
|
my $res = $navmap->getBySymb($symb); |
|
if (ref($res)) { |
|
$partlist = $res->parts(); |
|
if (ref($partlist) eq 'ARRAY') { |
|
foreach my $part (@{$partlist}) { |
|
my @types = $res->responseType($part); |
|
my @ids = $res->responseIds($part); |
|
for (my $i=0; $i < scalar(@ids); $i++) { |
|
if ($types[$i] eq 'essay') { |
|
my $partid = $part.'_'.$ids[$i]; |
|
if (&Apache::lonnet::EXT("resource.$partid.uploadedfiletypes") ne '') { |
|
$needs_upload = 1; |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
if ($needs_upload) { |
|
$extra_head .= &Apache::lonhtmlcommon::file_submissionchk_js(); |
|
} |
} |
} |
|
|
my %body_args; |
my %body_args; |
Line 200 sub page_start {
|
Line 433 sub page_start {
|
"if (typeof swmenu != 'undefined') {swmenu.currentURL=null;}\n". |
"if (typeof swmenu != 'undefined') {swmenu.currentURL=null;}\n". |
&Apache::loncommon::browser_and_searcher_javascript(). |
&Apache::loncommon::browser_and_searcher_javascript(). |
"\n</script>\n"; |
"\n</script>\n"; |
|
if ($target eq 'edit') { |
|
$extra_head .= &Apache::edit::js_update_linknum(); |
|
} |
} |
} |
} |
} |
|
|
Line 209 sub page_start {
|
Line 445 sub page_start {
|
} elsif (!defined($found{'body'}) |
} elsif (!defined($found{'body'}) |
&& $env{'request.state'} eq 'construct') { |
&& $env{'request.state'} eq 'construct') { |
if ($target eq 'web' || $target eq 'edit') { |
if ($target eq 'web' || $target eq 'edit') { |
if ($env{'environment.remote'} ne 'off') { |
# Breadcrumbs for Authoring Space |
$body_args{'only_body'} = 1; |
&Apache::lonhtmlcommon::clear_breadcrumbs(); |
} |
&Apache::lonhtmlcommon::add_breadcrumb({ |
$pageheader = &Apache::lonhtmlcommon::breadcrumbs() # FIXME add breadcrumbs |
'text' => 'Authoring Space', |
.&Apache::loncommon::head_subbox( |
'href' => &Apache::loncommon::authorspace($env{'request.uri'}), |
|
}); |
|
# breadcrumbs (and tools) will be created |
|
# in start_page->bodytag->innerregister |
|
|
|
# FIXME Where are we? |
|
# &Apache::lonhtmlcommon::add_breadcrumb({ |
|
# 'text' => 'Problem Editing', # 'Problem Testing' |
|
# 'href' => '', |
|
# }); |
|
$pageheader =&Apache::loncommon::head_subbox( |
&Apache::loncommon::CSTR_pageheader()); |
&Apache::loncommon::CSTR_pageheader()); |
} |
} |
} elsif (!defined($found{'body'})) { |
} elsif (!defined($found{'body'})) { |
Line 232 sub page_start {
|
Line 478 sub page_start {
|
# $body_args{'no_title'} = 1; |
# $body_args{'no_title'} = 1; |
$body_args{'force_register'} = 1; |
$body_args{'force_register'} = 1; |
$body_args{'add_entries'} = \%add_entries; |
$body_args{'add_entries'} = \%add_entries; |
if ($env{'environment.remote'} eq 'off' |
if ( $env{'request.state'} eq 'construct') { |
&& $env{'request.state'} eq 'construct') { |
|
$body_args{'only_body'} = 1; |
$body_args{'only_body'} = 1; |
|
} elsif ($target eq 'web') { |
|
$body_args{'print_suppress'} = 1; |
} |
} |
} |
} |
$body_args{'no_auto_mt_title'} = 1; |
$body_args{'no_auto_mt_title'} = 1; |
Line 246 sub page_start {
|
Line 493 sub page_start {
|
&& ($target eq 'web' || $target eq 'webgrade')) { |
&& ($target eq 'web' || $target eq 'webgrade')) { |
|
|
my ($symb,undef,undef,undef,$publicuser)= &Apache::lonnet::whichuser(); |
my ($symb,undef,undef,undef,$publicuser)= &Apache::lonnet::whichuser(); |
if ($symb eq '' && !$publicuser) { |
if ($symb eq '' && !$publicuser) { |
my $help = &Apache::loncommon::help_open_topic("Ambiguous_Reference"); |
$page_start .= '<p class="LC_info">' |
$help=&mt("Browsing resource, all submissions are temporary.")."<br />"; |
.&mt('Browsing resource, all submissions are temporary.') |
$page_start .= $help; |
.'</p>'; |
} |
} |
} |
} |
|
|
if (!defined($found{'body'}) && $env{'request.state'} ne 'construct') { |
if (!defined($found{'body'}) && $env{'request.state'} ne 'construct') { |
$page_start .= &Apache::lonxml::message_location(); |
$page_start .= &Apache::lonxml::message_location(); |
} |
} |
|
|
my $form_tag_start; |
my $form_tag_start; |
if (!defined($found{'form'})) { |
if (!defined($found{'form'})) { |
$form_tag_start='<form name="lonhomework" enctype="multipart/form-data" method="post" action="'; |
$form_tag_start='<form name="lonhomework" enctype="multipart/form-data" method="post" action="'; |
my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'}); |
my $uri = &Apache::loncommon::inhibit_menu_check( |
|
&Apache::lonenc::check_encrypt($env{'request.uri'})); |
|
$uri = &HTML::Entities::encode($uri,'<>&"'); |
$form_tag_start.=$uri.'" '; |
$form_tag_start.=$uri.'" '; |
if ($target eq 'edit') { |
if ($target eq 'edit') { |
$form_tag_start.=&Apache::edit::form_change_detection(); |
$form_tag_start.=&Apache::edit::form_change_detection(); |
} |
} |
|
my ($symb,$courseid,$udom,$uname)=&Apache::lonnet::whichuser(); |
|
my ($path,$multiresp) = |
|
&Apache::loncommon::get_turnedin_filepath($symb,$uname,$udom); |
|
if (($is_task) || ($needs_upload)) { |
|
$form_tag_start .= ' onsubmit="return file_submission_check(this,'."'$path','$multiresp'".');"'; |
|
} |
$form_tag_start.='>'."\n"; |
$form_tag_start.='>'."\n"; |
|
|
my $symb=&Apache::lonnet::symbread(); |
|
if ($symb =~ /\S/) { |
if ($symb =~ /\S/) { |
$symb= |
$symb= |
&HTML::Entities::encode(&Apache::lonenc::check_encrypt($symb)); |
&HTML::Entities::encode(&Apache::lonenc::check_encrypt($symb)); |
Line 275 sub page_start {
|
Line 528 sub page_start {
|
"\t".'<input type="hidden" name="symb" value="'.$symb.'" />'."\n"; |
"\t".'<input type="hidden" name="symb" value="'.$symb.'" />'."\n"; |
} |
} |
} |
} |
return ($page_start,$form_tag_start); |
return ($page_start,$form_tag_start,$partlist); |
} |
} |
|
|
#use Time::HiRes(); |
#use Time::HiRes(); |
Line 306 sub get_resource_name {
|
Line 559 sub get_resource_name {
|
} |
} |
|
|
sub setup_rndseed { |
sub setup_rndseed { |
my ($safeeval)=@_; |
my ($safeeval,$target,$probpartlist)=@_; |
my $rndseed; |
|
my ($symb)=&Apache::lonnet::whichuser(); |
my ($symb)=&Apache::lonnet::whichuser(); |
|
my ($questiontype,$set_safespace,$rndseed); |
|
if ($target eq 'analyze') { |
|
$questiontype = $env{'form.grade_questiontype'}; |
|
} |
|
unless (defined($questiontype)) { |
|
$questiontype = $Apache::lonhomework::type; |
|
} |
if ($env{'request.state'} eq "construct" |
if ($env{'request.state'} eq "construct" |
|| $symb eq '' |
|| $symb eq '' |
|| $Apache::lonhomework::type eq 'practice' |
|| $Apache::lonhomework::type eq 'practice' |
Line 323 sub setup_rndseed {
|
Line 582 sub setup_rndseed {
|
} |
} |
$env{'form.rndseed'}=$rndseed; |
$env{'form.rndseed'}=$rndseed; |
} |
} |
|
if (($env{'request.state'} eq "construct") && |
|
($Apache::lonhomework::type eq 'randomizetry')) { |
|
my $tries = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"}; |
|
if ($tries) { |
|
$rndseed += $tries; |
|
} |
|
$env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed; |
|
} |
if ( ($env{'form.resetdata'} eq &mt('New Problem Variation') |
if ( ($env{'form.resetdata'} eq &mt('New Problem Variation') |
&& $env{'form.submitted'} eq 'yes') || |
&& $env{'form.submitted'} eq 'yes') || |
$env{'form.newrandomization'} eq &mt('New Randomization')) { |
$env{'form.newrandomization'} eq &mt('New Randomization')) { |
Line 332 sub setup_rndseed {
|
Line 599 sub setup_rndseed {
|
delete($env{'form.resetdata'}); |
delete($env{'form.resetdata'}); |
delete($env{'form.newrandomization'}); |
delete($env{'form.newrandomization'}); |
} |
} |
if (defined($rndseed) && $rndseed ne int($rndseed)) { |
$rndseed=~s/\,/\:/g; |
$rndseed=join(':',&Apache::lonnet::digest($rndseed)); |
$rndseed=~s/[^\w\d\:\-]//g; |
|
if (defined($rndseed)) { |
|
my ($c1,$c2)=split(/\:/,$rndseed); |
|
unless ($c2) { $c2=0; } |
|
unless (($c1==int($c1)) && ($c2==int($c2))) { |
|
$rndseed=join(':',&Apache::lonnet::digest($rndseed)); |
|
} |
} |
} |
if ($Apache::lonhomework::history{'resource.CODE'}) { |
if ($Apache::lonhomework::history{'resource.CODE'}) { |
$rndseed=&Apache::lonnet::rndseed(); |
$rndseed=&Apache::lonnet::rndseed(); |
} |
} |
if ($safeeval) { |
$set_safespace = 1; |
&Apache::lonxml::debug("Setting rndseed to $rndseed"); |
} elsif ($questiontype eq 'randomizetry') { |
&Apache::run::run('$external::randomseed="'.$rndseed.'";',$safeeval); |
if ($target eq 'analyze') { |
} |
if (defined($env{'form.grade_rndseed'})) { |
|
$rndseed = $env{'form.grade_rndseed'}; |
|
} |
|
} |
|
unless (($target eq 'analyze') && (defined($rndseed))) { |
|
$rndseed=&Apache::lonnet::rndseed(); |
|
my $partfortries = $Apache::inputtags::part; |
|
if (ref($probpartlist) eq 'ARRAY') { |
|
if ((@{$probpartlist} == 1) && ($probpartlist->[0] ne $Apache::inputtags::part)) { |
|
$partfortries = $probpartlist->[0]; |
|
} |
|
} |
|
my $curr_try = $Apache::lonhomework::history{"resource.$partfortries.tries"}; |
|
if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') { |
|
$curr_try ++; |
|
} |
|
if ($rndseed =~/^(\d+)[,:](\d+)$/) { |
|
$rndseed = $1; |
|
} |
|
if ($curr_try) { |
|
my $reqtries = &Apache::lonnet::EXT("resource.$partfortries.randomizeontries"); |
|
if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) { |
|
my $inc = int(($curr_try-1)/$reqtries); |
|
$rndseed += $inc; |
|
} else { |
|
$rndseed += $curr_try; |
|
} |
|
} |
|
} |
|
$set_safespace = 1; |
|
if ($target eq 'grade') { |
|
$Apache::lonhomework::rawrndseed = $rndseed; |
|
} |
|
} |
|
if ($set_safespace) { |
|
if ($safeeval) { |
|
&Apache::lonxml::debug("Setting rndseed to $rndseed"); |
|
&Apache::run::run('$external::randomseed="'.$rndseed.'";',$safeeval); |
|
} |
|
} |
|
unless (($env{'request.state'} eq "construct") || ($symb eq '')) { |
|
$env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed; |
} |
} |
return $rndseed; |
return $rndseed; |
} |
} |
Line 353 sub remember_problem_state {
|
Line 667 sub remember_problem_state {
|
<input type="hidden" name="problemstatus" value="'.$env{'form.problemstatus'}.'" />'; |
<input type="hidden" name="problemstatus" value="'.$env{'form.problemstatus'}.'" />'; |
} |
} |
|
|
|
sub problem_edit_action_button { |
|
my ($name,$action,$accesskey,$text,$flag)=@_; |
|
my $actionscript="setmode(this.form,'$action')"; |
|
return "\n<input type='button' name='$name' accesskey='$accesskey' value='".&mt($text)."'". |
|
($flag?&Apache::edit::submit_ask_anyway($actionscript):&Apache::edit::submit_dont_ask($actionscript))." />"; |
|
} |
|
|
sub problem_edit_buttons { |
sub problem_edit_buttons { |
return ' |
my ($mode)=@_; |
<div class="LC_edit_problem_discards"> |
# Buttons that do not save |
<input type="button" name="submitmode" accesskey="d" value="'.&mt('Discard Edits and View').'" '. |
my $result='<div class="LC_edit_problem_discards">'. |
' onclick="javscript:setmode(this.form,'."'discard'".')" /> |
&problem_edit_action_button('subdiscview','discard','d','Discard Edits and View',1); |
<input '.&Apache::edit::submit_ask_anyway('setmode(this.form,'."'editxml'".')').' type="button" name="submitmode" accesskey="x" value="'.&mt('EditXML').'" /> |
if ($mode eq 'editxml') { |
<input type="submit" name="Undo" accesskey="u" value="'.&mt('undo').'" /> |
$result.=&problem_edit_action_button('subedit','edit','e','Edit',1); |
</div> |
$result.=&problem_edit_action_button('subundo','undoxml','u','Undo',1); |
<div class="LC_edit_problem_saves"> |
$result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1); |
<input type="submit" name="submitbutton" accesskey="s" value="'.&mt('Save and Edit').'" /> |
} else { |
<input type="submit" name="submitbutton" accesskey="v" value="'.&mt('Save and View').'" /> |
$result.=&problem_edit_action_button('subeditxml','editxml','x','EditXML',1); |
</div>'; |
$result.=&problem_edit_action_button('subundo','undo','u','Undo',1); |
|
} |
|
$result.="\n</div>"; |
|
# Buttons that save |
|
$result.='<div class="LC_edit_problem_saves">'; |
|
if ($mode eq 'editxml') { |
|
$result.=&problem_edit_action_button('subsaveedit','saveeditxml','s','Save and EditXML'); |
|
$result.=&problem_edit_action_button('subsaveview','saveviewxml','v','Save and View'); |
|
} else { |
|
$result.=&problem_edit_action_button('subsaveedit','saveedit','s','Save and Edit'); |
|
$result.=&problem_edit_action_button('subsaveview','saveview','v','Save and View'); |
|
} |
|
$result.="\n</div>\n"; |
|
return $result; |
|
} |
|
|
|
sub insert_menu_datastructure { |
|
|
|
my $template_menu = &template_dropdown_datastructure(); |
|
my $responseblock_menu = &responseblock_dropdown_datastructure(); |
|
my $conditional_scripting = &conditional_scripting_datastructure(); |
|
my $misc = &misc_datastructure(); |
|
|
|
my @menu = ($template_menu, $responseblock_menu, $conditional_scripting, $misc); |
|
return \@menu; |
|
|
|
} |
|
|
|
sub template_dropdown_datastructure { |
|
# gathering the all templates and their path, title, category and help topic |
|
my @templates = &Apache::lonhomework::get_template_list('problem'); |
|
# template category => title |
|
my %tmplthash = (); |
|
# template title => path |
|
my %tmpltcontent = (); |
|
|
|
foreach my $template (@templates){ |
|
# put in hash if the template is not empty |
|
unless ($template->[1] eq ''){ |
|
push(@{$tmplthash{$template->[2]}}, $template->[1]); |
|
push(@{$tmpltcontent{$template->[1]}},$template->[0]); |
|
} |
|
} |
|
|
|
my $catList = []; |
|
foreach my $cat (sort keys %tmplthash) { |
|
my $catItems = []; |
|
foreach my $title (sort @{$tmplthash{$cat}}) { |
|
my $path = $tmpltcontent{$title}->[0]; |
|
my $code; |
|
open(FH, "<$path"); |
|
while(<FH>){ |
|
$code.= $_ unless $_ =~ /(<problem>)|(<\/problem>)/; |
|
} |
|
close(FH); |
|
|
|
if ($code ne '') { |
|
my $href = 'javascript:insertText(\'' . &convert_for_js(&HTML::Entities::encode($code)) . '\')'; |
|
my $currItem = [$href, $title, undef]; |
|
push @{$catItems}, $currItem; |
|
} |
|
} |
|
push @{$catList}, [$catItems, $cat, undef]; |
|
} |
|
|
|
my $templDropdown = [$catList, &mt("Complete Problem Templates"), undef]; |
|
return $templDropdown; |
|
} |
|
|
|
sub responseblock_dropdown_datastructure { |
|
|
|
my $mathCat = [ |
|
[ |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_formularesponse())) . "\')", &mt("Formula Response"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_functionplotresponse())) . "\')", &mt("Function Plot Response"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_mathresponse())) . "\')", &mt("Math Response"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_numericalresponse())) . "\')", &mt("Numerical Response"), undef] |
|
], |
|
&mt("Math"), |
|
undef |
|
]; |
|
|
|
my $miscCat = [ |
|
[ |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_imageresponse())) . "\')", &mt("Click on Image"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_customresponse())) . "\')", &mt("Custom Response"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_externalresponse())) . "\')", &mt("External Response"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_matchresponse())) . "\')", &mt("Match Response"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_radiobuttonresponse())) . "\')", &mt("One out of N Statement"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_optionresponse())) . "\')", &mt("Optionresponse"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_rankresponse())) . "\')", &mt("Rank Values"), undef] |
|
], |
|
&mt("Misc"), |
|
undef |
|
]; |
|
|
|
my $chemCat = [ |
|
[ |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_reactionresponse())) . "\')", &mt("Chemical Reaction"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_organicresponse())) . "\')", &mt("Organic Structure"), undef] |
|
], |
|
&mt("Chemical"), |
|
undef |
|
]; |
|
|
|
my $textCat = [ |
|
[ |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_stringresponse())) . "\')", &mt("String Response"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_essayresponse())) . "\')", &mt("Essay"), undef] |
|
], |
|
&mt("Text"), |
|
undef |
|
]; |
|
|
|
my $cats = [[$mathCat, $miscCat, $chemCat, $textCat], &mt("Response Types"), undef]; |
|
return $cats; |
|
} |
|
|
|
|
|
sub conditional_scripting_datastructure { |
|
# TODO: corresponding routines should be used for the javascript:insertText parts |
|
# instead of the placeholder routine default_xml_tag with the tags |
|
# e.g. &default_xml_tag("postanswerdate") should be replaced with a routine which |
|
# returns the corresponding content for this case |
|
|
|
#TODO translated is currently temporarily here, another solution should be found where the |
|
# needed string can be retrieved |
|
|
|
my $translatedTag = ' |
|
<translated> |
|
<lang which="en"></lang> |
|
<lang which="default"></lang> |
|
</translated>'; |
|
|
|
my $cat = [ |
|
[ |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode($translatedTag)) . "\')", &mt("Translated Tag"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("block"))) . "\')", &mt("Conditional Block"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("postanswerdate"))) . "\')", &mt("After Answer Block"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("preduedate"))) . "\')", &mt("Before Due Date Block"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("solved"))) . "\')", &mt("Block For After Solved"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("notsolved"))) . "\')", &mt("Block For When Not Solved"), undef] |
|
], |
|
&mt("Contitional Scripting"), |
|
undef |
|
]; |
|
|
|
return $cat; |
|
} |
|
|
|
sub misc_datastructure { |
|
|
|
my $graphicalCat = [ |
|
[ |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_img())) . "\')", &mt("Image"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::lonplot::insert_gnuplot())) . "\')", &mt("GNU Plot"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_organicstructure())) . "\')", &mt("Organic Structure"), undef] |
|
], |
|
"Graphical", |
|
undef |
|
]; |
|
|
|
my $advancedCat = [ |
|
[ |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::edit::insert_script())) . "\')", &mt("Script Block"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("allow"))) . "\')", &mt("File Dependencies"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&default_xml_tag("import"))) . "\')", &mt("Import a File"), undef], |
|
["javascript:insertText(\'" . &convert_for_js(&HTML::Entities::encode(&Apache::londefdef::insert_meta())) . "\')", &mt("Custom Metadata"), undef] |
|
], |
|
"advanced", |
|
undef |
|
]; |
|
|
|
my $cats = [[$graphicalCat, $advancedCat], &mt("misc"), undef]; |
|
return $cats; |
|
} |
|
|
|
# helper routine for the datastructure building subroutines |
|
sub default_xml_tag { |
|
my ($tag) = @_; |
|
return "\n<$tag></$tag>"; |
|
} |
|
|
|
|
|
sub helpmenu_datastructure { |
|
|
|
my $width = 500; |
|
my $height = 600; |
|
|
|
my $helpers = [ |
|
['Problem_LON-CAPA_Functions', &mt('Script Functions')], |
|
['Greek_Symbols', &mt('Greek Symbols')], |
|
['Other_Symbols', &mt('Other Symbols')], |
|
['Authoring_Output_Tags', &mt('Output Tags')], |
|
['Authoring_Multilingual_Problems', |
|
&mt('How to create problems in different languages')] |
|
]; |
|
|
|
my $help_structure = []; |
|
|
|
foreach my $count (0..(scalar(@{$helpers})-1)) { |
|
my $filename = $helpers->[$count]->[0]; |
|
my $title = $helpers->[$count]->[1]; |
|
my $href = &HTML::Entities::encode("javascript:openMyModal('/adm/help/$filename.hlp',$width,$height,'yes');"); |
|
push @{$help_structure}, [$href, $title, undef]; |
|
} |
|
|
|
return $help_structure; |
|
} |
|
|
|
# we need substitution to not break javascript code |
|
sub convert_for_js { |
|
my $return = shift; |
|
$return =~ s|script|ESCAPEDSCRIPT|g; |
|
$return =~ s|\n|\\r\\n|g; |
|
$return =~ s|'|\\'|g; |
|
$return =~ s|'|\\'|g; |
|
return $return; |
} |
} |
|
|
sub problem_edit_header { |
sub problem_edit_header { |
return '<input type="hidden" name="submitted" value="edit" /><input type="hidden" name="problemmode" value="edit" />'. |
my ($mode)=@_; |
&Apache::structuretags::remember_problem_state().' |
my $return = '<input type="hidden" name="submitted" value="edit" />'. |
<div class="LC_edit_problem_header"> |
&remember_problem_state('edit').' |
<div class="LC_edit_problem_header_title"> |
<div class="LC_edit_problem_header"> |
'.&mt('Problem Editing').&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').' |
<div class="LC_edit_problem_header_title"> |
</div>'. |
'.&mt('Problem Editing').$mode.&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').' |
&problem_edit_buttons().' |
</div><div class="LC_edit_actionbar" id="actionbar">'. |
<hr class="LC_edit_problem_divide" /> |
'<input type="hidden" name="problemmode" value="saveedit" />'. |
'.&Apache::lonxml::message_location().' |
&problem_edit_buttons(); |
</div> |
|
'. |
$return.='<hr style="clear:both;visibility:hidden;" /> |
'<table border="0" width="100%"><tr><td bgcolor="#DDDDDD">'; |
</div></div>' |
|
.&Apache::lonxml::message_location(); |
|
$return .= '<link rel="stylesheet" href="/adm/codemirror/codemirror-combined.css" /> |
|
<script type="text/javascript" src="/adm/codemirror/codemirror-compressed-colorful.js"></script>'; |
|
|
|
$return .= '<script type="text/javascript" src="/adm/jQuery/addons/jquery-scrolltofixed.js"></script> |
|
<script type="text/javascript"> |
|
// unless internet explorer |
|
if (!(window.navigator.appName == "Microsoft Internet Explorer" && (document.documentMode || document.compatMode))){ |
|
$(document).ready( |
|
function() { |
|
$(\'.LC_edit_actionbar\').scrollToFixed( |
|
{ |
|
fixed: function(){ |
|
$(this).find(\'.LC_edit_actionbar\').css(\'height\', \'31px\'); |
|
} |
|
} |
|
); |
|
} |
|
); |
|
} |
|
</script> |
|
<table id="LC_edit_problem_colorful" border="0" width="100%"><tr><td bgcolor="#F8F8F8">'; |
|
return $return; |
} |
} |
|
|
sub problem_edit_footer { |
sub problem_edit_footer { |
|
my $resource = $env{'request.ambiguous'}; |
return '</td></tr></table><br /> |
return '</td></tr></table><br /> |
<div class="LC_edit_problem_footer"> |
<div class="LC_edit_problem_footer"> |
<hr class="LC_edit_problem_divide" />'. |
<hr />'. |
&problem_edit_buttons().' |
&problem_edit_buttons().' |
<hr class="LC_edit_problem_divide" /> |
<hr style="clear:both;" /> |
|
<script type="text/javascript"> |
|
restoreState("'.$resource.'"); |
|
restoreScrollPosition("'.$resource.'"); |
|
</script> |
</div> |
</div> |
'. |
'. |
|
|
&Apache::lonhtmlcommon::htmlareaselectactive(&Apache::lonhtmlcommon::get_htmlareafields()). |
|
"\n</form>\n".&Apache::loncommon::end_page(); |
"\n</form>\n".&Apache::loncommon::end_page(); |
} |
} |
|
|
Line 424 sub problem_web_to_edit_header {
|
Line 988 sub problem_web_to_edit_header {
|
|
|
my $show_all_foils_text = |
my $show_all_foils_text = |
($Apache::lonhomework::parsing_a_task) ? |
($Apache::lonhomework::parsing_a_task) ? |
&mt(' Show All Instances') |
&mt('Show All Instances') |
: &mt(' Show All Foils'); |
: &mt('Show All Foils'); |
|
|
my $show_all= '<span class="LC_nobreak"><label><input type="checkbox" name="showallfoils"'; |
my $show_all= '<span class="LC_nobreak"><label for="showallfoils">' |
|
.'<input type="checkbox" name="showallfoils"'; |
if (defined($env{'form.showallfoils'})) { $show_all.=' checked="checked"'; } |
if (defined($env{'form.showallfoils'})) { $show_all.=' checked="checked"'; } |
$show_all.= ' />'.$show_all_foils_text.'</label></span>'; |
$show_all.= ' /> '.$show_all_foils_text |
|
.'</label></span>'; |
|
|
|
|
|
|
Line 452 sub problem_web_to_edit_header {
|
Line 1018 sub problem_web_to_edit_header {
|
".&mt("Problem Type:")." |
".&mt("Problem Type:")." |
<select name='problemtype'> |
<select name='problemtype'> |
<option value=''></option> |
<option value=''></option> |
".&option('exam' ,'problemtype').&mt("Exam Problem")."</option> |
".&option('exam' ,'problemtype').&mt("Bubblesheet Exam Problem")."</option> |
".&option('problem','problemtype').&mt("Homework Problem")."</option> |
".&option('problem','problemtype').&mt("Homework Problem")."</option> |
".&option('survey' ,'problemtype').&mt("Survey Question")."</option> |
".&option('survey' ,'problemtype').&mt("Survey Question")."</option> |
|
".&option('surveycred' ,'problemtype').&mt("Survey Question (with credit)")."</option> |
|
".&option('anonsurvey' ,'problemtype').&mt("Anonymous Survey Question")."</option> |
|
".&option('anonsurveycred' ,'problemtype').&mt("Anonymous Survey Question (with credit)")."</option> |
".&option('practice' ,'problemtype').&mt("Practice Problem")."</option> |
".&option('practice' ,'problemtype').&mt("Practice Problem")."</option> |
|
".&option('randomizetry' ,'problemtype').&mt("New Randomization Each Try")."</option> |
</select> |
</select> |
</span> |
</span> |
$show_all |
$show_all |
Line 466 $show_all
|
Line 1036 $show_all
|
<select name='problemstatus'> |
<select name='problemstatus'> |
<option value=''></option> |
<option value=''></option> |
".&option('yes','problemstatus').&mt("Show Feedback")."</option> |
".&option('yes','problemstatus').&mt("Show Feedback")."</option> |
".&option('no', 'problemstatus').&mt("Don't Show Incorect/Correct Feedback")."</option> |
".&option('no', 'problemstatus').&mt("Don't Show Incorrect/Correct Feedback")."</option> |
".&option('no_feedback_ever', 'problemstatus').&mt("Don't Show Any Feedback")."</option> |
".&option('no_feedback_ever', 'problemstatus').&mt("Don't Show Any Feedback")."</option> |
</select> |
</select> |
</span> |
</span> |
Line 502 $show_all
|
Line 1072 $show_all
|
<input type="submit" name="clear_style_file" accesskey="d" value="'.&mt('Show Default View').'" /> |
<input type="submit" name="clear_style_file" accesskey="d" value="'.&mt('Show Default View').'" /> |
<input type="submit" name="resetdata" accesskey="r" value="'.&mt('Reset Submissions').'" /> |
<input type="submit" name="resetdata" accesskey="r" value="'.&mt('Reset Submissions').'" /> |
</div> |
</div> |
<hr class="LC_edit_problem_divide" /> |
<hr /> |
<div class="LC_edit_problem_header_randomize_row"> |
<div class="LC_edit_problem_header_randomize_row"> |
<input type="submit" name="newrandomization" accesskey="a" value="'.&mt('New Randomization').'" /> |
<input type="submit" name="newrandomization" accesskey="a" value="'.&mt('New Randomization').'" /> |
<input type="submit" name="changerandseed" value="'.&mt('Change Random Seed To:').'" /> |
<input type="submit" name="changerandseed" value="'.&mt('Change Random Seed To:').'" /> |
<input type="text" name="rndseed" size="10" value="'. |
<input type="text" name="rndseed" size="24" value="'. |
$rndseed.'" |
$rndseed.'" |
onchange="javascript:document.lonhomework.changerandseed.click()" />'; |
onchange="javascript:document.lonhomework.changerandseed.click()" />'; |
|
|
Line 526 $show_all
|
Line 1096 $show_all
|
|
|
$result.=' |
$result.=' |
</div> |
</div> |
<hr class="LC_edit_problem_divide" /> |
<hr /> |
<div>'; |
<div>'; |
$result.='<input type="hidden" name="problemmode" value="view" />'; |
$result.='<input type="hidden" name="problemmode" value="view" />'; |
$result .= '<input type="button" name="submitmode" accesskey="e" value="'.&mt('Edit').'" '. |
$result .= '<input type="button" name="submitmode" accesskey="e" value="'.&mt('Edit').'" '. |
Line 535 $show_all
|
Line 1105 $show_all
|
'onclick="javascript:setmode(this.form,'."'editxml'".')" />'; |
'onclick="javascript:setmode(this.form,'."'editxml'".')" />'; |
$result.=' |
$result.=' |
</div> |
</div> |
<hr class="LC_edit_problem_divide" /> |
<hr /> |
'.&Apache::lonxml::message_location().' |
'.&Apache::lonxml::message_location().' |
</div>'; |
</div>'; |
return $result; |
return $result; |
Line 568 sub initialize_storage {
|
Line 1138 sub initialize_storage {
|
} |
} |
%Apache::lonhomework::history= |
%Apache::lonhomework::history= |
&Apache::lonnet::tmprestore($namespace,'',$domain,$name); |
&Apache::lonnet::tmprestore($namespace,'',$domain,$name); |
my ($temp)=keys %Apache::lonhomework::history ; |
my ($temp)=keys(%Apache::lonhomework::history) ; |
&Apache::lonxml::debug("Return message of $temp"); |
&Apache::lonxml::debug("Return message of $temp"); |
} else { |
} else { |
%Apache::lonhomework::history= |
%Apache::lonhomework::history= |
Line 576 sub initialize_storage {
|
Line 1146 sub initialize_storage {
|
} |
} |
|
|
#ignore error conditions |
#ignore error conditions |
my ($temp)=keys %Apache::lonhomework::history ; |
my ($temp)=keys(%Apache::lonhomework::history); |
if ($temp =~ m/^error:.*/) { %Apache::lonhomework::history=(); } |
if ($temp =~ m/^error:.*/) { %Apache::lonhomework::history=(); } |
} |
} |
|
|
Line 584 sub initialize_storage {
|
Line 1154 sub initialize_storage {
|
|
|
=item finalize_storage() |
=item finalize_storage() |
|
|
Stores away the result has to a student's environment |
Stores away the result hash to a student's environment; |
checks form.grade_ for specific values, other wises stores |
checks form.grade_ for specific values, otherwise stores |
to the running users environment |
to the running user's environment. |
Will increment totals for attempts, students, and corrects |
|
if running user has student role. |
&check_correctness_changes() is called in two circumstances |
|
in which the results hash is to be stored permanently, for |
|
grading triggered by a student's submission, where feedback on |
|
correctness is to be provided to the student. |
|
|
|
1. Immediately prior to storing the results hash |
|
|
|
To handle the case where a student's submission (and award) were |
|
stored after history was retrieved in &initialize_storage(), e.g., |
|
if a student submitted answers in quick succession (e.g., from |
|
multiple tabs). &Apache::inputtags::hidealldata() is called for |
|
any parts with out-of-order storage (i.e., correct then incorrect, |
|
where awarded >= 1 when correct). |
|
|
|
2. Immediately after storing the results hash |
|
|
|
To handle the case where lond on the student's homeserver returns |
|
delay:N -- where N is the number of transactions between the last |
|
retrieved in &initialize_storage() and the last stored immediately |
|
before permanent storage of the current transaction via |
|
lond::store_handler(). &Apache::grades::makehidden() is called |
|
for any parts with out-of-order storage (i.e., correct then incorrect, |
|
where awarded >= 1 when correct). |
|
|
|
Will call &store_aggregates() to increment totals for attempts, |
|
students, and corrects, if running user has student role. |
|
|
=cut |
=cut |
|
|
|
|
Line 610 sub finalize_storage {
|
Line 1205 sub finalize_storage {
|
$namespace,'',$domain,$name); |
$namespace,'',$domain,$name); |
&Apache::lonxml::debug('Construct Store return message:'.$result); |
&Apache::lonxml::debug('Construct Store return message:'.$result); |
} else { |
} else { |
|
my ($laststore,$checkedparts,@parts,%postcorrect); |
|
if (($env{'user.name'} eq $name) && ($env{'user.domain'} eq $domain) && |
|
(!$Apache::lonhomework::scantronmode) && (!defined($env{'form.grade_symb'})) && |
|
(!defined($env{'form.grade_courseid'}))) { |
|
if ($Apache::lonhomework::history{'version'}) { |
|
$laststore = $Apache::lonhomework::history{'version'}.'='. |
|
$Apache::lonhomework::history{'timestamp'}; |
|
} else { |
|
$laststore = '0=0'; |
|
} |
|
my %record = &Apache::lonnet::restore($symb,$courseid,$domain,$name); |
|
if ($record{'version'}) { |
|
my ($newversion,$oldversion,$oldtimestamp); |
|
if ($Apache::lonhomework::history{'version'}) { |
|
$oldversion = $Apache::lonhomework::history{'version'}; |
|
$oldtimestamp = $Apache::lonhomework::history{'timestamp'}; |
|
} else { |
|
$oldversion = 0; |
|
$oldtimestamp = 0; |
|
} |
|
if ($record{'version'} > $oldversion) { |
|
if ($record{'timestamp'} >= $oldtimestamp) { |
|
$laststore = $record{'version'}.'='.$record{'timestamp'}; |
|
$newversion = $record{'version'} + 1; |
|
$checkedparts = 1; |
|
foreach my $key (keys(%Apache::lonhomework::results)) { |
|
if ($key =~ /^resource\.([^\.]+)\.solved$/) { |
|
my $part = $1; |
|
if ($Apache::lonhomework::results{$key} eq 'incorrect_attempted') { |
|
push(@parts,$part); |
|
} |
|
} |
|
} |
|
if (@parts) { |
|
my @parts_to_hide = &check_correctness_changes($symb,$courseid,$domain,$name, |
|
\%record,\@parts,$newversion, |
|
$oldversion); |
|
if (@parts_to_hide) { |
|
foreach my $part (@parts_to_hide) { |
|
$postcorrect{$part} = 1; |
|
&Apache::inputtags::hidealldata($part); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
$result=&Apache::lonnet::cstore(\%Apache::lonhomework::results, |
$result=&Apache::lonnet::cstore(\%Apache::lonhomework::results, |
$symb,$courseid,$domain,$name); |
$symb,$courseid,$domain,$name,$laststore); |
&Apache::lonxml::debug('Store return message:'.$result); |
if ($result =~ /^delay\:(\d+)$/) { |
if ($env{'request.role'} =~/^st/) { |
my $numtrans = $1; |
&store_aggregates($symb,$courseid); |
my ($oldversion) = split(/=/,$laststore); |
|
if ($numtrans) { |
|
my $newversion = $oldversion + 1 + $numtrans; |
|
my @possparts; |
|
if ($checkedparts) { |
|
foreach my $part (@parts) { |
|
unless ($postcorrect{$part}) { |
|
push(@possparts,$part); |
|
} |
|
} |
|
} else { |
|
foreach my $key (keys(%Apache::lonhomework::results)) { |
|
if ($key =~ /^resource\.([^\.]+)\.solved$/) { |
|
my $part = $1; |
|
unless ($postcorrect{$part}) { |
|
if ($Apache::lonhomework::results{$key} eq 'incorrect_attempted') { |
|
push(@possparts,$part); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
if (@possparts) { |
|
my %newrecord = &Apache::lonnet::restore($symb,$courseid,$domain,$name); |
|
my @parts_to_hide = &check_correctness_changes($symb,$courseid,$domain,$name, |
|
\%newrecord,\@possparts,$newversion, |
|
$oldversion); |
|
if (@parts_to_hide) { |
|
my $partslist = join(',',@parts_to_hide); |
|
&Apache::grades::makehidden($newversion,$partslist,\%newrecord,$symb,$domain,$name,1); |
|
} |
|
} |
|
} |
} |
} |
|
&Apache::lonxml::debug('Store return message:'.$result); |
|
&store_aggregates($symb,$courseid); |
} |
} |
} else { |
} else { |
&Apache::lonxml::debug('Nothing to store'); |
&Apache::lonxml::debug('Nothing to store'); |
Line 625 sub finalize_storage {
|
Line 1302 sub finalize_storage {
|
|
|
=pod |
=pod |
|
|
|
=item check_correctness_changes() |
|
|
|
For all parts for which current results contain a solved status |
|
of "incorrect_attempted", check if there was a transaction in which |
|
solved was set to "correct_by_student" in the time since the last |
|
transaction (retrieved when &initialize_storage() was called i.e., |
|
when &start_problem() was called), unless: |
|
(a) questiontype parameter is set to survey or anonymous survey (+/- credit) |
|
(b) problemstatus is set to no or no_feedback_ever |
|
If such a transaction exists, and did not occur after "reset status" |
|
by a user with grading privileges, then the current transaction is an |
|
example of an out-of-order transaction (i.e., incorrect occurring after |
|
correct). Accordingly, the current transaction should be hidden. |
|
|
|
=cut |
|
|
|
|
|
sub check_correctness_changes { |
|
my ($symb,$courseid,$domain,$name,$record,$parts,$newversion,$oldversion) = @_; |
|
my @parts_to_hide; |
|
unless ((ref($record) eq 'HASH') && (ref($parts) eq 'ARRAY')) { |
|
return @parts_to_hide; |
|
} |
|
if (@{$parts}) { |
|
my $usec; |
|
if (($env{'user.name'} eq $name) && ($env{'user.domain'} eq $domain) && |
|
($env{'request.course.id'} eq $courseid)) { |
|
$usec = $env{'request.course.sec'}; |
|
} else { |
|
$usec = &Apache::lonnet::getsection($domain,$name,$courseid); |
|
} |
|
foreach my $id (@{$parts}) { |
|
next if (($Apache::lonhomework::results{'resource.'.$id.'.type'} =~ /survey/) || |
|
(&Apache::lonnet::EXT("resource.$id.problemstatus",$symb, |
|
$domain,$name,$usec,undef,$courseid) =~ /^no/)); |
|
my $reset; |
|
for (my $i=$newversion-1; $i>=$oldversion; $i--) { |
|
if (($record->{$i.':resource.'.$id.'.regrader'}) && |
|
($record->{$i.':resource.'.$id.'.tries'} eq '') && |
|
($record->{$i.':resource.'.$id.'.award'} eq '')) { |
|
$reset = 1; |
|
} elsif (($record->{$i.":resource.$id.solved"} eq 'correct_by_student') && |
|
($record->{$i.":resource.$id.awarded"} >= 1)) { |
|
unless ($reset) { |
|
push(@parts_to_hide,$id); |
|
last; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return @parts_to_hide; |
|
} |
|
|
|
=pod |
|
|
item store_aggregates() |
item store_aggregates() |
|
|
Sends hash of values to be incremented in nohist_resourcetracker.db |
Sends hash of values to be incremented in nohist_resourcetracker.db |
Line 635 item store_aggregates()
|
Line 1368 item store_aggregates()
|
|
|
sub store_aggregates { |
sub store_aggregates { |
my ($symb,$courseid) = @_; |
my ($symb,$courseid) = @_; |
my %aggregate; |
my (%aggregate,%anoncounter,%randtrycounter); |
my @parts; |
my @parts; |
my $cdomain = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cdomain = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
my $cname = $env{'course.'.$env{'request.course.id'}.'.num'}; |
my $cname = $env{'course.'.$env{'request.course.id'}.'.num'}; |
Line 645 sub store_aggregates {
|
Line 1378 sub store_aggregates {
|
} |
} |
} |
} |
foreach my $part (@parts) { |
foreach my $part (@parts) { |
if ($Apache::lonhomework::results{'resource.'.$part.'.award'} |
if ($env{'request.role'} =~/^st/) { |
eq 'APPROX_ANS' || |
if ($Apache::lonhomework::results{'resource.'.$part.'.award'} |
$Apache::lonhomework::results{'resource.'.$part.'.award'} |
eq 'APPROX_ANS' || |
eq 'EXACT_ANS') { |
$Apache::lonhomework::results{'resource.'.$part.'.award'} |
$aggregate{$symb."\0".$part."\0correct"} = 1; |
eq 'EXACT_ANS') { |
|
$aggregate{$symb."\0".$part."\0correct"} = 1; |
|
} |
|
if ($Apache::lonhomework::results{'resource.'.$part.'.tries'} == 1) { |
|
$aggregate{$symb."\0".$part."\0users"} = 1; |
|
} else { |
|
my (undef,$last_reset) = &Apache::grades::get_last_resets($symb,$env{'request.course.id'},[$part]); |
|
if ($last_reset) { |
|
if (&Apache::grades::get_num_tries(\%Apache::lonhomework::history,$last_reset,$part) == 0) { |
|
$aggregate{$symb."\0".$part."\0users"} = 1; |
|
} |
|
} |
|
} |
|
$aggregate{$symb."\0".$part."\0attempts"} = 1; |
} |
} |
if ($Apache::lonhomework::results{'resource.'.$part.'.tries'} == 1) { |
if (($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'anonsurvey') || |
$aggregate{$symb."\0".$part."\0users"} = 1; |
($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'anonsurveycred') || |
} else { |
($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'randomizetry')) { |
my (undef,$last_reset) = &Apache::grades::get_last_resets($symb,$env{'request.course.id'},[$part]); |
if ($Apache::lonhomework::results{'resource.'.$part.'.type'} eq 'randomizetry') { |
if ($last_reset) { |
$randtrycounter{$symb."\0".$part} = 1; |
if (&Apache::grades::get_num_tries(\%Apache::lonhomework::history,$last_reset,$part) == 0) { |
} else { |
$aggregate{$symb."\0".$part."\0users"} = 1; |
$anoncounter{$symb."\0".$part} = 1; |
|
} |
|
my $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$Apache::lonhomework::results{'resource.'.$part.'.type'}}; |
|
if ($needsrelease) { |
|
my $curr_required = $env{'course.'.$env{'request.course.id'}.'.internal.releaserequired'}; |
|
if ($curr_required eq '') { |
|
&Apache::lonnet::update_released_required($needsrelease); |
|
} else { |
|
my ($currmajor,$currminor) = split(/\./,$curr_required); |
|
my ($needsmajor,$needsminor) = split(/\./,$needsrelease); |
|
if (($currmajor < $needsmajor) || ($currmajor == $needsmajor && $currminor < $needsminor)) { |
|
&Apache::lonnet::update_released_required($needsrelease); |
|
} |
} |
} |
} |
} |
} |
} |
$aggregate{$symb."\0".$part."\0attempts"} = 1; |
|
} |
} |
if (keys (%aggregate) > 0) { |
if (keys(%aggregate) > 0) { |
&Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate, |
&Apache::lonnet::cinc('nohist_resourcetracker',\%aggregate, |
$cdomain,$cname); |
$cdomain,$cname); |
} |
} |
|
if (keys(%anoncounter) > 0) { |
|
&Apache::lonnet::cput('nohist_anonsurveys',\%anoncounter, |
|
$cdomain,$cname); |
|
} |
|
if (keys(%randtrycounter) > 0) { |
|
&Apache::lonnet::cput('nohist_randomizetry',\%randtrycounter, |
|
$cdomain,$cname); |
|
} |
} |
} |
|
|
sub checkout_msg { |
sub checkout_msg { |
Line 674 sub checkout_msg {
|
Line 1439 sub checkout_msg {
|
'resource'=>'The resource needs to be checked out', |
'resource'=>'The resource needs to be checked out', |
'id_expln'=>'As a resource gets checked out, a unique timestamped ID is given to it, and a permanent record is left in the system.', |
'id_expln'=>'As a resource gets checked out, a unique timestamped ID is given to it, and a permanent record is left in the system.', |
'warning'=>'Checking out resources is subject to course policies, and may exclude future credit even if done erroneously.', |
'warning'=>'Checking out resources is subject to course policies, and may exclude future credit even if done erroneously.', |
'checkout'=>'Check out Exam for Viewing', |
'checkout'=>'Check out Bubblesheet Exam for Viewing', |
'checkout?'=>'Check out Exam?'); |
'checkout?'=>'Check out Bubblesheet Exam?'); |
my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'}); |
my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'}); |
return (<<ENDCHECKOUT); |
return (<<ENDCHECKOUT); |
<h2>$lt{'resource'}</h2> |
<h2>$lt{'resource'}</h2> |
<p>$lt{'id_expln'}</p> |
<p>$lt{'id_expln'}</p> |
<font color="red"> |
<p class="LC_warning">$lt{'warning'}</p> |
<p>$lt{'warning'}</p> |
|
</font> |
|
<form name="checkout" method="post" action="$uri"> |
<form name="checkout" method="post" action="$uri"> |
<input type="hidden" name="doescheckout" value="yes" /> |
<input type="hidden" name="doescheckout" value="yes" /> |
<input type="button" name="checkoutbutton" value="$lt{'checkout'}" onClick="javascript:if (confirm('$lt{'checkout?'}')) { document.checkout.submit(); }" /> |
<input type="button" name="checkoutbutton" value="$lt{'checkout'}" onclick="javascript:if (confirm('$lt{'checkout?'}')) { document.checkout.submit(); }" /> |
</form> |
</form> |
ENDCHECKOUT |
ENDCHECKOUT |
} |
} |
Line 699 sub firstaccess_msg {
|
Line 1462 sub firstaccess_msg {
|
my $foldertitle=&Apache::lonnet::gettitle($map); |
my $foldertitle=&Apache::lonnet::gettitle($map); |
|
|
&Apache::lonxml::debug("map is $map title is $foldertitle"); |
&Apache::lonxml::debug("map is $map title is $foldertitle"); |
$result .= "<h2>".&mt('The resources in "[_1]" are open for a limited time.' |
$result .= "<h2>".&mt('The resources in "[_1]" are open for a limited time.',$foldertitle)."</h2>" |
.' Once you click the "Show Resource" button below you have [_2] to complete all resources "[_1]".' |
.'<p>'.&mt('Once you click the "Show Resource" button below you have [_2] to complete all resources "[_1]".' |
,$foldertitle,$time)."</h2>"; |
,$foldertitle,$time)."</p>"; |
} elsif ($interval[1] eq 'course') { |
} elsif ($interval[1] eq 'course') { |
my $course = $env{'course.'.$env{'request.course.id'}.'.description'}; |
my $course = $env{'course.'.$env{'request.course.id'}.'.description'}; |
$result .= "<h2>".&mt('The resources in "[_1]" are open for a limited time.' |
$result .= "<h2>".&mt('The resources in "[_1]" are open for a limited time.',$course)."</h2>" |
.' Once you click the "Show Resource" button below you have [_2] to complete all resources "[_1]".' |
.'<p>'.&mt('Once you click the "Show Resource" button below you have [_2] to complete all resources "[_1]".' |
,$course,$time)."</h2>"; |
,$course,$time)."</p>"; |
} else { |
} else { |
my $title=&Apache::lonnet::gettitle($symb); |
my $title=&Apache::lonnet::gettitle($symb); |
$result .= "<h2>".&mt('This resource "[_1]" is open for a limited time.' |
$result .= "<h2>".&mt('This resource "[_1]" is open for a limited time.',$title)."</h2>" |
.' Once you click the "Show Resource" button below you have [_2] to complete this resource "[_1]".' |
.'<p>'.&mt('Once you click the "Show Resource" button below you have [_2] to complete this resource "[_1]".' |
,$title,$time)."</h2>"; |
,$title,$time)."</p>"; |
} |
} |
my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'}); |
my $uri = &Apache::lonenc::check_encrypt($env{'request.uri'}); |
my $buttontext = &mt('Show Resource'); |
my $buttontext = &mt('Show Resource'); |
Line 719 sub firstaccess_msg {
|
Line 1482 sub firstaccess_msg {
|
$result .= (<<ENDCHECKOUT); |
$result .= (<<ENDCHECKOUT); |
<form name="markaccess" method="post" action="$uri"> |
<form name="markaccess" method="post" action="$uri"> |
<input type="hidden" name="markaccess" value="yes" /> |
<input type="hidden" name="markaccess" value="yes" /> |
<input type="button" name="accessbutton" value="$buttontext" onClick="javascript:if (confirm('$timertext')) { document.markaccess.submit(); }" /> |
<input type="button" name="accessbutton" value="$buttontext" onclick="javascript:if (confirm('$timertext')) { document.markaccess.submit(); }" /> |
</form> |
</form> |
ENDCHECKOUT |
ENDCHECKOUT |
return $result; |
return $result; |
Line 749 sub init_problem_globals {
|
Line 1512 sub init_problem_globals {
|
&Apache::lonhomework::reset_show_problem_status(); |
&Apache::lonhomework::reset_show_problem_status(); |
$Apache::lonhomework::ignore_response_errors=1; |
$Apache::lonhomework::ignore_response_errors=1; |
} |
} |
|
@Apache::functionplotresponse::callscripts=(); |
@Apache::inputtags::responselist = (); |
@Apache::inputtags::responselist = (); |
@Apache::inputtags::importlist = (); |
@Apache::inputtags::importlist = (); |
@Apache::inputtags::previous=(); |
@Apache::inputtags::previous=(); |
Line 768 sub reset_problem_globals {
|
Line 1532 sub reset_problem_globals {
|
undef(%Apache::lonhomework::history); |
undef(%Apache::lonhomework::history); |
undef(%Apache::lonhomework::results); |
undef(%Apache::lonhomework::results); |
undef($Apache::inputtags::part); |
undef($Apache::inputtags::part); |
|
if ($type eq 'Task') { |
|
undef($Apache::inputtags::slot_name); |
|
} elsif ($type eq 'problem') { |
|
undef($Apache::lonhomework::rawrndseed); |
|
} |
#don't undef this, lonhomework.pm takes care of this, we use this to |
#don't undef this, lonhomework.pm takes care of this, we use this to |
#detect if we try to do 2 problems in one file |
#detect if we try to do 2 problems in one file |
# undef($Apache::lonhomework::parsing_a_problem); |
# undef($Apache::lonhomework::parsing_a_problem); |
Line 776 sub reset_problem_globals {
|
Line 1545 sub reset_problem_globals {
|
undef($Apache::lonhomework::type); |
undef($Apache::lonhomework::type); |
undef($Apache::lonhomework::scantronmode); |
undef($Apache::lonhomework::scantronmode); |
undef($Apache::lonhomework::ignore_response_errors); |
undef($Apache::lonhomework::ignore_response_errors); |
|
undef(@Apache::functionplotresponse::callscripts); |
&Apache::lonhomework::reset_show_problem_status(); |
&Apache::lonhomework::reset_show_problem_status(); |
} |
} |
|
|
Line 864 sub start_problem {
|
Line 1634 sub start_problem {
|
&Apache::run::run($expression,$safeeval); |
&Apache::run::run($expression,$safeeval); |
my $status; |
my $status; |
my $accessmsg; |
my $accessmsg; |
|
my $resource_due; |
|
|
my $name= &get_resource_name($parstack,$safeeval); |
my $name= &get_resource_name($parstack,$safeeval); |
my ($result,$form_tag_start); |
my ($result,$form_tag_start,$slot_name,$slot,$probpartlist); |
|
|
|
if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || |
|
$target eq 'tex') { |
|
if ($env{'form.markaccess'}) { |
|
my @interval=&Apache::lonnet::EXT("resource.0.interval"); |
|
&Apache::lonnet::set_first_access($interval[1],$interval[0]); |
|
} |
|
|
|
($status,$accessmsg,$slot_name,$slot) = |
|
&Apache::lonhomework::check_slot_access('0','problem'); |
|
push (@Apache::inputtags::status,$status); |
|
} |
|
|
if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex' |
if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex' |
|| $target eq 'edit') { |
|| $target eq 'edit') { |
($result,$form_tag_start) = |
($result,$form_tag_start,$probpartlist) = |
&page_start($target,$token,$tagstack,$parstack,$parser,$safeeval, |
&page_start($target,$token,$tagstack,$parstack,$parser,$safeeval, |
$name); |
$name); |
|
} elsif (($target eq 'grade') && ($Apache::lonhomework::type eq 'randomizetry')) { |
|
my ($symb)= &Apache::lonnet::whichuser(); |
|
my $navmap = Apache::lonnavmaps::navmap->new(); |
|
if (ref($navmap)) { |
|
my $res = $navmap->getBySymb($symb); |
|
if (ref($res)) { |
|
$probpartlist = $res->parts(); |
|
} |
|
} |
} |
} |
|
|
if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';} |
if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';} |
|
|
if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval); } |
if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval,$target); } |
if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || |
if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || |
$target eq 'tex') { |
$target eq 'tex') { |
#handle exam checkout |
|
if ($Apache::lonhomework::type eq 'exam') { |
|
my $token= |
|
$Apache::lonhomework::history{"resource.0.outtoken"}; |
|
if (($env{'form.doescheckout'}) && (!$token)) { |
|
$token=&Apache::lonxml::maketoken(); |
|
$Apache::lonhomework::history{"resource.0.outtoken"}= |
|
$token; |
|
} |
|
$result.=&Apache::lonxml::printtokenheader($target,$token); |
|
} |
|
if ($env{'form.markaccess'}) { |
|
my @interval=&Apache::lonnet::EXT("resource.0.interval"); |
|
&Apache::lonnet::set_first_access($interval[1]); |
|
} |
|
#handle rand seed in construction space |
#handle rand seed in construction space |
my $rndseed=&setup_rndseed($safeeval); |
my $rndseed=&setup_rndseed($safeeval,$target,$probpartlist); |
|
if (($target eq 'grade') && &Apache::response::submitted()) { |
|
if ($Apache::lonhomework::type eq 'randomizetry') { |
|
$Apache::lonhomework::results{'resource.0.rawrndseed'}=$rndseed; |
|
} else { |
|
my @parts; |
|
if (ref($probpartlist) eq 'ARRAY') { |
|
@parts = @{$probpartlist}; |
|
} |
|
unless (@parts) { |
|
$Apache::lonhomework::results{'resource.0.rawrndseed'}=$Apache::lonhomework::rawrndseed; |
|
} |
|
} |
|
} |
my ($symb)=&Apache::lonnet::whichuser(); |
my ($symb)=&Apache::lonnet::whichuser(); |
|
|
if ($env{'request.state'} ne "construct" && |
if ($env{'request.state'} ne "construct" && |
($symb eq '' || $Apache::lonhomework::type eq 'practice')) { |
($symb eq '' || $Apache::lonhomework::type eq 'practice')) { |
$form_tag_start.='<input type="hidden" name="rndseed" value="'. |
$form_tag_start.='<input type="hidden" name="rndseed" value="'. |
Line 909 sub start_problem {
|
Line 1702 sub start_problem {
|
value="'.$env{'form.username'}.'" />'; |
value="'.$env{'form.username'}.'" />'; |
} |
} |
if ($env{'request.role.adv'}) { |
if ($env{'request.role.adv'}) { |
$form_tag_start.= |
$form_tag_start.= ' <label class="LC_nobreak">' |
' <label><input type="checkbox" name="showallfoils"'; |
.'<input type="checkbox" name="showallfoils"'; |
if (defined($env{'form.showallfoils'})) { |
if (defined($env{'form.showallfoils'})) { |
$form_tag_start.=' checked="checked"'; |
$form_tag_start.=' checked="checked"'; |
} |
} |
$form_tag_start.= ' />'.&mt(' Show All Foils'). |
$form_tag_start.= ' /> ' |
'</label>'; |
.&mt('Show All Foils') |
|
.'</label>'; |
} |
} |
if ($Apache::lonhomework::type eq 'practice') { |
if ($Apache::lonhomework::type eq 'practice') { |
$form_tag_start.=&practice_problem_header(); |
$form_tag_start.=&practice_problem_header(); |
} |
} |
$form_tag_start.='<hr />'; |
$form_tag_start.='<hr />'; |
} |
} elsif (($env{'request.state'} ne "construct") && |
|
($Apache::lonhomework::type eq 'randomizetry') && |
($status,$accessmsg,my $slot_name,my $slot) = |
($status eq 'CAN_ANSWER')) { |
&Apache::lonhomework::check_slot_access('0','problem'); |
my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries"); |
push (@Apache::inputtags::status,$status); |
my $problemstatus = &get_problem_status($Apache::inputtags::part); |
|
$form_tag_start.=&randomizetry_problem_header($problemstatus,$reqtries); |
|
} |
|
|
my $expression='$external::datestatus="'.$status.'";'; |
my $expression='$external::datestatus="'.$status.'";'; |
$expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.0.solved"}.'";'; |
$expression.='$external::gradestatus="'.$Apache::lonhomework::history{"resource.0.solved"}.'";'; |
Line 938 sub start_problem {
|
Line 1734 sub start_problem {
|
( $status eq 'BANNED') || |
( $status eq 'BANNED') || |
( $status eq 'UNAVAILABLE') || |
( $status eq 'UNAVAILABLE') || |
( $status eq 'NOT_IN_A_SLOT') || |
( $status eq 'NOT_IN_A_SLOT') || |
|
( $status eq 'NOTRESERVABLE') || |
|
( $status eq 'RESERVABLE') || |
|
( $status eq 'RESERVABLE_LATER') || |
( $status eq 'INVALID_ACCESS')) { |
( $status eq 'INVALID_ACCESS')) { |
my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser, |
my $bodytext=&Apache::lonxml::get_all_text("/problem",$parser, |
$style); |
$style); |
if ( $target eq "web" ) { |
if ( $target eq "web" ) { |
my $msg; |
my $msg; |
if ($status eq 'UNAVAILABLE') { |
if ($status eq 'UNAVAILABLE') { |
$msg.='<h1>'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</h1>'; |
$msg.='<p class="LC_error">'.&mt('Unable to determine if this resource is open due to network problems. Please try again later.').'</p>'; |
} elsif ($status eq 'NOT_IN_A_SLOT') { |
} elsif ($status eq 'NOT_IN_A_SLOT') { |
$msg.='<h1>'.&mt('You are not currently signed up to work at this time and/or place.').'</h1>'; |
$msg.='<p class="LC_warning">'.&mt('You are not currently signed up to work at this time and/or place.').'</p>'; |
|
} elsif (($status eq 'RESERVABLE') || ($status eq 'RESERVABLE_LATER') || |
|
($status eq 'NOTRESERVABLE')) { |
|
$msg.='<p class="LC_warning">'.&mt('Access requires reservation to work at specific time/place.').'</p>'; |
} elsif ($status ne 'NOT_YET_VIEWED') { |
} elsif ($status ne 'NOT_YET_VIEWED') { |
$msg.='<h1>'.&mt('Not open to be viewed').'</h1>'; |
$msg.='<p class="LC_warning">'.&mt('Not open to be viewed').'</p>'; |
} |
} |
if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') { |
if ($status eq 'CLOSED' || $status eq 'INVALID_ACCESS') { |
$msg.=&mt('The problem ').$accessmsg; |
$msg.=&mt('The problem ').$accessmsg; |
} elsif ($status eq 'UNCHECKEDOUT') { |
} elsif ($status eq 'UNCHECKEDOUT') { |
Line 958 sub start_problem {
|
Line 1760 sub start_problem {
|
$msg.=&firstaccess_msg($accessmsg,$symb); |
$msg.=&firstaccess_msg($accessmsg,$symb); |
} elsif ($status eq 'NOT_IN_A_SLOT') { |
} elsif ($status eq 'NOT_IN_A_SLOT') { |
$msg.=&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work"); |
$msg.=&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work"); |
|
} elsif ($status eq 'RESERVABLE') { |
|
$msg.=&mt('Available to make a reservation.').' '.&mt('Reservation window closes [_1].', |
|
&Apache::lonnavmaps::timeToHumanString($accessmsg,'end')). |
|
'<br />'. |
|
&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work"); |
|
} elsif ($status eq 'RESERVABLE_LATER') { |
|
$msg.=&mt('Window to make a reservation will open [_1].', |
|
&Apache::lonnavmaps::timeToHumanString($accessmsg,'start')); |
|
} elsif ($status eq 'NOTRESERVABLE') { |
|
$msg.=&mt('Not available to make a reservation.'); |
} |
} |
$result.=$msg.'<br />'; |
$result.=$msg.'<br />'; |
} elsif ($target eq 'tex') { |
} elsif ($target eq 'tex') { |
Line 982 sub start_problem {
|
Line 1794 sub start_problem {
|
'problem'); |
'problem'); |
} |
} |
} elsif ($target eq 'web') { |
} elsif ($target eq 'web') { |
if ($status eq 'CAN_ANSWER' |
if ($status eq 'CAN_ANSWER') { |
&& $slot_name ne '' |
$resource_due = &Apache::lonhomework::due_date(0, $env{'request.symb'}); |
&& $Apache::lonhomework::history{'resource.0.checkedin'} eq '') { |
if ($slot_name ne '') { |
# unproctored slot access, self checkin |
my $checked_in = |
&Apache::bridgetask::check_in('problem',undef,undef, |
$Apache::lonhomework::history{'resource.0.checkedin'}; |
$slot_name); |
if ($checked_in eq '') { |
} |
# unproctored slot access, self checkin |
|
&Apache::bridgetask::check_in('problem',undef,undef, |
|
$slot_name); |
|
$checked_in = |
|
$Apache::lonhomework::results{"resource.0.checkedin"}; |
|
} |
|
if ((ref($slot) eq 'HASH') && ($checked_in ne '')) { |
|
if ($slot->{'starttime'} < time()) { |
|
if (!$resource_due) { |
|
$resource_due = $slot->{'endtime'}; |
|
} elsif ($slot->{'endtime'} < $resource_due) { |
|
$resource_due = $slot->{'endtime'}; |
|
} |
|
} |
|
} |
|
} |
|
if ($resource_due) { |
|
my $time_left = $resource_due - time(); |
|
if ($resource_due && ($time_left > 0) && ($target eq 'web')) { |
|
$result .= &Apache::lonhtmlcommon::set_due_date($resource_due); |
|
} |
|
} |
|
} |
$result.="\n $form_tag_start \t". |
$result.="\n $form_tag_start \t". |
'<input type="hidden" name="submitted" value="yes" />'; |
'<input type="hidden" name="submitted" value="yes" />'; |
# create a page header and exit |
# create a page header and exit |
Line 1006 sub start_problem {
|
Line 1840 sub start_problem {
|
$result .= '<input type="hidden" name="grade_'.$field. |
$result .= '<input type="hidden" name="grade_'.$field. |
'" value="'.$env{"form.grade_$field"}.'" />'."\n"; |
'" value="'.$env{"form.grade_$field"}.'" />'."\n"; |
} |
} |
|
foreach my $field ('trial','questiontype') { |
|
if ($env{"form.grade_$field"} ne '') { |
|
$result .= '<input type="hidden" name="grade_'.$field. |
|
'" value="'.$env{"form.grade_$field"}.'" />'."\n"; |
|
} |
|
} |
} |
} |
|
if ($env{'form.grade_imsexport'}) { |
|
$result = ''; |
|
} |
} elsif ($target eq 'tex') { |
} elsif ($target eq 'tex') { |
$result .= 'INSERTTEXFRONTMATTERHERE'; |
$result .= 'INSERTTEXFRONTMATTERHERE'; |
|
$result .= &select_metadata_hyphenation(); |
|
|
|
|
} |
} |
} elsif ($target eq 'edit') { |
} elsif ($target eq 'edit') { |
Line 1050 sub end_problem {
|
Line 1895 sub end_problem {
|
my $id = $Apache::inputtags::part; |
my $id = $Apache::inputtags::part; |
my $weight = &Apache::lonnet::EXT("resource.$id.weight"); |
my $weight = &Apache::lonnet::EXT("resource.$id.weight"); |
my $packages=&Apache::lonnet::metadata($env{'request.uri'},'packages'); |
my $packages=&Apache::lonnet::metadata($env{'request.uri'},'packages'); |
my @packages = split /,/,$packages; |
my @packages = split(/,/,$packages); |
my $allow_print_points = 0; |
my $allow_print_points = 0; |
foreach my $partial_key (@packages) { |
foreach my $partial_key (@packages) { |
if ($partial_key=~m/^part_0$/) { |
if ($partial_key=~m/^part_0$/) { |
Line 1065 sub end_problem {
|
Line 1910 sub end_problem {
|
} |
} |
my $name_of_resourse= &Apache::lonxml::latex_special_symbols(&get_resource_name($parstack,$safeeval),'header'); |
my $name_of_resourse= &Apache::lonxml::latex_special_symbols(&get_resource_name($parstack,$safeeval),'header'); |
my $begin_doc=' \typeout{STAMPOFPASSEDRESOURCESTART Resource <h2>"'.$name_of_resourse.'"</h2> located in <br /><small><b>'.$env{'request.uri'}.'</b></small><br /> STAMPOFPASSEDRESOURCEEND} \noindent '; |
my $begin_doc=' \typeout{STAMPOFPASSEDRESOURCESTART Resource <h2>"'.$name_of_resourse.'"</h2> located in <br /><small><b>'.$env{'request.uri'}.'</b></small><br /> STAMPOFPASSEDRESOURCEEND} \noindent '; |
|
&clear_required_languages(); |
my $toc_line='\vskip 1 mm\noindent '.$startminipage. |
my $toc_line='\vskip 1 mm\noindent '.$startminipage. |
'\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}'; |
'\addcontentsline{toc}{subsection}{'.$name_of_resourse.'}'; |
|
|
Line 1074 sub end_problem {
|
Line 1920 sub end_problem {
|
|
|
my $duetime = &Apache::lonnet::EXT("resource.$id.duedate"); |
my $duetime = &Apache::lonnet::EXT("resource.$id.duedate"); |
my $duedate = POSIX::strftime("%c",localtime($duetime)); |
my $duedate = POSIX::strftime("%c",localtime($duetime)); |
|
my $duedate_text = &mt('Due date: [_1]' |
|
,&Apache::lonlocal::locallocaltime($duetime)); |
my $temp_file; |
my $temp_file; |
my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due"; |
my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due"; |
|
|
Line 1105 sub end_problem {
|
Line 1953 sub end_problem {
|
if (not $env{'request.symb'} =~ m/\.page_/) { |
if (not $env{'request.symb'} =~ m/\.page_/) { |
if(not $duedate=~m/1969/ and $Apache::lonhomework::type ne 'exam') { |
if(not $duedate=~m/1969/ and $Apache::lonhomework::type ne 'exam') { |
$frontmatter .= $begin_doc. |
$frontmatter .= $begin_doc. |
'\textit{Due date: '.$duedate.'} '.$toc_line; |
'\textit{'.$duedate_text.'} '.$toc_line; |
} else { |
} else { |
$frontmatter.= $begin_doc.$toc_line; |
$frontmatter.= $begin_doc.$toc_line; |
if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) { $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';} |
if ($Apache::lonhomework::type eq 'exam' and $allow_print_points==1) { |
|
$frontmatter .= '\fbox{\textit{'.&mt('[quant,_1,pt,pt]',$weight ).'}}'; |
|
} |
} |
} |
} else { |
} else { |
$frontmatter .= '\vskip 1mm\textit{Due date: '.$duedate.'} \\\\\\\\'.$startminipage; |
$frontmatter .= '\vskip 1mm\textit{'.$duedate_text.'} \\\\\\\\'.$startminipage; |
} |
} |
} else { |
} else { |
if (not $env{'request.symb'} =~ m/\.page_/) { |
if (not $env{'request.symb'} =~ m/\.page_/) { |
$frontmatter .= $begin_doc.$toc_line; |
$frontmatter .= $begin_doc.$toc_line; |
if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) { $frontmatter .= '\fbox{\textit{'.$weight.' pt}}';} |
if (($Apache::lonhomework::type eq 'exam') and ($allow_print_points==1)) { |
|
$frontmatter .= '\fbox{\textit{'.&mt('[quant,_1,pt,pt]',$weight ).'}}'; |
|
} |
} else { |
} else { |
$frontmatter .= '\vskip 1mm \\\\\\\\'.$startminipage; |
$frontmatter .= '\vskip 1mm \\\\\\\\'.$startminipage; |
} |
} |
Line 1139 sub end_problem {
|
Line 1991 sub end_problem {
|
} |
} |
} elsif ( ($target eq 'web' || $target eq 'tex') && |
} elsif ( ($target eq 'web' || $target eq 'tex') && |
$Apache::inputtags::part eq '0' && |
$Apache::inputtags::part eq '0' && |
$status ne 'UNCHECKEDOUT' && $status ne 'NOT_YET_VIEWED') { |
$status ne 'UNCHECKEDOUT' && $status ne 'NOT_YET_VIEWED' |
|
&& !$env{'form.grade_imsexport'}) { |
# if part is zero, no <part>s existed, so we need show the current |
# if part is zero, no <part>s existed, so we need show the current |
# grading status |
# grading status |
my $gradestatus = &Apache::inputtags::gradestatus($Apache::inputtags::part,$target); |
my $gradestatus = &Apache::inputtags::gradestatus($Apache::inputtags::part,$target); |
Line 1149 sub end_problem {
|
Line 2002 sub end_problem {
|
(($target eq 'web') && ($env{'request.state'} ne 'construct')) || |
(($target eq 'web') && ($env{'request.state'} ne 'construct')) || |
($target eq 'answer') || ($target eq 'tex') |
($target eq 'answer') || ($target eq 'tex') |
) { |
) { |
if ($target ne 'tex' && |
if (($target ne 'tex') && |
$env{'form.answer_output_mode'} ne 'tex') { |
($env{'form.answer_output_mode'} ne 'tex') && |
|
(!$env{'form.grade_imsexport'})) { |
$result.="</form>"; |
$result.="</form>"; |
$result.= &Apache::lonhtmlcommon::htmlareaselectactive(&Apache::lonhtmlcommon::get_htmlareafields()); |
|
} |
} |
if ($target eq 'web') { |
if ($target eq 'web') { |
$result.= &Apache::loncommon::end_page({'discussion' => 1}); |
# |
|
# Closing </body></html> not added by end_page(). |
|
# Added separately at end of this routine, after added |
|
# <script></script> so document will be valid xhtml. |
|
# |
|
$result.= &Apache::loncommon::end_page({'discussion' => 1, |
|
'notbody' => 1}); |
} elsif ($target eq 'tex') { |
} elsif ($target eq 'tex') { |
my $endminipage = ''; |
my $endminipage = ''; |
if (not $env{'form.problem_split'}=~/yes/) { |
if (not $env{'form.problem_split'}=~/yes/) { |
Line 1173 sub end_problem {
|
Line 2032 sub end_problem {
|
} |
} |
} |
} |
} |
} |
|
if ($target eq 'web') { |
|
$result.=&Apache::functionplotresponse::init_script(); |
|
} |
if ($target eq 'grade') { |
if ($target eq 'grade') { |
&Apache::lonhomework::showhash(%Apache::lonhomework::results); |
&Apache::lonhomework::showhash(%Apache::lonhomework::results); |
&finalize_storage(); |
&finalize_storage(); |
Line 1203 sub end_problem {
|
Line 2065 sub end_problem {
|
|
|
&reset_problem_globals('problem'); |
&reset_problem_globals('problem'); |
|
|
|
# |
|
# This shouild be just above the return so that the |
|
# time put in the javascript is as late as possible in the |
|
# computation: |
|
# |
|
if ($target eq 'web') { |
|
$result .= &Apache::lonhtmlcommon::set_compute_end_time(); |
|
# |
|
# Closing tags delayed so any <script></script> tags |
|
# not in head can appear inside body, for valid xhtml. |
|
# |
|
$result .= "</body>\n</html>"; |
|
} |
return $result; |
return $result; |
} |
} |
|
|
Line 1230 sub start_library {
|
Line 2105 sub start_library {
|
($result,$form_tag_start)= |
($result,$form_tag_start)= |
&page_start($target,$token,$tagstack,$parstack,$parser,$safeeval, |
&page_start($target,$token,$tagstack,$parstack,$parser,$safeeval, |
$name); |
$name); |
my $rndseed=&setup_rndseed($safeeval); |
my $rndseed=&setup_rndseed($safeeval,$target); |
$result.=" \n $form_tag_start". |
$result.=" \n $form_tag_start". |
'<input type="hidden" name="submitted" value="yes" />'; |
'<input type="hidden" name="submitted" value="yes" />'; |
$result.=&problem_web_to_edit_header($rndseed); |
$result.=&problem_web_to_edit_header($rndseed); |
Line 1329 sub end_block {
|
Line 2204 sub end_block {
|
} |
} |
return $result; |
return $result; |
} |
} |
|
# |
|
# <languageblock [include='lang1,lang2...'] [exclude='lang1,lang2...']> |
|
# ... |
|
# </languageblock> |
|
# |
|
# This declares the intent to provide content that can be rendered in the |
|
# set of languages in the include specificatino but not in the exclude |
|
# specification. If a currently preferred language is in the include list |
|
# the content in the <languageblock>...</languageblock> is rendered |
|
# If the currently preferred language is in the exclude list, |
|
# the content in the <languageblock>..></languageblock is not rendered. |
|
# |
|
# Pathalogical case handling: |
|
# - Include specified, without the preferred language but exclude specified |
|
# also without the preferred langauge results in rendering the block. |
|
# - Exclude specified without include and excluden not containing a |
|
# preferred language renders the block. |
|
# - Include and exclude both specifying the preferred language does not |
|
# render the block. |
|
# - If neither include/exclude is specified, the block gets rendered. |
|
# |
|
# This tag has no effect when target is in {edit, modified} |
|
# |
sub start_languageblock { |
sub start_languageblock { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
|
|
my $result; |
my $result = ''; |
|
|
if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || |
if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || |
$target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') { |
$target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') { |
my $include = $token->[2]->{'include'}; |
my $include = $token->[2]->{'include'}; |
my $exclude = $token->[2]->{'exclude'}; |
my $exclude = $token->[2]->{'exclude'}; |
my @preferred_languages=&Apache::lonlocal::preferred_languages(); |
my @preferred_languages=&Apache::lonlocal::preferred_languages(); |
# This should not even happen, since we should at least have the server language |
|
if (!$preferred_languages[0]) { $preferred_languages[0]='en'; } |
# This should not even happen, since we should at least have the server language |
# Now loop over all languages in order of preference |
|
|
if (!$preferred_languages[0]) { |
|
$preferred_languages[0]='en'; |
|
} |
|
|
|
# Now loop over all languages in order of preference |
|
|
|
my $render; |
foreach my $preferred_language (@preferred_languages) { |
foreach my $preferred_language (@preferred_languages) { |
# If the languageblock has no arguments, show the contents |
|
$result=1; |
# If neither include/nor exlude is present the block is going |
|
# to get rendered. |
|
|
my $found=0; |
my $found=0; |
# Do we have an include argument? |
$render=1; |
|
|
|
# If include is specified, don't render the block |
|
# unless the preferred language is included in the set. |
|
|
if ($include) { |
if ($include) { |
# If include is specified, by default, don't render the block |
$render=0; |
$result=0; |
|
foreach my $included_language (split(/\,/,$include)) { |
foreach my $included_language (split(/\,/,$include)) { |
# ... but if my preferred language is included, render it |
|
if ($included_language eq $preferred_language) { |
if ($included_language eq $preferred_language) { |
$result=1; |
$render=1; |
$found=1; |
$found=1; |
|
last; # Only need to find the first. |
} |
} |
} |
} |
} |
} |
# Do we have an exclude argument? |
# Do we have an exclude argument? |
|
# If so, and one of the languages matches a preferred language |
|
# inhibit rendering the block. Note that in the pathalogical case the |
|
# author has specified a preferred language in both the include and exclude |
|
# attribte exclude is preferred. |
|
|
if ($exclude) { |
if ($exclude) { |
$result=1; |
$render=1; |
foreach my $excluded_language (split(/\,/,$exclude)) { |
foreach my $excluded_language (split(/\,/,$exclude)) { |
if ($excluded_language eq $preferred_language) { |
if ($excluded_language eq $preferred_language) { |
$result=0; |
$render=0; |
$found=1; |
$found=1; |
|
last; # Only need to find the first. |
} |
} |
} |
} |
} |
} |
if ($found) { last; } |
if ($found) { |
|
last; # Done on any match of include or exclude. |
|
} |
} |
} |
if ( ! $result ) { |
# If $render not true skip the entire block until </languageblock> |
|
# |
|
|
|
if ( ! $render ) { |
my $skip=&Apache::lonxml::get_all_text("/languageblock",$parser, |
my $skip=&Apache::lonxml::get_all_text("/languageblock",$parser, |
$style); |
$style); |
&Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]"); |
&Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]"); |
} |
} |
$result=''; |
# If $render is true, we've not skipped the contents of the <languageglock> |
|
# and the normal loncapa processing flow will render it as a matter of course. |
|
|
} elsif ($target eq 'edit') { |
} elsif ($target eq 'edit') { |
$result .=&Apache::edit::tag_start($target,$token); |
$result .=&Apache::edit::tag_start($target,$token); |
$result .=&Apache::edit::text_arg(&mt('Include Language:'),'include', |
$result .=&Apache::edit::text_arg(&mt('Include Language:'),'include', |
Line 1401 sub end_languageblock {
|
Line 2323 sub end_languageblock {
|
} |
} |
return $result; |
return $result; |
} |
} |
|
# languagblock specific tags: |
{ |
{ |
my %available_texts; |
# For chunks of a resource that has translations, this hash contains |
|
# the translations available indexed by language name. |
|
# |
|
|
|
my %available_texts; |
|
|
|
# <translated> starts a block of a resource that has multiple translations. |
|
# See the <lang> tag as well. |
|
# When </translated> is encountered if there is a translation for the |
|
# currently preferred language, that is rendered inthe web/tex/webgrade |
|
# targets. Otherwise, the default text is rendered. |
|
# |
|
# Note that <lang> is only registered for the duration of the |
|
# <translated>...</translated> block |
|
# |
|
# Pathalogical case handling: |
|
# - If there is no <lang> that specifies a 'default' and there is no |
|
# translation that matches a preferred language, nothing is rendered. |
|
# - Nested <translated>...</translated> might be linguistically supported by |
|
# XML due to the stack nature of tag registration(?) however the rendered |
|
# output will be incorrect because there is only one %available_texts |
|
# has and end_translated clears it. |
|
# - Material outside of a <lang>...</lang> block within the |
|
# <translated>...<translated> block won't render either e.g.: |
|
# <translated> |
|
# The following will be in your preferred langauge: |
|
# <lang which='en'> |
|
# This section in english |
|
# </lang> |
|
# <lang which='sgeiso'> |
|
# Hier es ist auf Deutsch. |
|
# </lang> |
|
# <lang which='sfriso'> |
|
# En Francais |
|
# </lang> |
|
# </translated> |
|
# |
|
# The introductory text prior to the first <lang> tag is not rendered. |
|
# |
sub start_translated { |
sub start_translated { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
&Apache::lonxml::register('Apache::structuretags',('lang')); |
&Apache::lonxml::register('Apache::structuretags',('lang')); |
Line 1422 sub end_languageblock {
|
Line 2382 sub end_languageblock {
|
my @possibilities = keys(%available_texts); |
my @possibilities = keys(%available_texts); |
my $which = |
my $which = |
&Apache::loncommon::languages(\@possibilities) || 'default'; |
&Apache::loncommon::languages(\@possibilities) || 'default'; |
$result = $available_texts{$which}; |
if ($target eq 'tex') { |
|
$result = &select_hyphenation($which); |
|
} |
|
$result .= $available_texts{$which}; |
|
if ($target eq 'tex') { |
|
$result .= &select_metadata_hyphenation(); # Restore original language. |
|
} |
} |
} |
undef(%available_texts); |
undef(%available_texts); |
&Apache::lonxml::deregister('Apache::structuretags',('lang')); |
&Apache::lonxml::deregister('Apache::structuretags',('lang')); |
return $result; |
return $result; |
} |
} |
|
|
|
# <lang [which='language-name'] [other='lang1,lang2...']> |
|
# Specifies that the block contained within it is a translation |
|
# for a specific language specified by the 'which' attribute. The |
|
# 'other' attribute can be used by itself or in conjunction with |
|
# which to specify this tag _may_ be used as a translation for some |
|
# list of languages. e.g.: <lang which='senisoUS' other='senisoCA,senisoAU,seniso'> |
|
# specifying that the block provides a translation for US (primary) |
|
# Canadian, Australian and UK Englush. |
|
# |
|
# Comment: this seems a bit silly why not just support a list of languages |
|
# e.g. <lang which='l1,l2...'> and ditch the other attribute? |
|
# |
|
# Effect: |
|
# The material within the <lang>..</lang> block is stored in the |
|
# specified set of $available_texts hash entries, the appropriate one |
|
# is selected at </translated> time. |
|
# |
|
# Pathalogical case handling: |
|
# If a language occurs multiple times within a <translated> block, |
|
# only the last one is rendered e.g.: |
|
# |
|
# <translated> |
|
# <lang which='senisoUS', other='senisoCA,senisoAU,seniso'> |
|
# Red green color blindness is quite common affecting about 7.8% of |
|
# the male population, but onloy about .65% of the female population. |
|
# </lang> |
|
# Red green colour blindness is quite common affecting about 7.8% of |
|
# the male population, but onloy about .65% of the female population. |
|
# <lang which='seniso', other='senisoCA,senisoAU'> |
|
# </translated> |
|
# |
|
# renders the correct spelling of color (colour) for people who have specified |
|
# a preferred language that is one of the British Commonwealth languages |
|
# even though those are also listed as valid selections for the US english |
|
# <lang> block. |
|
# |
sub start_lang { |
sub start_lang { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || |
if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || |
Line 1460 sub end_languageblock {
|
Line 2461 sub end_languageblock {
|
} |
} |
return ''; |
return ''; |
} |
} |
} |
} # end langauge block specific tags. |
|
|
|
|
sub start_instructorcomment { |
sub start_instructorcomment { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
Line 1469 sub start_instructorcomment {
|
Line 2471 sub start_instructorcomment {
|
|
|
if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || |
if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || |
$target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') { |
$target eq 'tex' || $target eq 'analyze' || $target eq 'webgrade') { |
$result=($env{'request.role'}=~/^(in|cc|au|ca|li)/); |
$result=($env{'request.role'}=~/^(in|cc|co|au|ca|li)/); |
if ( (! $result) or ($env{'form.instructor_comments'} eq 'hide')) { |
if ( (! $result) or ($env{'form.instructor_comments'} eq 'hide')) { |
my $skip=&Apache::lonxml::get_all_text("/instructorcomment", |
my $skip=&Apache::lonxml::get_all_text("/instructorcomment", |
$parser,$style); |
$parser,$style); |
Line 1552 sub end_while {
|
Line 2554 sub end_while {
|
} |
} |
$return = &Apache::run::run($code,$safeeval); |
$return = &Apache::run::run($code,$safeeval); |
} |
} |
if ($error) { |
if ($error) { |
&Apache::lonxml::error('<pre>'.&mt('Code ran too long. It ran for more than').' '.$Apache::lonnet::perlvar{'lonScriptTimeout'}.' '.&mt('seconds occurred while running <while> on line').' '.$line.'</pre>'); |
&Apache::lonxml::error( |
} |
'<pre>' |
|
.&mt('Code ran too long. It ran for more than [_1] seconds.', |
|
$Apache::lonnet::perlvar{'lonScriptTimeout'}) |
|
.&mt('This occurred while running <while> on line [_1].', |
|
$line) |
|
.'</pre>'); |
|
} |
} elsif ($target eq "edit") { |
} elsif ($target eq "edit") { |
$result.= &Apache::edit::tag_end($target,$token,''); |
$result.= &Apache::edit::tag_end($target,$token,''); |
} |
} |
Line 1621 sub start_randomlist {
|
Line 2629 sub start_randomlist {
|
} |
} |
} |
} |
} |
} |
for(0 .. $show) { |
for my $i (0 .. $show) { |
$bodytext .= "$randomlist[ $idx_arr[$_] ]"; |
$bodytext .= "$randomlist[ $idx_arr[$i] ]"; |
} |
} |
&Apache::lonxml::newparser($parser,\$bodytext); |
&Apache::lonxml::newparser($parser,\$bodytext); |
} |
} |
Line 1674 sub ordered_show_check {
|
Line 2682 sub ordered_show_check {
|
return $in_order_show; |
return $in_order_show; |
} |
} |
|
|
|
|
|
sub start_startpartmarker { |
|
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; |
|
my $result=''; |
|
if ($target eq 'edit') { |
|
$result=&Apache::edit::tag_start($target,$token); |
|
$result.=&mt('Marker for the start of a part. Place end marker below to wrap in-between tags into a new part.').'</td></tr>'; |
|
$result.=&Apache::edit::end_table(); |
|
|
|
} |
|
return $result; |
|
} |
|
|
|
sub end_startpartmarker { |
|
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; |
|
my @result; |
|
if ($target eq 'edit') { $result[1]='no'; } |
|
return @result; |
|
} |
|
|
|
sub start_endpartmarker { |
|
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; |
|
my $result=''; |
|
if ($target eq 'edit') { |
|
$result=&Apache::edit::tag_start($target,$token); |
|
$result.=&mt('Marker for the end of a part. Place start marker above to wrap in-between tags into a new part.').'</td></tr>'; |
|
$result.=&Apache::edit::end_table(); |
|
|
|
} |
|
return $result; |
|
} |
|
|
|
sub end_endpartmarker { |
|
my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; |
|
my @result; |
|
if ($target eq 'edit') { $result[1]='no'; } |
|
return @result; |
|
} |
|
|
|
|
|
|
|
|
|
|
sub start_part { |
sub start_part { |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; |
if (!$Apache::lonxml::metamode) { |
if (!$Apache::lonxml::metamode) { |
Line 1693 sub start_part {
|
Line 2744 sub start_part {
|
my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part); |
my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part); |
my $newtype=&Apache::lonnet::EXT("resource.$id.type"); |
my $newtype=&Apache::lonnet::EXT("resource.$id.type"); |
if ($newtype) { $Apache::lonhomework::type=$newtype; } |
if ($newtype) { $Apache::lonhomework::type=$newtype; } |
|
if ($Apache::lonhomework::type eq 'randomizetry') { |
|
my $rndseed=&setup_rndseed($safeeval,$target); |
|
if (($target eq 'grade') && &Apache::response::submitted()) { |
|
$Apache::lonhomework::results{"resource.$id.rawrndseed"}=$rndseed; |
|
} |
|
} elsif (($target eq 'grade') && &Apache::response::submitted()) { |
|
$Apache::lonhomework::results{"resource.$id.rawrndseed"}=$Apache::lonhomework::rawrndseed; |
|
} |
my $in_order_show=&ordered_show_check(); |
my $in_order_show=&ordered_show_check(); |
my $expression='$external::part=\''.$Apache::inputtags::part.'\';'; |
my $expression='$external::part=\''.$Apache::inputtags::part.'\';'; |
$expression.='$external::type=\''.$Apache::lonhomework::type.'\';'; |
$expression.='$external::type=\''.$Apache::lonhomework::type.'\';'; |
Line 1743 sub start_part {
|
Line 2802 sub start_part {
|
} |
} |
my $weight = &Apache::lonnet::EXT("resource.$id.weight"); |
my $weight = &Apache::lonnet::EXT("resource.$id.weight"); |
my $allkeys=&Apache::lonnet::metadata($env{'request.uri'},'packages'); |
my $allkeys=&Apache::lonnet::metadata($env{'request.uri'},'packages'); |
my @allkeys = split /,/,$allkeys; |
my @allkeys = split(/,/,$allkeys); |
my $allow_print_points = 0; |
my $allow_print_points = 0; |
foreach my $partial_key (@allkeys) { |
foreach my $partial_key (@allkeys) { |
if ($partial_key=~m/^part_(.*)$/) { |
if ($partial_key=~m/^part_(.*)$/) { |
Line 1758 sub start_part {
|
Line 2817 sub start_part {
|
'.disableexampointprint'}) eq 'yes') { |
'.disableexampointprint'}) eq 'yes') { |
$allow_print_points=0; |
$allow_print_points=0; |
} |
} |
if (($Apache::lonhomework::type eq 'exam') && ($allow_print_points)) { $result .= '\fbox{\textit{'.$weight.' pt}}';} |
if (($Apache::lonhomework::type eq 'exam') && ($allow_print_points)) { |
|
$result .= '\vskip 10mm\fbox{\textit{'.&mt('[quant,_1,pt,pt]',$weight ).'}}'; |
|
|
|
} |
} elsif ($target eq 'web') { |
} elsif ($target eq 'web') { |
$result.='<a name="'.&escape($Apache::inputtags::part).'" />'; |
if ($status eq 'CAN_ANSWER') { |
|
my $problemstatus = &get_problem_status($Apache::inputtags::part); |
|
my $probrandomize = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[0].type"); |
|
my $probrandtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::partlist[0].randomizeontries"); |
|
my $num = scalar(@Apache::inputtags::partlist)-1; |
|
if ($probrandomize eq 'randomizetry') { |
|
if (&Apache::lonnet::EXT("resource.$Apache::inputtags::part.type") ne 'randomizetry') { |
|
$result .= &randomizetry_part_header($problemstatus,'none',$num); |
|
} else { |
|
my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries"); |
|
if ($probrandtries ne $reqtries) { |
|
$result .= &randomizetry_part_header($problemstatus,$reqtries,$num); |
|
} |
|
} |
|
} elsif (&Apache::lonnet::EXT("resource.$Apache::inputtags::part.type") eq 'randomizetry') { |
|
my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries"); |
|
$result .= &randomizetry_part_header($problemstatus,$reqtries,$num); |
|
} |
|
} |
|
$result.='<a name="'.&escape($Apache::inputtags::part).'" ></a>'; |
} |
} |
} |
} |
} |
} |
Line 1806 sub end_part {
|
Line 2887 sub end_part {
|
!$hidden && $in_order_show) { |
!$hidden && $in_order_show) { |
my $gradestatus=&Apache::inputtags::gradestatus($Apache::inputtags::part, |
my $gradestatus=&Apache::inputtags::gradestatus($Apache::inputtags::part, |
$target); |
$target); |
if ($Apache::lonhomework::type eq 'exam' && $target eq 'tex') { |
if (($Apache::lonhomework::type eq 'exam' && $target eq 'tex') || |
|
($env{'form.grade_imsexport'})) { |
$gradestatus=''; |
$gradestatus=''; |
} |
} |
$result.=$gradestatus; |
$result.=$gradestatus; |
Line 1925 sub start_problemtype {
|
Line 3007 sub start_problemtype {
|
['hide','Hide']] |
['hide','Hide']] |
,$token); |
,$token); |
$result .=&Apache::edit::checked_arg('When used as type(s):','for', |
$result .=&Apache::edit::checked_arg('When used as type(s):','for', |
[ ['exam','Exam/Quiz Problem'], |
[ ['exam','Bubblesheet Exam/Quiz Problem'], |
['survey','Survey'], |
['survey','Survey'], |
|
['surveycred','Survey (with credit)'], |
|
['anonsurvey','Anonymous Survey'], |
|
['anonsurveycred','Anonymous Survey (with credit)'], |
['problem','Homework Problem'], |
['problem','Homework Problem'], |
['practice','Practice Problem'] ] |
['practice','Practice Problem'], |
|
['randomizetry','New Randomization Each Try'] ] |
,$token); |
,$token); |
$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row(); |
$result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row(); |
} elsif ($target eq 'modified') { |
} elsif ($target eq 'modified') { |
Line 1964 sub end_startouttext {
|
Line 3050 sub end_startouttext {
|
if ($target eq 'edit') { |
if ($target eq 'edit') { |
my $areaid = 'homework_edit_'.$Apache::lonxml::curdepth; |
my $areaid = 'homework_edit_'.$Apache::lonxml::curdepth; |
$text=&Apache::lonxml::get_all_text("endouttext",$parser,$style); |
$text=&Apache::lonxml::get_all_text("endouttext",$parser,$style); |
$result.=&Apache::edit::start_table($token)."<tr><td>".&mt('Text Block')."</td>" |
$result.=&Apache::edit::start_table($token)."<tr><td>".&Apache::loncommon::insert_folding_button() |
|
." ".&mt('Text Block')."</td>" |
.'<td><span class="LC_nobreak">'.&mt('Delete?').' ' |
.'<td><span class="LC_nobreak">'.&mt('Delete?').' ' |
.&Apache::edit::deletelist($target,$token) |
.&Apache::edit::deletelist($target,$token) |
.'</span></td>'; |
.'</span></td>' |
unless ($env{'environment.wysiwygeditor'} eq 'on') { |
.'<td><span id="math_'.$areaid.'">' |
$result .= '<td align="left">' |
.&Apache::lonhtmlcommon::dragmath_button($areaid,1) |
.&Apache::lonhtmlcommon::dragmath_button($areaid,1) |
.'</span></td>' |
.'</td>' |
.'<td>' |
.'<td>' |
.&Apache::edit::insertlist($target,$token) |
.&Apache::edit::insertlist($target,$token) |
.'</td>' |
.'</td>'; |
.'<td class="LC_edit_problem_latexhelper">' . |
} |
&Apache::loncommon::helpLatexCheatsheet(). |
$result.='<td align="right" valign="top">' . |
|
&Apache::loncommon::helpLatexCheatsheet(). |
|
&Apache::edit::end_row(). |
&Apache::edit::end_row(). |
&Apache::edit::start_spanning_row()."\n". |
&Apache::edit::start_spanning_row()."\n". |
&Apache::edit::editfield($token->[1],$text,"",80,8,1); |
&Apache::edit::editfield($token->[1],$text,"",80,8,1); |
Line 2040 sub start_simpleeditbutton {
|
Line 3125 sub start_simpleeditbutton {
|
my $url=$env{'request.noversionuri'}; |
my $url=$env{'request.noversionuri'}; |
$url=~s/\?.*$//; |
$url=~s/\?.*$//; |
my ($symb) = &Apache::lonnet::whichuser(); |
my ($symb) = &Apache::lonnet::whichuser(); |
# Warning make more sense and is more important on edit screen |
# Warning makes more sense and is more important on edit screen |
# $result='<p class="LC_warning">' |
# $result='<p class="LC_warning">' |
# .&mt('Note: it can take up to 10 minutes for changes to take effect for all users.') |
# .&mt('Note: it can take up to 10 minutes for changes to take effect for all users.') |
# .&Apache::loncommon::help_open_topic('Caching') |
# .&Apache::loncommon::help_open_topic('Caching') |
# .'</p>'; |
# .'</p>'; |
$result.=&Apache::lontemplate::start_functionslist() |
$result.=&Apache::loncommon::head_subbox( |
.&Apache::lontemplate::item_functionslist( |
&Apache::lonhtmlcommon::start_funclist() |
'<a href="'.$url.'/smpedit?symb='.&escape($symb).'">'.&mt('Edit').'</a>') |
.&Apache::lonhtmlcommon::add_item_funclist( |
.&Apache::lontemplate::end_functionslist(); |
'<a href="'.$url.'/smpedit?symb='.&escape($symb).'">' |
|
.&mt('Edit').'</a>') |
|
.&Apache::lonhtmlcommon::end_funclist()); |
|
|
} |
} |
return $result; |
return $result; |
Line 2064 sub practice_problem_header {
|
Line 3151 sub practice_problem_header {
|
'</span>'; |
'</span>'; |
} |
} |
|
|
|
sub randomizetry_problem_header { |
|
my ($problemstatus,$reqtries) = @_; |
|
my ($header,$text); |
|
if ($reqtries > 1) { |
|
$header = &mt('New Problem Variation After Every [quant,_1,Try,Tries]',$reqtries); |
|
if (($problemstatus eq 'no') || |
|
($problemstatus eq 'no_feedback_ever')) { |
|
$text = &mt('A new variation will be generated after every [quant,_1,try,tries], until the tries limit is reached.',$reqtries); |
|
} else { |
|
$text = &mt('A new variation will be generated after every [quant,_1,try,tries], until correct or tries limit is reached.',$reqtries); |
|
} |
|
} else { |
|
$header = &mt('New Problem Variation Each Try'); |
|
if (($problemstatus eq 'no') || |
|
($problemstatus eq 'no_feedback_ever')) { |
|
$text = &mt('A new variation will be generated after each try until the tries limit is reached.'); |
|
|
|
} else { |
|
$text = &mt('A new variation will be generated after each try until correct or tries limit is reached.'); |
|
} |
|
} |
|
return '<span class="LC_info"><h3>'.$header.'</h3></span>'. |
|
'<span class="LC_info">'.$text.'</span><hr />'; |
|
} |
|
|
|
sub randomizetry_part_header { |
|
my ($problemstatus,$reqtries,$num) = @_; |
|
my ($header,$text); |
|
if ($reqtries eq 'none') { |
|
$header = &mt('No Question Variation'); |
|
$text = &mt('For this question there will no new variation after a try.'); |
|
} elsif ($reqtries > 1) { |
|
$header = &mt('New Question Variation After Every [quant,_1,Try,Tries]',$reqtries); |
|
if (($problemstatus eq 'no') || |
|
($problemstatus eq 'no_feedback_ever')) { |
|
$text = &mt('For this question a new variation will be generated after every [quant,_1,try,tries], until the tries limit is reached.',$reqtries); |
|
} else { |
|
$text = &mt('For this question a new variation will be generated after every [quant,_1,try,tries], until correct or tries limit is reached.',$reqtries); |
|
} |
|
} else { |
|
$header = &mt('New Question Variation For Each Try'); |
|
if (($problemstatus eq 'no') || |
|
($problemstatus eq 'no_feedback_ever')) { |
|
$text = &mt('For this question a new variation will be generated after each try until the tries limit is reached.'); |
|
} else { |
|
$text = &mt('For this question a new variation will be generated after each try until correct or tries limit is reached.'); |
|
} |
|
} |
|
my $output; |
|
if ($num > 1) { |
|
$output .= '<hr />'; |
|
} |
|
$output .= '<span class="LC_info"><h4>'.$header.'</h4></span>'. |
|
'<span class="LC_info">'.$text.'</span><br /><br />'; |
|
return $output; |
|
} |
|
|
1; |
1; |
__END__ |
__END__ |
|
|