--- loncom/homework/structuretags.pm 2019/11/04 20:50:57 1.512.2.21 +++ loncom/homework/structuretags.pm 2014/11/24 02:36:26 1.524 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: structuretags.pm,v 1.512.2.21 2019/11/04 20:50:57 raeburn Exp $ +# $Id: structuretags.pm,v 1.524 2014/11/24 02:36:26 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -224,55 +224,9 @@ sub end_tex { } sub homework_js { - my ($postsubmit,$timeout); - if (($env{'request.course.id'}) && ($env{'request.state'} ne 'construct')) { - my $crstype; - if (&Apache::loncommon::course_type() eq 'Community') { - $crstype = 'community'; - } else { - if ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) { - $crstype = 'official'; - } elsif ($env{'course.'.$env{'request.course.id'}.'.internal.textbook'}) { - $crstype = 'textbook'; - } else { - $crstype = 'unofficial'; - } - } - $postsubmit = $env{'course.'.$env{'request.course.id'}.'.internal.postsubmit'}; - if ($postsubmit eq '') { - my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'}); - $postsubmit = $domdefs{'postsubmit'}; - unless ($postsubmit eq 'off') { - $timeout = $domdefs{$crstype.'postsubtimeout'}; - } - } elsif ($postsubmit eq '0') { - $postsubmit = 'off'; - } elsif ($postsubmit eq '1') { - $postsubmit = 'on'; - $timeout = $env{'course.'.$env{'request.course.id'}.'.internal.postsubtimeout'}; - if ($timeout eq '') { - my %domdefs = &Apache::lonnet::get_domain_defaults($env{'course.'.$env{'request.course.id'}.'.domain'}); - $timeout = $domdefs{$crstype.'postsubtimeout'}; - } - } - if ($timeout eq '') { - $timeout = 60; - } - } else { - my %domdefs = &Apache::lonnet::get_domain_defaults($env{'request.role.domain'}); - $postsubmit = $domdefs{'postsubmit'}; - unless ($postsubmit eq 'off') { - $timeout = 60; - } - } - my $jstimeout = 0; - if ($timeout) { - $jstimeout = 1000 * $timeout; - } return &Apache::loncommon::resize_textarea_js(). - &Apache::loncommon::colorfuleditor_js(). &setmode_javascript(). - <<"JS"; + <<'JS'; @@ -417,17 +340,13 @@ sub page_start { $extra_head .= &homework_js(). &Apache::lonhtmlcommon::dragmath_js("EditMathPopup"); if (&Apache::lonhtmlcommon::htmlareabrowser()) { - my %textarea_args; - if (($env{'request.state'} ne 'construct') || - ($env{'environment.nocodemirror'})) { - %textarea_args = ( + my %textarea_args = ( dragmath => 'math', ); - } $extra_head .= &Apache::lonhtmlcommon::htmlareaselectactive(\%textarea_args); } my $is_task = ($env{'request.uri'} =~ /\.task$/); - my ($needs_upload,$partlist); + my $needs_upload; my ($symb)= &Apache::lonnet::whichuser(); my ($map,$resid,$resurl)=&Apache::lonnet::decode_symb($symb); if ($is_task) { @@ -445,12 +364,6 @@ sub page_start { 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 { @@ -462,17 +375,10 @@ sub page_start { 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 { + unless ($is_page) { my $res = $navmap->getBySymb($symb); if (ref($res)) { - $partlist = $res->parts(); + my $partlist = $res->parts(); if (ref($partlist) eq 'ARRAY') { foreach my $part (@{$partlist}) { my @types = $res->responseType($part); @@ -494,9 +400,7 @@ sub page_start { } } if ($needs_upload) { - $extra_head .= &Apache::lonhtmlcommon::file_submissionchk_js(). - ''; + $extra_head .= &Apache::lonhtmlcommon::file_submissionchk_js(); } } @@ -515,9 +419,6 @@ sub page_start { "if (typeof swmenu != 'undefined') {swmenu.currentURL=null;}\n". &Apache::loncommon::browser_and_searcher_javascript(). "\n\n"; - if ($target eq 'edit') { - $extra_head .= &Apache::edit::js_update_linknum(); - } } } @@ -610,7 +511,7 @@ sub page_start { "\t".''."\n"; } } - return ($page_start,$form_tag_start,$partlist); + return ($page_start,$form_tag_start); } #use Time::HiRes(); @@ -641,37 +542,19 @@ sub get_resource_name { } sub setup_rndseed { - my ($safeeval,$target,$probpartlist)=@_; + my ($safeeval,$target)=@_; my ($symb)=&Apache::lonnet::whichuser(); - my ($questiontype,$set_safespace,$rndseed,$numtries,$reqtries); + my ($questiontype,$set_safespace,$rndseed); if ($target eq 'analyze') { $questiontype = $env{'form.grade_questiontype'}; } unless (defined($questiontype)) { $questiontype = $Apache::lonhomework::type; } - if ($Apache::lonhomework::type eq 'randomizetry') { - my $partfortries = $Apache::inputtags::part; - if (ref($probpartlist) eq 'ARRAY') { - if ((@{$probpartlist} == 1) && ($probpartlist->[0] ne $Apache::inputtags::part)) { - $partfortries = $probpartlist->[0]; - if (&Apache::lonnet::EXT("resource.$partfortries.questiontype") eq 'randomizetry') { - $partfortries = $probpartlist->[0]; - } else { - $partfortries = ''; - } - } - } - if ($partfortries ne '') { - $numtries = $Apache::lonhomework::history{"resource.$partfortries.tries"}; - $reqtries = &Apache::lonnet::EXT("resource.$partfortries.randomizeontries"); - } - } - if (($env{'request.state'} eq "construct") - || ($symb eq '') - || ($Apache::lonhomework::type eq 'practice') - || ($Apache::lonhomework::history{'resource.CODE'}) - || (($env{'form.code_for_randomlist'}) && ($target eq 'analyze'))) { + if ($env{'request.state'} eq "construct" + || $symb eq '' + || $Apache::lonhomework::type eq 'practice' + || $Apache::lonhomework::history{'resource.CODE'}) { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['rndseed']); $rndseed=$env{'form.rndseed'}; @@ -680,19 +563,13 @@ sub setup_rndseed { if (!$rndseed) { $rndseed=time; } - unless ($env{'form.code_for_randomlist'}) { - $env{'form.rndseed'}=$rndseed; - } + $env{'form.rndseed'}=$rndseed; } - if ((($env{'request.state'} eq "construct") || ($symb eq '')) && + if (($env{'request.state'} eq "construct") && ($Apache::lonhomework::type eq 'randomizetry')) { - if ($numtries) { - if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) { - my $inc = int($numtries/$reqtries); - $rndseed += $inc; - } else { - $rndseed += $numtries; - } + my $tries = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"}; + if ($tries) { + $rndseed += $tries; } $env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed; } @@ -714,11 +591,7 @@ sub setup_rndseed { $rndseed=join(':',&Apache::lonnet::digest($rndseed)); } } - if (($env{'form.code_for_randomlist'}) && ($target eq 'analyze')) { - $env{'form.CODE'} = $env{'form.code_for_randomlist'}; - $rndseed=&Apache::lonnet::rndseed(); - undef($env{'form.CODE'}); - } elsif ($Apache::lonhomework::history{'resource.CODE'}) { + if ($Apache::lonhomework::history{'resource.CODE'}) { $rndseed=&Apache::lonnet::rndseed(); } $set_safespace = 1; @@ -730,7 +603,7 @@ sub setup_rndseed { } unless (($target eq 'analyze') && (defined($rndseed))) { $rndseed=&Apache::lonnet::rndseed(); - my $curr_try = $numtries; + my $curr_try = $Apache::lonhomework::history{"resource.$Apache::inputtags::part.tries"}; if ($Apache::inputtags::status[-1] eq 'CAN_ANSWER') { $curr_try ++; } @@ -738,6 +611,7 @@ sub setup_rndseed { $rndseed = $1; } if ($curr_try) { + my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries"); if (($reqtries =~ /^\d+$/) && ($reqtries > 1)) { my $inc = int(($curr_try-1)/$reqtries); $rndseed += $inc; @@ -747,9 +621,6 @@ sub setup_rndseed { } } $set_safespace = 1; - if ($target eq 'grade') { - $Apache::lonhomework::rawrndseed = $rndseed; - } } if ($set_safespace) { if ($safeeval) { @@ -779,82 +650,53 @@ sub problem_edit_action_button { sub problem_edit_buttons { my ($mode)=@_; -# Buttons that save - my $result = '
'; - 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
\n"; # Buttons that do not save - $result .= '
'. + my $result='
'. &problem_edit_action_button('subdiscview','discard','d','Discard Edits and View',1); if ($mode eq 'editxml') { $result.=&problem_edit_action_button('subedit','edit','e','Edit',1); $result.=&problem_edit_action_button('subundo','undoxml','u','Undo',1); - if ($env{'environment.nocodemirror'}) { - $result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1); - } + $result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1); } else { $result.=&problem_edit_action_button('subeditxml','editxml','x','EditXML',1); $result.=&problem_edit_action_button('subundo','undo','u','Undo',1); } $result.="\n
"; +# Buttons that save + $result.='
'; + 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
\n"; return $result; } sub problem_edit_header { - my ($mode)=@_; - my $return = ''. + return ''. &remember_problem_state('edit').' -
-
- '.&mt('Problem Editing').$mode.&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').' -
'. - ''. - &problem_edit_buttons(); - - $return .= '
' . &Apache::lonxml::message_location(); - $return .= ' - '; - - $return .= ' - - " + $result.=&Apache::edit::start_table($token)."" .'' - .'' + .'' .'' @@ -3103,7 +2862,7 @@ sub practice_problem_header { } sub randomizetry_problem_header { - my ($problemstatus,$reqtries,$symb) = @_; + my ($problemstatus,$reqtries) = @_; my ($header,$text); if ($reqtries > 1) { $header = &mt('New Problem Variation After Every [quant,_1,Try,Tries]',$reqtries); @@ -3123,13 +2882,8 @@ sub randomizetry_problem_header { $text = &mt('A new variation will be generated after each try until correct or tries limit is reached.'); } } - if (($env{'request.state'} eq "construct") || ($symb eq '')) { - return ''; - } else { - return '

