Annotation of loncom/homework/optionresponse.pm, revision 1.5
1.1 albertel 1: # The LearningOnline Network with CAPA
2: # option list style responses
1.4 albertel 3: # 2/21 Guy
1.1 albertel 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
1.2 albertel 14: &Apache::lonxml::register('Apache::optionresponse',('foilgroup','foil','conceptgroup'));
1.1 albertel 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={};
1.5 ! albertel 27: $Apache::optionresponse::conceptgroup=0;
! 28: &setrandomnumber();
1.1 albertel 29: return '';
30: }
31:
32: sub setrandomnumber {
33: my $rndseed=&Apache::lonnet::rndseed();
34: $rndseed=unpack("%32i",$rndseed);
35: $rndseed=$rndseed
36: +&Apache::lonnet::numval($Apache::inputtags::part)
37: +&Apache::lonnet::numval($Apache::inputtags::response['-1']);
38: srand($rndseed);
1.5 ! albertel 39: &Apache::lonxml::debug("randseed $rndseed");
1.1 albertel 40: return '';
41: }
42:
43: sub end_foilgroup {
44: my ($target,$token,$parstack,$parser,$safeeval,$style)=@_;
45:
46: my $result;
47: if ($target ne 'meta') {
48: my $name;
49: my ($count,$max) = &getfoilcounts($parstack,$safeeval);
50: if ($count>$max) { $count=$max }
51: &Apache::lonxml::debug("Count is $count from $max");
52: my $args ='';
53: if ( $#$parstack > 0 ) { $args=$$parstack['-1']; }
54: my @opt;
55: eval '@opt ='.&Apache::run::run("{$args;".'return $options}',$safeeval);
56: if ($target eq 'web') {
57: $result=&displayfoils($count,@opt);
58: } elsif ( $target eq 'grade') {
59: if ( defined $ENV{'form.submitted'}) {
60: my @whichopt = &whichfoils($count);
61: my $temp=1;my $name;
62: my $allresponse;
63: my $right=0;
64: my $wrong=0;
65: foreach $name (@whichopt) {
66: my $response = $ENV{'form.HWVAL_'.$Apache::inputtags::response['-1'].":$temp"};
67: $allresponse.="$response:";
68: if ( $response =~ /[^\s]/) {
1.3 albertel 69: &Apache::lonxml::debug("submitted a $response<br />\n");
1.1 albertel 70: my $value=$Apache::response::foilgroup{$name.'.value'};
71: if ($value eq $response) {$right++;} else {$wrong++;}
72: }
73: $temp++;
74: }
75: my $id = $Apache::inputtags::response['-1'];
76: $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.submission"}=$allresponse;
77: &Apache::lonxml::debug("Got $right right and $wrong wrong");
78: if ($wrong==0) {
79: $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.awarddetail"}='EXACT_ANS';
80: } else {
81: $Apache::lonhomework::results{"resource.$Apache::inputtags::part.$id.awarddetail"}='INCORRECT';
82: }
83: }
84: }
85: }
86: return $result;
87: }
88:
89: sub getfoilcounts {
90: my ($parstack,$safeeval)=@_;
91: my $rrargs ='';
92: if ( $#$parstack > 0 ) { $rrargs=$$parstack['-2']; }
93: my $max = &Apache::run::run("{$rrargs;".'return $max}',$safeeval);
94: my $count = $#{ $Apache::response::foilgroup{'names'} };
95: return ($count,$max);
96: }
97:
98: sub whichfoils {
99: my ($max)=@_;
100: my @names = @{ $Apache::response::foilgroup{'names'} };
101: my @whichopt =();
102: while ((($#whichopt+1) < $max) && ($#names > -1)) {
103: my $aopt=int rand $#names;
104: &Apache::lonxml::debug("From $#names elms, picking $aopt");
105: $aopt=splice(@names,$aopt,1);
106: &Apache::lonxml::debug("Picked $aopt");
107: push (@whichopt,$aopt);
108: }
109: return @whichopt;
110: }
111:
112: sub displayfoils {
113: my ($max,@opt)=@_;
114: my @names = @{ $Apache::response::foilgroup{'names'} };
115: my @truelist;
116: my @falselist;
117: my $result;
118: my $name;
119: my @whichopt = &whichfoils($max);
120: my $optionlist="<option></option>\n";
121: my $option;
122: foreach $option (@opt) {
123: $optionlist.="<option>$option</option>\n";
124: }
125: if ($Apache::lonhomework::history{"resource.$Apache::inputtags::part.solved"} =~ /^correct/ ) {
126: foreach $name (@whichopt) {
127: $result.="<br />".$Apache::response::foilgroup{$name.'.value'}.
128: ":".$Apache::response::foilgroup{$name.'.text'}."\n";
129: }
130: } else {
131: my $temp=1;
132: foreach $name (@whichopt) {
133: $result.="<br /><select name=\"HWVAL_$Apache::inputtags::response['-1']:$temp\">"
134: .$optionlist
135: ."</select>\n".$Apache::response::foilgroup{$name.'.text'}."\n";
136: $temp++;
137: }
138: }
139: return $result."<br />";
140: }
141:
1.5 ! albertel 142:
1.2 albertel 143: sub start_conceptgroup {
1.5 ! albertel 144: $Apache::optionresponse::conceptgroup=1;
! 145: %Apache::response::conceptgroup={};
! 146: return '';
1.2 albertel 147: }
148:
149: sub end_conceptgroup {
1.5 ! albertel 150: my ($target,$token,$parstack,$parser,$safeeval,$style)=@_;
! 151: $Apache::optionresponse::conceptgroup=0;
! 152: if ($target eq 'web' || $target eq 'grade') {
! 153: my @names = @{ $Apache::response::conceptgroup{'names'} };
! 154: my $pick=int rand $#names+1;
! 155: my $name=$names[$pick];
! 156: push @{ $Apache::response::foilgroup{'names'} }, $name;
! 157: $Apache::response::foilgroup{"$name.value"} = $Apache::response::conceptgroup{"$name.value"};
! 158: $Apache::response::foilgroup{"$name.text"} = $Apache::response::conceptgroup{"$name.text"};
! 159: my $args;
! 160: if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }
! 161: my $concept = &Apache::run::run("{$args;".'return $concept}',$safeeval);
! 162: $Apache::response::foilgroup{"$name.concept"} = $concept;
! 163: &Apache::lonxml::debug("Selecting $name in $concept");
! 164: }
! 165: return '';
1.2 albertel 166: }
167:
1.1 albertel 168: sub start_foil {
1.2 albertel 169: my ($target,$token,$parstack,$parser,$safeeval,$style)=@_;
1.4 albertel 170: if ($target eq 'web') { &Apache::lonxml::startredirection; }
1.1 albertel 171: return '';
172: }
173:
174: sub end_foil {
175: my ($target,$token,$parstack,$parser,$safeeval,$style)=@_;
1.4 albertel 176: my $text ='';
177: if ($target eq 'web') { $text=&Apache::lonxml::endredirection; }
1.1 albertel 178: if ($target eq 'web' || $target eq 'grade') {
179: my $args ='';
180: if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }
181: my $value = &Apache::run::run("{$args;".'return $value}',$safeeval);
182: if ($value ne 'unused') {
183: my $name = &Apache::run::run("{$args;".'return $name}',$safeeval);
1.5 ! albertel 184: if ( $Apache::optionresponse::conceptgroup ) {
! 185: push @{ $Apache::response::conceptgroup{'names'} }, $name;
! 186: $Apache::response::conceptgroup{"$name.value"} = $value;
! 187: $Apache::response::conceptgroup{"$name.text"} = $text;
! 188: } else {
! 189: push @{ $Apache::response::foilgroup{'names'} }, $name;
! 190: $Apache::response::foilgroup{"$name.value"} = $value;
! 191: $Apache::response::foilgroup{"$name.text"} = $text;
! 192: }
1.2 albertel 193: }
1.1 albertel 194: }
195: return '';
196: }
197:
198: 1;
199: __END__
200:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>