--- loncom/homework/structuretags.pm 2015/12/03 20:40:27 1.541 +++ loncom/homework/structuretags.pm 2017/07/02 16:50:30 1.555 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # definition of tags that give a structure to a document # -# $Id: structuretags.pm,v 1.541 2015/12/03 20:40:27 damieng Exp $ +# $Id: structuretags.pm,v 1.555 2017/07/02 16:50:30 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -67,7 +67,7 @@ use lib '/home/httpd/lib/perl/'; use LONCAPA; BEGIN { - &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')); + &Apache::lonxml::register('Apache::structuretags',('block','languageblock','translated','instructorcomment','while','randomlist','problem','library','web','print','tex','part','preduedate','postanswerdate','solved','notsolved','problemtype','startpartmarker','startouttext','endpartmarker','endouttext','simpleeditbutton','definetag')); } @@ -192,6 +192,28 @@ sub end_web { return ''; } +sub start_print { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + if ($target ne 'edit' && $target ne 'modified') { + if ($target ne 'tex') { + my $skip = &Apache::lonxml::get_all_text("/print",$parser,$style); + &Apache::lonxml::debug("skipping ahead :$skip: $$parser[-1]"); + } + } elsif ($target eq "edit") { + my $bodytext = &Apache::lonxml::get_all_text_unbalanced("/print",$parser); + my $result = &Apache::edit::tag_start($target,$token); + $result .= &Apache::edit::editfield($token->[1],$bodytext,'',80,1); + return $result; + } elsif ($target eq "modified") { + return $token->[4].&Apache::edit::modifiedfield("/print",$parser); + } + return ''; +} + +sub end_print { + return ''; +} + sub start_tex { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; @@ -226,9 +248,11 @@ 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') { + my $crstype = &Apache::loncommon::course_type(); + if ($crstype eq 'Community') { $crstype = 'community'; + } elsif ($crstype eq 'Placement') { + $crstype = 'placement'; } else { if ($env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}) { $crstype = 'official'; @@ -390,8 +414,10 @@ sub setmode_javascript { @@ -417,9 +443,13 @@ sub page_start { $extra_head .= &homework_js(). &Apache::lonhtmlcommon::dragmath_js("EditMathPopup"); if (&Apache::lonhtmlcommon::htmlareabrowser()) { - my %textarea_args = ( + my %textarea_args; + if (($env{'request.state'} ne 'construct') || + ($env{'environment.nocodemirror'})) { + %textarea_args = ( dragmath => 'math', ); + } $extra_head .= &Apache::lonhtmlcommon::htmlareaselectactive(\%textarea_args); } my $is_task = ($env{'request.uri'} =~ /\.task$/); @@ -523,23 +553,25 @@ sub page_start { } elsif (!defined($found{'body'}) && $env{'request.state'} eq 'construct') { if ($target eq 'web' || $target eq 'edit') { - # Breadcrumbs for Authoring Space - &Apache::lonhtmlcommon::clear_breadcrumbs(); - &Apache::lonhtmlcommon::add_breadcrumb({ - 'text' => 'Authoring Space', - 'href' => &Apache::loncommon::authorspace($env{'request.uri'}), - }); - # breadcrumbs (and tools) will be created - # in start_page->bodytag->innerregister + unless ($env{'form.inhibitmenu'} eq 'yes') { + # Breadcrumbs for Authoring Space + &Apache::lonhtmlcommon::clear_breadcrumbs(); + &Apache::lonhtmlcommon::add_breadcrumb({ + 'text' => 'Authoring Space', + '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::lonhtmlcommon::add_breadcrumb({ +# 'text' => 'Problem Editing', # 'Problem Testing' +# 'href' => '', +# }); + $pageheader = &Apache::loncommon::head_subbox( + &Apache::loncommon::CSTR_pageheader()); + } + } } elsif (!defined($found{'body'})) { my %add_entries; my $background=&Apache::lonxml::get_param('background',$parstack, @@ -646,10 +678,11 @@ sub setup_rndseed { unless (defined($questiontype)) { $questiontype = $Apache::lonhomework::type; } - if ($env{'request.state'} eq "construct" - || $symb eq '' - || $Apache::lonhomework::type eq 'practice' - || $Apache::lonhomework::history{'resource.CODE'}) { + 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'))) { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['rndseed']); $rndseed=$env{'form.rndseed'}; @@ -658,7 +691,9 @@ sub setup_rndseed { if (!$rndseed) { $rndseed=time; } - $env{'form.rndseed'}=$rndseed; + unless ($env{'form.code_for_randomlist'}) { + $env{'form.rndseed'}=$rndseed; + } } if (($env{'request.state'} eq "construct") && ($Apache::lonhomework::type eq 'randomizetry')) { @@ -668,7 +703,7 @@ sub setup_rndseed { } $env{'form.'.$Apache::inputtags::part.'.rndseed'}=$rndseed; } - if ( ($env{'form.resetdata'} eq &mt('New Problem Variation') + if ( ($env{'form.resetdata'} eq 'new_problem_variation' && $env{'form.submitted'} eq 'yes') || $env{'form.newrandomization'} eq &mt('New Randomization')) { srand(time); @@ -686,7 +721,11 @@ sub setup_rndseed { $rndseed=join(':',&Apache::lonnet::digest($rndseed)); } } - if ($Apache::lonhomework::history{'resource.CODE'}) { + 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'}) { $rndseed=&Apache::lonnet::rndseed(); } $set_safespace = 1; @@ -770,7 +809,9 @@ sub problem_edit_buttons { if ($mode eq 'editxml') { $result.=&problem_edit_action_button('subedit','edit','e','Edit',1); $result.=&problem_edit_action_button('subundo','undoxml','u','Undo',1); - $result.=&Apache::lonhtmlcommon::dragmath_button("LC_editxmltext",1); + if ($env{'environment.nocodemirror'}) { + $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); @@ -943,7 +984,8 @@ $show_all - +
@@ -978,8 +1020,7 @@ $show_all 'onclick="javascript:setmode(this.form,'."'editxml'".')" />'; if ($env{'browser.type'} ne 'explorer' || $env{'browser.version'} > 9) { my $uri = $env{'request.uri'}; - my $daxeurl = '/adm/daxe/daxe.html?config=config/loncapa_config.xml&file=/daxeopen'.$uri. - '&save=/daxesave'; + my $daxeurl = '/daxepage'.$uri; $result .= ''; } @@ -1009,8 +1050,8 @@ sub initialize_storage { || $Apache::lonhomework::type eq 'practice') { my $namespace = $symb || $env{'request.uri'}; - if ($env{'form.resetdata'} eq &mt('Reset Submissions') || - ($env{'form.resetdata'} eq &mt('New Problem Variation') + if ($env{'form.resetdata'} eq 'reset_submissions' || + ($env{'form.resetdata'} eq 'new_problem_variation' && $env{'form.submitted'} eq 'yes') || $env{'form.newrandomization'} eq &mt('New Randomization')) { &Apache::lonnet::tmpreset($namespace,'',$domain,$name); @@ -1285,7 +1326,7 @@ sub store_aggregates { } else { $anoncounter{$symb."\0".$part} = 1; } - my $needsrelease = $Apache::lonnet::needsrelease{'parameter:type:'.$Apache::lonhomework::results{'resource.'.$part.'.type'}.':'}; + 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 '') { @@ -1529,10 +1570,6 @@ sub start_problem { my ($timelimit) = split(/_/,$interval[0]); &Apache::lonnet::set_first_access($interval[1],$timelimit); } - - ($status,$accessmsg,$slot_name,$slot,$ipused) = - &Apache::lonhomework::check_slot_access('0','problem'); - push (@Apache::inputtags::status,$status); } if ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex' @@ -1540,7 +1577,8 @@ sub start_problem { ($result,$form_tag_start,$probpartlist) = &page_start($target,$token,$tagstack,$parstack,$parser,$safeeval, $name); - } elsif (($target eq 'grade') && ($Apache::lonhomework::type eq 'randomizetry')) { + } elsif ((($target eq 'grade') && ($Apache::lonhomework::type eq 'randomizetry')) || + ($target eq 'answer')) { my ($symb)= &Apache::lonnet::whichuser(); my $navmap = Apache::lonnavmaps::navmap->new(); if (ref($navmap)) { @@ -1551,6 +1589,15 @@ sub start_problem { } } + if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || + $target eq 'tex') { + + my ($symb)= &Apache::lonnet::whichuser(); + ($status,$accessmsg,$slot_name,$slot,$ipused) = + &Apache::lonhomework::check_slot_access('0','problem',$symb,$probpartlist); + push (@Apache::inputtags::status,$status); + } + if ($target eq 'tex' and $env{'request.symb'} =~ m/\.page_/) {$result='';} if ($target eq 'analyze') { my $rndseed=&setup_rndseed($safeeval,$target); } @@ -1578,8 +1625,8 @@ sub start_problem { ($symb eq '' || $Apache::lonhomework::type eq 'practice')) { $form_tag_start.=''. - ''; + ''; if (exists($env{'form.username'})) { $form_tag_start.= ''; # create a page header and exit if ($env{'request.state'} eq "construct") { - $result.= &problem_web_to_edit_header($env{'form.rndseed'}); + if ($env{'form.inhibitmenu'} eq 'yes') { + # error messages can be useful in any case + $result.= &Apache::lonxml::message_location(); + } else { + $result.= &problem_web_to_edit_header($env{'form.rndseed'}); + } if ($Apache::lonhomework::type eq 'practice') { - $result.= ''. - &practice_problem_header().'
'; + $result.= ''. + &practice_problem_header().'
'; } } # if we are viewing someone else preserve that info @@ -1916,7 +1971,39 @@ sub end_problem { # Added separately at end of this routine, after added # so document will be valid xhtml. # - $result.= &Apache::loncommon::end_page({'discussion' => 1, + my $showdisc = 1; + if (($env{'course.'.$env{'request.course.id'}.'.type'} eq 'Placement') && + (!$env{'request.role.adv'})) { +# For Placement Tests footer with "Post Discussion" and "Send Feedback" links is suppressed. + $showdisc = 0; + my ($symb)= &Apache::lonnet::whichuser(); + if ($symb) { + my $navmap = Apache::lonnavmaps::navmap->new(); + if (ref($navmap)) { + my $hastries = &Apache::lonplacementtest::has_tries($symb,$navmap); +# For Placement Tests test status is displayed if this is the last resource in the course +# and there are no tries left + unless ($hastries) { + if (&Apache::lonplacementtest::is_lastres($symb,$navmap)) { + my ($score,$incomplete) = + &Apache::lonplacementtest::check_completion(undef,undef,1); + if (!$incomplete) { + $result .= &Apache::lonplacementtest::showresult(1,1); + } elsif ($incomplete < 100) { + $result.= &Apache::lonplacementtest::showincomplete($incomplete,1); + } + } else { +# For Placement Tests score is displayed if test has just been completed + my ($score,$incomplete) = &Apache::lonplacementtest::check_completion(undef,undef,1); + if (!$incomplete) { + $result.= &Apache::lonplacementtest::showresult(1,1); + } + } + } + } + } + } + $result.= &Apache::loncommon::end_page({'discussion' => $showdisc, 'notbody' => 1}); } elsif ($target eq 'tex') { my $endminipage = ''; @@ -2013,9 +2100,9 @@ sub start_library { ''; $result.=&problem_web_to_edit_header($rndseed); if ($Apache::lonhomework::type eq 'practice') { - $result.= ''. - &practice_problem_header().'
'; + $result.= ''. + &practice_problem_header().'
'; } } return $result; @@ -2512,7 +2599,12 @@ sub start_randomlist { } if (@randomlist) { my @idx_arr = (0 .. $#randomlist); - &Apache::structuretags::shuffle(\@idx_arr); + if ($env{'form.code_for_randomlist'}) { + &Apache::structuretags::shuffle(\@idx_arr,$target); + undef($env{'form.code_for_randomlist'}); + } else { + &Apache::structuretags::shuffle(\@idx_arr); + } my $bodytext = ''; my $show=$#randomlist; my $showarg=&Apache::lonxml::get_param('show',$parstack,$safeeval); @@ -2551,10 +2643,10 @@ sub start_randomlist { } sub shuffle { - my $a=shift; + my ($a,$target) = @_; my $i; if (ref($a) eq 'ARRAY' && @$a) { - &Apache::response::pushrandomnumber(); + &Apache::response::pushrandomnumber(undef,$target); for($i=@$a;--$i;) { my $j=int(&Math::Random::random_uniform() * ($i+1)); next if $i == $j; @@ -2960,9 +3052,13 @@ sub end_startouttext { .''.&mt('Delete?').' ' .&Apache::edit::deletelist($target,$token) .'' - .'' - .&Apache::lonhtmlcommon::dragmath_button($areaid,1) - .'' + .''; + if ($env{'environment.nocodemirror'}) { + $result.=&Apache::lonhtmlcommon::dragmath_button($areaid,1); + } else { + $result.=' '; + } + $result.='' .'' .&Apache::edit::insertlist($target,$token) .''