--- loncom/homework/hint.pm 2004/01/07 21:01:17 1.46 +++ loncom/homework/hint.pm 2004/12/06 19:48:22 1.58 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # implements the tags that control the hints # -# $Id: hint.pm,v 1.46 2004/01/07 21:01:17 albertel Exp $ +# $Id: hint.pm,v 1.58 2004/12/06 19:48:22 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -29,8 +29,9 @@ package Apache::hinttags; use strict; -use Apache::lonnet; +use Apache::lonnet(); use capa; +use Apache::lonlocal; BEGIN { &Apache::lonxml::register('Apache::hinttags',('hintgroup','hintpart','numericalhint','stringhint','formulahint','optionhint','radiobuttonhint')); @@ -47,16 +48,30 @@ sub start_hintgroup { my $id=$Apache::inputtags::part; my $numtries=$Apache::lonhomework::history{"resource.$id.tries"}; if ( $numtries eq '') { $numtries = 0; } - my $hinttries=&Apache::lonnet::EXT("resource.$id.hinttries"); - if ( $hinttries eq '') { $hinttries = 1; } + my $hinttries=&Apache::response::get_response_param($id,"hinttries",1); &Apache::lonxml::debug("found :$id:$numtries:$hinttries:"); - my $gradestatus=$Apache::lonhomework::history{"resource.$id.solved"}; - if ( $numtries < $hinttries || $gradestatus =~ /^correct/) { + my $gradestatus= + $Apache::lonhomework::history{"resource.$id.solved"}; + my $showoncorrect=lc(&Apache::lonxml::get_param('showoncorrect',$parstack,$safeeval)); + &Apache::lonxml::debug("onc orrect $showoncorrect, $gradestatus"); + if ( ($showoncorrect ne 'yes' && &Apache::response::show_answer()) || + ( $numtries < $hinttries) ) { + &Apache::lonxml::debug("Grabbin all"); &Apache::lonxml::get_all_text("/hintgroup",$parser); } &Apache::lonxml::startredirection; } elsif ($target eq 'tex') { $result .= '\keephidden{'; + } elsif ($target eq 'edit') { + $result.=&Apache::edit::tag_start($target,$token); + $result.=&Apache::edit::select_arg('Show hint even if problem Correct:','showoncorrect',[['no',&mt('No')],['yes',&mt('Yes')]],$token); + $result.=&Apache::edit::end_row().&Apache::edit::start_spanning_row(); + } elsif ($target eq 'modified') { + my $constructtag=&Apache::edit::get_new_args($token,$parstack,$safeeval,'showoncorrect'); + if ($constructtag) { + $result =&Apache::edit::rebuild_tag($token); + $result.=&Apache::edit::handle_insert(); + } } @Apache::hint::which=(); return $result; @@ -70,8 +85,7 @@ sub end_hintgroup { my $id=$Apache::inputtags::part; my $numtries=$Apache::lonhomework::history{"resource.$id.tries"}; if ( $numtries eq '') { $numtries = 0; } - my $hinttries=&Apache::lonnet::EXT("resource.$id.hinttries"); - if ( $hinttries eq '') { $hinttries = 1; } + my $hinttries=&Apache::response::get_response_param($id,"hinttries",1); &Apache::lonxml::debug("found :$id:$numtries:$hinttries:"); my $hinttext=&Apache::lonxml::endredirection; if ($Apache::lonhomework::type ne 'exam' && @@ -145,7 +159,7 @@ sub end_numericalhint { } $safeeval->share_from('capa',['&caparesponse_capa_check_answer']); my $name= &Apache::lonxml::get_param('name',$parstack,$safeeval); - &Apache::response::setup_params('numericalhint'); + &Apache::response::setup_params('numericalhint',$safeeval); my $partid=$Apache::inputtags::part; my $id=$Apache::inputtags::response['-1']; #id submissions occured under @@ -153,28 +167,35 @@ sub end_numericalhint { my $response = $Apache::lonhomework::history{ "resource.$partid.$submitid.submission"}; &Apache::lonxml::debug("hintgroup is using $response
\n"); - #build safe space expression - my $expression="&caparesponse_check_list('".$response."','". - $$parstack[$#$parstack]; + my $hideunit=&Apache::response::get_response_param($partid.'_'.$submitid,'turnoffunit'); + my $args_ref= \%{$safeeval->varglob('LONCAPA::CAPAresponse_args')}; + $$args_ref{'response'}=$response; #need to get all possible parms + foreach my $arg ('type','tol','sig','ans_fmt','unit','calc', + 'samples') { + $$args_ref{$arg}= + &Apache::lonxml::get_param($arg,$parstack,$safeeval); + } foreach my $key (keys(%Apache::inputtags::params)) { - $expression.= ';my $'. #' - $key.'="'.$Apache::inputtags::params{$key}.'"'; + $$args_ref{$key}=$Apache::inputtags::params{$key}; } + if (lc($hideunit) eq "yes") { delete($$args_ref{'unit'}); } if ($$tagstack[-1] eq 'formulahint') { - $expression.=';my $type="fml";'; + $$args_ref{'type'}='fml'; } elsif ($$tagstack[-1] eq 'numericalhint') { - $expression.=';my $type="float";'; + $$args_ref{'type'}='float'; } - $expression.="');"; my @answer=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval); &Apache::lonxml::debug('answer is'.join(':',@answer)); - @{$safeeval->varglob('CAPARESPONSE_CHECK_LIST_answer')}=@answer; + @{$safeeval->varglob('LONCAPA::CAPAresponse_answer')}=@answer; - $result = &Apache::run::run($expression,$safeeval); - &Apache::lonxml::debug("$expression:result:$result:$Apache::lonxml::curdepth"); - my ($awards) = split /:/ , $result; - my ($ad) = &Apache::inputtags::finalizeawards(split /,/ , $awards); + ($result,my @msgs) = &Apache::run::run("&caparesponse_check_list()", + $safeeval); + &Apache::lonxml::debug('msgs are'.join(':',@msgs)); + &Apache::lonxml::debug("result:$result:$Apache::lonxml::curdepth"); + my ($awards)=split(/:/,$result); + my (@awards) = split(/,/,$awards); + my ($ad, $msg) = &Apache::inputtags::finalizeawards(\@awards,\@msgs); if ($ad eq 'EXACT_ANS' || $ad eq 'APPROX_ANS') { push (@Apache::hint::which,$name); } $result=''; } elsif ($target eq 'meta') { @@ -186,20 +207,103 @@ sub end_numericalhint { return $result; } -sub start_stringhint { +sub start_formulahint { return &start_numericalhint(@_); } -sub end_stringhint { +sub end_formulahint { return &end_numericalhint(@_); } -sub start_formulahint { - return &start_numericalhint(@_); +sub start_stringhint { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + #do everything in end, so intervening work + &Apache::response::start_hintresponse($parstack,$safeeval); + my $result; + if ($target eq 'edit') { + $result.=&Apache::edit::tag_start($target,$token); + $result.=&Apache::edit::text_arg('Name:','name',$token); + $result.=&Apache::edit::text_arg('Answer:','answer',$token); + $result.=&Apache::edit::select_arg('Type:','type', + [['cs','Case Sensitive'],['ci','Case Insensitive'], + ['mc','Case Insensitive, Any Order'], + ['re','Regular Expression']],$token); + $result.=&Apache::edit::end_row(); + $result.=&Apache::edit::start_spanning_row(); + } elsif ($target eq 'modified') { + my $constructtag; + $constructtag=&Apache::edit::get_new_args($token,$parstack, + $safeeval,'name','answer', + 'type'); + $result = &Apache::edit::rebuild_tag($token); + $result .= &Apache::edit::handle_insert(); + } elsif ($target eq 'web') { + &Apache::response::reset_params(); + } + return $result; } -sub end_formulahint { - return end_numericalhint(@_); +sub end_stringhint { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; + my $result; + if ($target eq 'web') { + if (!$Apache::lonxml::default_homework_loaded) { + &Apache::lonxml::default_homework_load($safeeval); + } + my $answer=&Apache::lonxml::get_param('answer',$parstack,$safeeval); + $safeeval->share_from('capa',['&caparesponse_capa_check_answer']); + my $name= &Apache::lonxml::get_param('name',$parstack,$safeeval); + &Apache::response::setup_params('stringhint',$safeeval); + my $partid=$Apache::inputtags::part; + my $id=$Apache::inputtags::response['-1']; + #id submissions occured under + my $submitid=$Apache::inputtags::response['-2']; + my $response = $Apache::lonhomework::history{ + "resource.$partid.$submitid.submission"}; + &Apache::lonxml::debug("hintgroup is using $response
\n"); + my $args_ref= \%{$safeeval->varglob('LONCAPA::CAPAresponse_args')}; + $$args_ref{'response'}=$response; + my $type=$$args_ref{'type'}=&Apache::lonxml::get_param('type',$parstack,$safeeval); + my ($ad,$msg); + if ($type eq 're' ) { + ${$safeeval->varglob('LONCAPA::response')}=$response; + my $compare='='; + if ($answer=~/^\s*NOT\s*/) { + $answer=~s/^\s*NOT\s*//; + $compare='!'; + } + my $test='$LONCAPA::response'.$compare.'~m'.$answer; + &Apache::lonxml::debug("test $test"); + $result = &Apache::run::run("return $test",$safeeval); + &Apache::lonxml::debug("current $response"); + &Apache::lonxml::debug("current $answer"); + $ad = ($result) ? 'APPROX_ANS' : 'INCORRECT'; + } else { + foreach my $key (keys(%Apache::inputtags::params)) { + $$args_ref{$key}=$Apache::inputtags::params{$key}; + } + &Apache::lonxml::debug('answer is'.$answer); + @{$safeeval->varglob('LONCAPA::CAPAresponse_answer')}=($answer); + + ($result,my @msgs)=&Apache::run::run("&caparesponse_check_list()", + $safeeval); + &Apache::lonxml::debug('msgs are'.join(':',@msgs)); + &Apache::lonxml::debug("result:$result:$Apache::lonxml::curdepth"); + my ($awards)=split(/:/,$result); + my (@awards) = split(/,/,$awards); + ($ad, $msg) = &Apache::inputtags::finalizeawards(\@awards,\@msgs); + } + if ($ad eq 'EXACT_ANS' || $ad eq 'APPROX_ANS') { + push (@Apache::hint::which,$name); + } + $result=''; + } elsif ($target eq 'meta') { + $result=&Apache::response::meta_package_write($token->[1]); + } elsif ($target eq 'edit') { + $result.=''.&Apache::edit::end_table; + } + &Apache::response::end_hintresponse(); + return $result; } # a part shows if it is on, if no specific parts are on, then default shows 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.