--- loncom/homework/matchresponse.pm 2003/09/23 01:52:57 1.20.2.1 +++ loncom/homework/matchresponse.pm 2003/11/15 06:28:02 1.31 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Full matching style response # -# $Id: matchresponse.pm,v 1.20.2.1 2003/09/23 01:52:57 albertel Exp $ +# $Id: matchresponse.pm,v 1.31 2003/11/15 06:28:02 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -25,7 +25,6 @@ # # http://www.lon-capa.org/ # -# 2/21 Guy package Apache::matchresponse; use strict; @@ -66,6 +65,9 @@ sub start_matchresponse { $safeeval,'max', 'randomize'); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } + } elsif ($target eq 'analyze') { + my $part_id="$Apache::inputtags::part.$id"; + push (@{ $Apache::lonhomework::analyze{"parts"} },$part_id); } return $result; } @@ -102,7 +104,7 @@ sub start_itemgroup { $safeeval,'randomize', 'location'); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } - } elsif ($target eq 'web') { + } elsif ($target eq 'web' or $target eq 'tex') { $Apache::matchresponse::itemtable{'location'}= &Apache::lonxml::get_param('location',$parstack,$safeeval); } @@ -121,6 +123,10 @@ sub end_itemgroup { @names=&Apache::response::whichorder($#names+1,$randomize,0, \%Apache::response::itemgroup); } + if ($target eq 'analyze') { + my $partid="$Apache::inputtags::part.$Apache::inputtags::response[-1]"; + push (@{ $Apache::lonhomework::analyze{"$partid.items"} }, @names); + } my %letter_name_map; my %name_letter_map; my @alphabet=('A'..'Z'); @@ -144,16 +150,15 @@ sub end_itemgroup { $table.=''; $Apache::matchresponse::itemtable{'display'}=$table; } elsif ($target eq 'tex') { - my $table=' \\\\\\\\ \begin{description} '; + my $table=' \begin{description} '; my $i=0; foreach my $name (@names) { $Apache::response::itemgroup{$name.'.text'}=~s/\$\$/\$/g; $table.='\item['.$alphabet[$i].'] '. - $Apache::response::itemgroup{$name.'.text'}. - ' \\\\ '; + $Apache::response::itemgroup{$name.'.text'}; $i++; } - $table.=' \end{description} \strut \\\\ '; + $table.=' \end{description} \strut '; $Apache::matchresponse::itemtable{'display'}=$table; } return $result; @@ -162,7 +167,7 @@ sub end_itemgroup { sub start_item { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; - if ($target eq 'web' || $target eq 'tex') { + if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze') { &Apache::lonxml::startredirection; } elsif ($target eq 'edit') { my $randomize=&Apache::lonxml::get_param('randomize',$parstack, @@ -188,11 +193,11 @@ sub end_item { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $text =''; my $result = ''; - if ($target eq 'web' || $target eq 'tex') { + if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze') { $text=&Apache::lonxml::endredirection; } if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || - $target eq 'edit' || $target eq 'tex') { + $target eq 'edit' || $target eq 'tex' || $target eq 'analyze') { my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval); my $location=&Apache::lonxml::get_param('location',$parstack, $safeeval); @@ -237,7 +242,7 @@ sub start_foilgroup { sub end_foilgroup { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; - if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || $target eq 'tex') { + if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || $target eq 'tex' || $target eq 'analyze') { my $max = &Apache::lonxml::get_param('max',$parstack,$safeeval,'-2'); my $randomize = &Apache::lonxml::get_param('randomize',$parstack, $safeeval,'-2'); @@ -247,6 +252,11 @@ sub end_foilgroup { $result=&displayanswers($max,$randomize); } elsif ( $target eq 'grade') { &grade_response($max,$randomize); + } elsif ( $target eq 'analyze') { + my @shown=&whichfoils($max,$randomize); + &Apache::response::analyze_store_foilgroup(\@shown, + ['text','value','location']); + #FIXME need to store options in some way } &Apache::lonxml::increment_counter(&getfoilcounts($max)); } elsif ($target eq 'edit') { @@ -255,6 +265,14 @@ sub end_foilgroup { return $result; } +sub whichfoils { + my ($max,$randomize)=@_; + return &Apache::response::whichorder(&getfoilcounts($max), + $randomize, + &Apache::response::showallfoils(), + \%Apache::response::foilgroup); +} + sub displayanswers { my ($max,$randomize,@opt)=@_; if (!defined(@{ $Apache::response::foilgroup{'names'} })) { return; } @@ -294,12 +312,14 @@ sub grade_response { %letter_name_map= %{ $Apache::response::itemgroup{'letter_name_map'} }; } + my @items; foreach my $name (@whichfoils) { - my $response = $ENV{'form.HWVAL_'.$Apache::inputtags::response['-1'].":$temp"}; + my $response = &Apache::response::getresponse($temp); + push(@items,$response); my $responsename = $letter_name_map{$response}; - $responsehash{$name}=$responsename; my $value=$Apache::response::foilgroup{$name.'.value'}; if ( $response =~ /[^\s]/) { + $responsehash{$name}=$responsename; &Apache::lonxml::debug("submitted a $response for $value
\n"); if ($value eq $responsename) { $grade{$name}='1'; $right++; @@ -314,9 +334,9 @@ sub grade_response { my $part=$Apache::inputtags::part; my $id = $Apache::inputtags::response['-1']; my $responsestr=&Apache::lonnet::hash2str(%responsehash); + my $itemstr =&Apache::lonnet::array2str(@items); my $gradestr =&Apache::lonnet::hash2str(%grade); - my %previous =&Apache::response::check_for_previous($responsestr, - $part,$id); + my %previous=&Apache::response::check_for_previous($responsestr,$part,$id); &Apache::lonxml::debug("Got $right right and $wrong wrong, and $ignored were ignored "); my $ad; if ($wrong==0 && $ignored==0) { @@ -332,6 +352,8 @@ sub grade_response { } $Apache::lonhomework::results{"resource.$part.$id.submission"}= $responsestr; + $Apache::lonhomework::results{"resource.$part.$id.submissionitems"}= + $itemstr; $Apache::lonhomework::results{"resource.$part.$id.submissiongrading"}= $gradestr; $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad; @@ -359,7 +381,6 @@ sub displayfoils { \%Apache::response::foilgroup); my $part=$Apache::inputtags::part; my $solved=$Apache::lonhomework::history{"resource.$part.solved"}; - my $status=$Apache::inputtags::status[-1]; my %letter_name_map; if (defined(%{ $Apache::response::itemgroup{'letter_name_map'} })) { %letter_name_map= @@ -370,7 +391,7 @@ sub displayfoils { %name_letter_map= %{ $Apache::response::itemgroup{'name_letter_map'} }; } - if ( &Apache::response::show_answer() ) { + if ( &Apache::response::show_answer() && ($target ne 'tex')) { foreach my $name (@whichfoils) { my $text=$Apache::response::foilgroup{$name.'.text'}; my $value=$Apache::response::foilgroup{$name.'.value'}; @@ -423,7 +444,7 @@ sub displayfoils { $question.='
'.$text."\n"; } if ($Apache::lonhomework::type eq 'exam') { - $question.=&Apache::optionresponse::webbubbles(\@used_letters,\@used_letters,$temp); + $question.=&Apache::optionresponse::webbubbles(\@used_letters,\@used_letters,$temp,$last_letter); } } else { if ($Apache::lonhomework::type eq 'exam') { @@ -433,7 +454,7 @@ sub displayfoils { $question.='\vskip -2 mm\parbox{\textwidth}{\begin{enumerate}\item[\textbf{'.$internal_counter.'}.]\parbox{\textwidth - 5 mm}{'.&Apache::optionresponse::bubbles(\@used_letters,\@emptyItems).'}\end{enumerate}} \vskip -10 mm \strut '; $internal_counter++; } else { - $question.=' \\\\ '.$optionlist.$text."\n"; + $question.=' '.$optionlist.$text.'\strut\\\\\strut '."\n"; } } $temp++; @@ -488,31 +509,12 @@ sub end_conceptgroup { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; $Apache::matchresponse::conceptgroup=0; my $result=''; - if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' ) { - #if not there aren't any foils to display and thus no question - if (defined(@{ $Apache::response::conceptgroup{'names'} })) { - my @names = @{ $Apache::response::conceptgroup{'names'} }; - my $pick=int(&Math::Random::random_uniform() * ($#names+1)); - my $name=$names[$pick]; - push @{ $Apache::response::foilgroup{'names'} }, $name; - $Apache::response::foilgroup{"$name.value"} = - $Apache::response::conceptgroup{"$name.value"}; - $Apache::response::foilgroup{"$name.text"} = - $Apache::response::conceptgroup{"$name.text"}; - $Apache::response::foilgroup{"$name.location"} = - $Apache::response::conceptgroup{"$name.location"}; - my $concept = &Apache::lonxml::get_param('concept',$parstack, - $safeeval); - $Apache::response::foilgroup{"$name.concept"} = $concept; - &Apache::lonxml::debug("Selecting $name in $concept"); - if ($target eq 'web') { - my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]"; - push(@{ $Apache::hint::match{"$part_id.concepts"} }, - $concept); - $Apache::hint::match{"$part_id.concept.$concept"}= - $Apache::response::conceptgroup{'names'}; - } - } + if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || + $target eq 'tex' || $target eq 'analyze') { + &Apache::response::pick_foil_for_concept($target, + ['value','text','location'], + \%Apache::hint::match, + $parstack,$safeeval); } elsif ($target eq 'edit') { $result=&Apache::edit::end_table(); } @@ -527,7 +529,7 @@ sub insert_conceptgroup { sub start_foil { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result=''; - if ($target eq 'web' || $target eq 'tex') { + if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze') { &Apache::lonxml::startredirection; } elsif ($target eq 'edit') { $result=&Apache::edit::tag_start($target,$token,"Foil"); @@ -559,10 +561,11 @@ sub end_foil { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $text =''; my $result = ''; - if ($target eq 'web' || $target eq 'tex') { + if ($target eq 'web' || $target eq 'tex' || $target eq 'analyze') { $text=&Apache::lonxml::endredirection; } - if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || $target eq 'tex') { + if ($target eq 'web' || $target eq 'grade' || $target eq 'answer' || + $target eq 'tex' || $target eq 'analyze') { my $value = &Apache::lonxml::get_param('value',$parstack,$safeeval); if ($value ne 'unused') { my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval); @@ -591,7 +594,7 @@ sub end_foil { } } else { if ($target eq 'tex') { - $Apache::response::foilgroup{"$name.text"} = ' $\triangleright$ '.$text; + $Apache::response::foilgroup{"$name.text"} = $text; } else { $Apache::response::foilgroup{"$name.text"} = $text; } 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.