'.$header.'

'. - ''.$text.'
'; - } + return '

'.$header.'

'. + ''.$text.'
'; } sub randomizetry_part_header {
'; - return $return; +
+
+'.&mt('Problem Editing').&Apache::loncommon::help_open_menu('Problem Editing','Problem_Editor_XML_Index',5,'Authoring').' +
'. +''. +&problem_edit_buttons().' +
+'.&Apache::lonxml::message_location().' +
+'. + '
'; } - sub problem_edit_footer { - my $resource = $env{'request.ambiguous'}; return '

'. "\n\n".&Apache::loncommon::end_page(); @@ -919,7 +761,7 @@ sub problem_web_to_edit_header { ".&mt("Problem Type:")." '. + $rndseed.'" />'. ''; if (exists($env{'form.username'})) { @@ -1627,19 +1434,12 @@ sub start_problem { $form_tag_start.=&practice_problem_header(); } $form_tag_start.='
'; - } - if (($env{'request.state'} ne "construct") && - ($Apache::lonhomework::type eq 'randomizetry') && - ($status eq 'CAN_ANSWER')) { - my @parts; - if (ref($probpartlist) eq 'ARRAY') { - @parts = @{$probpartlist}; - } - unless (@parts) { - my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries"); - my $problemstatus = &get_problem_status($Apache::inputtags::part); - $form_tag_start.=&randomizetry_problem_header($problemstatus,$reqtries,$symb); - } + } elsif (($env{'request.state'} ne "construct") && + ($Apache::lonhomework::type eq 'randomizetry') && + ($status eq 'CAN_ANSWER')) { + my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries"); + my $problemstatus = &get_problem_status($Apache::inputtags::part); + $form_tag_start.=&randomizetry_problem_header($problemstatus,$reqtries); } my $expression='$external::datestatus="'.$status.'";'; @@ -1676,10 +1476,6 @@ sub start_problem { } elsif ($status eq 'UNCHECKEDOUT') { $msg.=&checkout_msg(); } elsif ($status eq 'NOT_YET_VIEWED') { - if ($firstaccres) { - $msg .= '

'. - &mt('A problem occurred when trying to start the timer.').'

'; - } $msg.=&firstaccess_msg($accessmsg,$symb); } elsif ($status eq 'NOT_IN_A_SLOT') { $msg.=&Apache::bridgetask::add_request_another_attempt_button("Sign up for time to work"); @@ -1755,10 +1551,6 @@ sub start_problem { $result.= ''. &practice_problem_header().'
'; - } elsif ($Apache::lonhomework::type eq 'randomizetry') { - my $reqtries = &Apache::lonnet::EXT("resource.$Apache::inputtags::part.randomizeontries"); - my $problemstatus = &get_problem_status($Apache::inputtags::part); - $result.=&randomizetry_problem_header($problemstatus,$reqtries); } } # if we are viewing someone else preserve that info @@ -1822,7 +1614,7 @@ sub end_problem { my $id = $Apache::inputtags::part; my $weight = &Apache::lonnet::EXT("resource.$id.weight"); my $packages=&Apache::lonnet::metadata($env{'request.uri'},'packages'); - my @packages = split(/,/,$packages); + my @packages = split /,/,$packages; my $allow_print_points = 0; foreach my $partial_key (@packages) { if ($partial_key=~m/^part_0$/) { @@ -1960,24 +1752,7 @@ sub end_problem { } } if ($target eq 'web') { - $result.=&Apache::functionplotresponse::init_script(); - if ($Apache::lonhomework::default_type eq 'randomizetry') { - my ($symb) = &Apache::lonnet::whichuser(); - if ((($env{'request.state'} eq 'construct') || ($symb eq '')) && - ($status eq 'CAN_ANSWER')) { - unless (@Apache::inputtags::partlist > 1) { - $result.= <<"ENDJS"; - -ENDJS - } - } - } + $result.=&Apache::functionplotresponse::init_script(); } if ($target eq 'grade') { &Apache::lonhomework::showhash(%Apache::lonhomework::results); @@ -2071,8 +1846,6 @@ sub end_library { && ($#$tagstack eq 0 && $$tagstack[0] eq 'library') && $env{'request.state'} eq "construct") { $result.=''.&Apache::loncommon::end_page({'discussion' => 1}); - } elsif ($target eq 'meta') { - $result.=&Apache::response::meta_response_order(); } if ( $#$tagstack eq 0 && $$tagstack[0] eq 'library') { &reset_problem_globals('library'); @@ -2555,12 +2328,7 @@ sub start_randomlist { } if (@randomlist) { my @idx_arr = (0 .. $#randomlist); - if ($env{'form.code_for_randomlist'}) { - &Apache::structuretags::shuffle(\@idx_arr,$target); - undef($env{'form.code_for_randomlist'}); - } else { - &Apache::structuretags::shuffle(\@idx_arr); - } + &Apache::structuretags::shuffle(\@idx_arr); my $bodytext = ''; my $show=$#randomlist; my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval); @@ -2580,8 +2348,8 @@ sub start_randomlist { } } } - for my $i (0 .. $show) { - $bodytext .= "$randomlist[ $idx_arr[$i] ]"; + for(0 .. $show) { + $bodytext .= "$randomlist[ $idx_arr[$_] ]"; } &Apache::lonxml::newparser($parser,\$bodytext); } @@ -2599,10 +2367,10 @@ sub start_randomlist { } sub shuffle { - my ($a,$target) = @_; + my $a=shift; my $i; if (ref($a) eq 'ARRAY' && @$a) { - &Apache::response::pushrandomnumber(undef,$target); + &Apache::response::pushrandomnumber(); for($i=@$a;--$i;) { my $j=int(&Math::Random::random_uniform() * ($i+1)); next if $i == $j; @@ -2686,7 +2454,6 @@ sub start_part { my $id= &Apache::lonxml::get_id($parstack,$safeeval); $Apache::inputtags::part=$id; push(@Apache::inputtags::partlist,$id); - $Apache::inputtags::leniency=''; @Apache::inputtags::response=(); @Apache::inputtags::previous=(); @Apache::inputtags::previous_version=(); @@ -2696,14 +2463,6 @@ sub start_part { my $hidden=&Apache::loncommon::check_if_partid_hidden($Apache::inputtags::part); my $newtype=&Apache::lonnet::EXT("resource.$id.type"); 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.rndseed"}=$rndseed; - } - } elsif (($target eq 'grade') && &Apache::response::submitted()) { - $Apache::lonhomework::results{"resource.$id.rndseed"}=$Apache::lonhomework::rawrndseed; - } my $in_order_show=&ordered_show_check(); my $expression='$external::part=\''.$Apache::inputtags::part.'\';'; $expression.='$external::type=\''.$Apache::lonhomework::type.'\';'; @@ -2754,7 +2513,7 @@ sub start_part { } my $weight = &Apache::lonnet::EXT("resource.$id.weight"); my $allkeys=&Apache::lonnet::metadata($env{'request.uri'},'packages'); - my @allkeys = split(/,/,$allkeys); + my @allkeys = split /,/,$allkeys; my $allow_print_points = 0; foreach my $partial_key (@allkeys) { if ($partial_key=~m/^part_(.*)$/) { @@ -2776,14 +2535,20 @@ sub start_part { } elsif ($target eq 'web') { 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 ((($Apache::lonhomework::default_type eq 'randomizetry') || - ($Apache::lonhomework::randomizetrypart)) && - ($Apache::lonhomework::type ne 'randomizetry')) { - $result .= &randomizetry_part_header($problemstatus,'none',$num); - } elsif ($Apache::lonhomework::type eq 'randomizetry') { - $Apache::lonhomework::randomizetrypart = 1; - my $reqtries = &Apache::lonnet::EXT("resource.$id.randomizeontries"); + 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); } } @@ -2846,7 +2611,6 @@ sub end_part { } pop @Apache::inputtags::status; $Apache::inputtags::part=''; - $Apache::inputtags::leniency=''; $Apache::lonhomework::type = $Apache::lonhomework::default_type; return $result; } @@ -2954,7 +2718,7 @@ sub start_problemtype { ['hide','Hide']] ,$token); $result .=&Apache::edit::checked_arg('When used as type(s):','for', - [ ['exam','Exam/Quiz Problem'], + [ ['exam','Bubblesheet Exam/Quiz Problem'], ['survey','Survey'], ['surveycred','Survey (with credit)'], ['anonsurvey','Anonymous Survey'], @@ -2997,18 +2761,13 @@ sub end_startouttext { if ($target eq 'edit') { my $areaid = 'homework_edit_'.$Apache::lonxml::curdepth; $text=&Apache::lonxml::get_all_text("endouttext",$parser,$style); - $result.=&Apache::edit::start_table($token)."
".&Apache::loncommon::insert_folding_button() - ." ".&mt('Text Block')."
".&mt('Text Block')."'.&mt('Delete?').' ' .&Apache::edit::deletelist($target,$token) .''; - if ($env{'environment.nocodemirror'}) { - $result.=&Apache::lonhtmlcommon::dragmath_button($areaid,1); - } else { - $result.=' '; - } - $result.='' + .&Apache::lonhtmlcommon::dragmath_button($areaid,1) + .'' .&Apache::edit::insertlist($target,$token) .'