Annotation of loncom/homework/optionresponse.pm, revision 1.1
1.1 ! albertel 1: # The LearningOnline Network with CAPA
! 2: # option list style responses
! 3:
! 4: package Apache::optionresponse;
! 5: use strict;
! 6:
! 7: sub BEGIN {
! 8: &Apache::lonxml::register('Apache::optionresponse',('optionresponse'));
! 9: }
! 10:
! 11: sub start_optionresponse {
! 12: my ($target,$token,$parstack,$parser,$safeeval,$style)=@_;
! 13: #when in a radiobutton response use these
! 14: &Apache::lonxml::register('Apache::optionresponse',('foilgroup','foil'));
! 15: my $id = &Apache::response::start_response($parstack,$safeeval);
! 16: return '';
! 17: }
! 18:
! 19: sub end_optionresponse {
! 20: &Apache::response::end_response;
! 21: return '';
! 22: }
! 23:
! 24: %Apache::response::foilgroup={};
! 25: sub start_foilgroup {
! 26: %Apache::response::foilgroup={};
! 27: return '';
! 28: }
! 29:
! 30: sub setrandomnumber {
! 31: my $rndseed=&Apache::lonnet::rndseed();
! 32: $rndseed=unpack("%32i",$rndseed);
! 33: $rndseed=$rndseed
! 34: +&Apache::lonnet::numval($Apache::inputtags::part)
! 35: +&Apache::lonnet::numval($Apache::inputtags::response['-1']);
! 36: srand($rndseed);
! 37: return '';
! 38: }
! 39:
! 40: sub end_foilgroup {
! 41: my ($target,$token,$parstack,$parser,$safeeval,$style)=@_;
! 42:
! 43: my $result;
! 44: if ($target ne 'meta') {
! 45: my $name;
! 46: &setrandomnumber();
! 47: my ($count,$max) = &getfoilcounts($parstack,$safeeval);
! 48: if ($count>$max) { $count=$max }
! 49: &Apache::lonxml::debug("Count is $count from $max");
! 50: my $args ='';
! 51: if ( $#$parstack > 0 ) { $args=$$parstack['-1']; }
! 52: my @opt;
! 53: eval '@opt ='.&Apache::run::run("{$args;".'return $options}',$safeeval);
! 54: if ($target eq 'web') {
! 55: $result=&displayfoils($count,@opt);
! 56: } elsif ( $target eq 'grade') {
! 57: if ( defined $ENV{'form.submitted'}) {
! 58: my @whichopt = &whichfoils($count);
! 59: my $temp=1;my $name;
! 60: my $allresponse;
! 61: my $right=0;
! 62: my $wrong=0;
! 63: foreach $name (@whichopt) {
! 64: my $response = $ENV{'form.HWVAL_'.$Apache::inputtags::response['-1'].":$temp"};
! 65: $allresponse.="$response:";
! 66: if ( $response =~ /[^\s]/) {
! 67: &Apache::lonxml::debug("submitted a $response<br>\n");
! 68: my $value=$Apache::response::foilgroup{$name.'.value'};
! 69: if ($value eq $response) {$right++;} else {$wrong++;}
! 70: }
! 71: $temp++;
! 72: }
! 73: my $id = $Apache::inputtags::response['-1'];
! 74: $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.submission"}=$allresponse;
! 75: &Apache::lonxml::debug("Got $right right and $wrong wrong");
! 76: if ($wrong==0) {
! 77: $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.awarddetail"}='EXACT_ANS';
! 78: } else {
! 79: $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.awarddetail"}='INCORRECT';
! 80: }
! 81: }
! 82: }
! 83: }
! 84: return $result;
! 85: }
! 86:
! 87: sub getfoilcounts {
! 88: my ($parstack,$safeeval)=@_;
! 89: my $rrargs ='';
! 90: if ( $#$parstack > 0 ) { $rrargs=$$parstack['-2']; }
! 91: my $max = &Apache::run::run("{$rrargs;".'return $max}',$safeeval);
! 92: my $count = $#{ $Apache::response::foilgroup{'names'} };
! 93: return ($count,$max);
! 94: }
! 95:
! 96: sub whichfoils {
! 97: my ($max)=@_;
! 98: my @names = @{ $Apache::response::foilgroup{'names'} };
! 99: my @whichopt =();
! 100: while ((($#whichopt+1) < $max) && ($#names > -1)) {
! 101: my $aopt=int rand $#names;
! 102: &Apache::lonxml::debug("From $#names elms, picking $aopt");
! 103: $aopt=splice(@names,$aopt,1);
! 104: &Apache::lonxml::debug("Picked $aopt");
! 105: push (@whichopt,$aopt);
! 106: }
! 107: return @whichopt;
! 108: }
! 109:
! 110: sub displayfoils {
! 111: my ($max,@opt)=@_;
! 112: my @names = @{ $Apache::response::foilgroup{'names'} };
! 113: my @truelist;
! 114: my @falselist;
! 115: my $result;
! 116: my $name;
! 117: my @whichopt = &whichfoils($max);
! 118: my $optionlist="<option></option>\n";
! 119: my $option;
! 120: foreach $option (@opt) {
! 121: $optionlist.="<option>$option</option>\n";
! 122: }
! 123: if ($Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"} =~ /^correct/ ) {
! 124: foreach $name (@whichopt) {
! 125: $result.="<br />".$Apache::response::foilgroup{$name.'.value'}.
! 126: ":".$Apache::response::foilgroup{$name.'.text'}."\n";
! 127: }
! 128: } else {
! 129: my $temp=1;
! 130: foreach $name (@whichopt) {
! 131: $result.="<br /><select name=\"HWVAL_$Apache::inputtags::response['-1']:$temp\">"
! 132: .$optionlist
! 133: ."</select>\n".$Apache::response::foilgroup{$name.'.text'}."\n";
! 134: $temp++;
! 135: }
! 136: }
! 137: return $result."<br />";
! 138: }
! 139:
! 140: sub start_foil {
! 141: $Apache::lonxml::redirection--;
! 142: return '';
! 143: }
! 144:
! 145: sub end_foil {
! 146: my ($target,$token,$parstack,$parser,$safeeval,$style)=@_;
! 147: if ($target eq 'web' || $target eq 'grade') {
! 148: my $args ='';
! 149: if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }
! 150: my $value = &Apache::run::run("{$args;".'return $value}',$safeeval);
! 151: if ($value ne 'unused') {
! 152: my $name = &Apache::run::run("{$args;".'return $name}',$safeeval);
! 153: push @{ $Apache::response::foilgroup{'names'} }, $name;
! 154: $Apache::response::foilgroup{"$name.value"} = $value;
! 155: $Apache::response::foilgroup{"$name.text"} = $Apache::lonxml::outputstack;
! 156: }
! 157: }
! 158:
! 159: $Apache::lonxml::redirection++;
! 160: if ($Apache::lonxml::redirection == 1) {
! 161: $Apache::lonxml::outputstack='';
! 162: }
! 163: return '';
! 164: }
! 165:
! 166: 1;
! 167: __END__
! 168:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>