--- loncom/homework/matchresponse.pm 2003/08/19 15:24:52 1.21 +++ loncom/homework/matchresponse.pm 2008/02/01 22:05:45 1.69 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Full matching style response # -# $Id: matchresponse.pm,v 1.21 2003/08/19 15:24:52 sakharuk Exp $ +# $Id: matchresponse.pm,v 1.69 2008/02/01 22:05:45 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -25,13 +25,14 @@ # # http://www.lon-capa.org/ # -# 2/21 Guy package Apache::matchresponse; use strict; use HTML::Entities(); use Math::Random(); -use Apache::optionresponse; +use Apache::optionresponse(); +use Apache::lonlocal; +use Apache::lonnet; BEGIN { &Apache::lonxml::register('Apache::matchresponse',('matchresponse')); @@ -47,6 +48,7 @@ sub start_matchresponse { push (@Apache::lonxml::namespace,'matchresponse'); my $id = &Apache::response::start_response($parstack,$safeeval); %Apache::hint::match=(); + undef(%Apache::response::foilnames); if ($target eq 'meta') { $result=&Apache::response::meta_package_write('matchresponse'); } elsif ($target eq 'edit' ) { @@ -66,6 +68,12 @@ 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"; + $Apache::lonhomework::analyze{"$part_id.type"} = 'matchresponse'; + push (@{ $Apache::lonhomework::analyze{"parts"} },$part_id); + push (@{ $Apache::lonhomework::analyze{"$part_id.bubble_lines"} }, + 1); } return $result; } @@ -78,6 +86,7 @@ sub end_matchresponse { pop @Apache::lonxml::namespace; &Apache::lonxml::deregister('Apache::matchresponse', ('foilgroup','foil','conceptgroup')); + undef(%Apache::response::foilnames); return $result; } @@ -96,15 +105,20 @@ sub start_itemgroup { 'location', ['top','bottom','left','right'], $token); + $result.=&Apache::edit::select_arg('Items Display Directection:', + 'direction', + ['vertical','horizontal'], + $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,'randomize', - 'location'); + 'location','direction'); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } } elsif ($target eq 'web' or $target eq 'tex') { $Apache::matchresponse::itemtable{'location'}= &Apache::lonxml::get_param('location',$parstack,$safeeval); + $Apache::matchresponse::TeXitemgroupwidth=&Apache::lonxml::get_param('TeXitemgroupwidth',$parstack,$safeeval,undef,0); } return $result; } @@ -121,6 +135,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'); @@ -132,28 +150,36 @@ sub end_itemgroup { } $Apache::response::itemgroup{'letter_name_map'}=\%letter_name_map; $Apache::response::itemgroup{'name_letter_map'}=\%name_letter_map; + my $direction=&Apache::lonxml::get_param('direction',$parstack,$safeeval); if ($target eq 'web') { - my $table=''; + + my $table='
'; # extra space to match what latex does. my $i=0; + if ($direction eq 'horizontal') { $table .='';} foreach my $name (@names) { - $table.=''; + if ($direction ne 'horizontal') { $table.=''; } + $table.=''; + if ($direction ne 'horizontal') { $table.=''; } $i++; } + if ($direction eq 'horizontal') { $table .='';} $table.='
'.$alphabet[$i].''. - $Apache::response::itemgroup{$name.'.text'}. - '
'.$alphabet[$i].''. + $Apache::response::itemgroup{$name.'.text'}.'
'; $Apache::matchresponse::itemtable{'display'}=$table; + $Apache::lonxml::post_evaluate=0; } elsif ($target eq 'tex') { - my $table=' \\\\\\\\ \begin{description} '; + my $table=' \begin{description}\setlength{\leftmargin}{2em}\setlength{\labelwidth}{1em}\setlength{\itemsep}{0.5pt plus1pt minus2pt}\setlength{\listparindent}{0em} '; my $i=0; foreach my $name (@names) { - $Apache::response::itemgroup{$name.'.text'}=~s/\$\$/\$/g; + # $Apache::response::itemgroup{$name.'.text'}=~s/\$\$/\$/g; $table.='\item['.$alphabet[$i].'] '. $Apache::response::itemgroup{$name.'.text'}; $i++; } - $table.=' \end{description} \strut \\\\ '; + $table.=' \end{description} \strut '; + if ($Apache::lonhomework::type eq 'exam') {$table.='\vskip -13 mm \strut ';} $Apache::matchresponse::itemtable{'display'}=$table; + $Apache::lonxml::post_evaluate=0; } return $result; } @@ -161,7 +187,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, @@ -187,16 +213,16 @@ 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); &Apache::lonxml::debug("Got a name of :$name:"); - if (!$name) { $name=$Apache::lonxml::curdepth; } + if ($name eq "") { $name=$Apache::lonxml::curdepth; } &Apache::lonxml::debug("Using a name of :$name:"); push @{ $Apache::response::itemgroup{'names'} }, $name; $Apache::response::itemgroup{"$name.text"} = $text; @@ -222,7 +248,7 @@ sub start_foilgroup { my $result; %Apache::response::foilgroup=(); $Apache::matchresponse::conceptgroup=0; - &Apache::response::setrandomnumber(); + &Apache::response::pushrandomnumber(); if ($target eq 'edit') { $result.=&Apache::edit::start_table($token) ."Collection Of FoilsDelete:" @@ -236,24 +262,47 @@ 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') { + my $part = $Apache::inputtags::part; + my $response_id = $Apache::inputtags::response[-1]; + + 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'); if ($target eq 'web' || $target eq 'tex') { $result=&displayfoils($target,$max,$randomize); + $Apache::lonxml::post_evaluate=0; } elsif ($target eq 'answer' ) { $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), + "$part.$response_id"); + if ($target eq 'analyze') { + &Apache::lonhomework::set_bubble_lines(); } - &Apache::lonxml::increment_counter(&getfoilcounts($max)); + } elsif ($target eq 'edit') { $result=&Apache::edit::end_table(); } + &Apache::response::poprandomnumber(); 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; } @@ -262,18 +311,30 @@ sub displayanswers { $randomize, &Apache::response::showallfoils(), \%Apache::response::foilgroup); - my $result=&Apache::response::answer_header('matchresponse'); my %name_letter_map; if (defined(%{ $Apache::response::itemgroup{'name_letter_map'} })) { %name_letter_map= %{ $Apache::response::itemgroup{'name_letter_map'} }; } - foreach my $name (@whichfoils) { - my $value_name=$Apache::response::foilgroup{$name.'.value'}; - my $letter=$name_letter_map{$value_name}; - $result.=&Apache::response::answer_part('matchresponse',$letter); + my $result; + if ($Apache::lonhomework::type eq 'exam') { + my $i=0; + foreach my $name (@whichfoils) { + $result.=&Apache::response::answer_header('matchresponse',$i++); + my $value_name=$Apache::response::foilgroup{$name.'.value'}; + my $letter=$name_letter_map{$value_name}; + $result.=&Apache::response::answer_part('matchresponse',$letter); + $result.=&Apache::response::answer_footer('matchresponse'); + } + } else { + $result=&Apache::response::answer_header('matchresponse'); + foreach my $name (@whichfoils) { + my $value_name=$Apache::response::foilgroup{$name.'.value'}; + my $letter=$name_letter_map{$value_name}; + $result.=&Apache::response::answer_part('matchresponse',$letter); + } + $result.=&Apache::response::answer_footer('matchresponse'); } - $result.=&Apache::response::answer_footer('matchresponse'); return $result; } @@ -284,22 +345,24 @@ sub grade_response { $randomize, &Apache::response::showallfoils(), \%Apache::response::foilgroup); - if (!defined($ENV{'form.submitted'})) { return; } + if (!&Apache::response::submitted()) { return; } my %responsehash; my %grade; - my ($temp,$right,$wrong,$ignored)=(0,0,0,0); + my ($temp,$right,$wrong,$ignored)=(1,0,0,0); my %letter_name_map; if (defined(%{ $Apache::response::itemgroup{'letter_name_map'} })) { %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,'letter'); + push(@items,$response); my $responsename = $letter_name_map{$response}; - $responsehash{$name}=$responsename; my $value=$Apache::response::foilgroup{$name.'.value'}; if ( $response =~ /[^\s]/) { - &Apache::lonxml::debug("submitted a $response for $value
\n"); + $responsehash{$name}=$responsename; + &Apache::lonxml::debug("submitted a $response($responsename) for $value
\n"); if ($value eq $responsename) { $grade{$name}='1'; $right++; } else { @@ -313,28 +376,72 @@ 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) { - $ad='EXACT_ANS'; - } elsif ($wrong==0 && $right==0) { - #nothing submitted - } else { - if ($ignored==0) { - $ad='INCORRECT'; - } else { - $ad='MISSING_ANSWER'; - } - } $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; - &Apache::response::handle_previous(\%previous,$ad); + if ($Apache::lonhomework::type eq 'survey') { + if ($ignored == 0) { + my $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='SUBMITTED'; + &Apache::response::handle_previous(\%previous,$ad); + } elsif ($wrong==0 && $right==0) { + } else { + my $ad=$Apache::lonhomework::results{"resource.$part.$id.awarddetail"}='MISSING_ANSWER'; + &Apache::response::handle_previous(\%previous,$ad); + } + } elsif (!$Apache::lonhomework::scantronmode) { + my $ad; + if ($wrong==0 && $ignored==0) { + $ad='EXACT_ANS'; + } elsif ($wrong==0 && $right==0) { + #nothing submitted + } else { + if ($ignored==0) { + $ad='INCORRECT'; + } else { + $ad='MISSING_ANSWER'; + } + } + $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}=$ad; + &Apache::response::handle_previous(\%previous,$ad); + } else { + my $ad; + if ($wrong==0 && $right==0) { + #nothing submitted + } else { + $ad='ASSIGNED_SCORE'; + $Apache::lonhomework::results{"resource.$part.$id.awarddetail"}= + $ad; + $Apache::lonhomework::results{"resource.$part.$id.awarded"}= + $right/(scalar(@whichfoils)); + $Apache::lonhomework::results{"resource.$part.$id.numfoils"}= + scalar(@whichfoils); + } + } +} + +sub format_prior_answer { + my ($mode,$answer,$other_data) = @_; + my %answer =&Apache::lonnet::str2hash($answer); + my $foil_order =$other_data->[0]; + my %grading =&Apache::lonnet::str2hash($other_data->[1]); + my @items =&Apache::lonnet::str2array($other_data->[2]); + my $output; + + foreach my $name (@{ $foil_order }) { + my $item=shift(@items); + $output .= ''.$item.''; + } + return if (!defined($output)); + + $output = ''.$output.'
'; + return $output; } sub itemdisplay { @@ -348,8 +455,11 @@ sub itemdisplay { } return undef; } + sub displayfoils { my ($target,$max,$randomize)=@_; + my ($tabsize, $lefttabsize, $righttabsize); + my $result; my $question; my (@whichfoils)=&Apache::response::whichorder(&getfoilcounts($max), @@ -358,7 +468,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= @@ -369,7 +478,7 @@ sub displayfoils { %name_letter_map= %{ $Apache::response::itemgroup{'name_letter_map'} }; } - if (($solved =~ /^correct/) || ($status eq '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'}; @@ -377,12 +486,12 @@ sub displayfoils { if ($target eq 'tex') { $question.=' \\\\ '.$letter.':'.$text; } else { - $question.='
'.$letter.':'.$text; + $question.='
'.$letter.': '.$text; } } } else { my $i = 0; - my $temp=0; + my $temp=1; my $id=$Apache::inputtags::response[-1]; my $part=$Apache::inputtags::part; my $lastresponse=$Apache::lonhomework::history{"resource.$part.$id.submission"}; @@ -410,29 +519,61 @@ sub displayfoils { } } if ($target ne 'tex' && $Apache::lonhomework::type ne 'exam') { - $optionlist='\n"; } my $text=$Apache::response::foilgroup{$name.'.text'}; + # + # Factor out the tex computations of the left/right 1/2 minipage + # widths for left or right positioning. This allows us + # to, if necessary constrain the bubble widths: + # + if ($target eq 'tex' && + (&itemdisplay('left') || &itemdisplay('right'))) { + $tabsize=&Apache::londefdef::recalc($env{'form.textwidth'}); + ($lefttabsize,$righttabsize)=(0,0); + if ($Apache::matchresponse::TeXitemgroupwidth ne '') { + $Apache::matchresponse::TeXitemgroupwidth=~/(\d*.?\d*)/; + $lefttabsize=$tabsize*$1/100; + $righttabsize=0.95*($tabsize-$lefttabsize); + } else { + $tabsize=~/(\d+\.?\d*)/; + $lefttabsize=$1/2.1; + $righttabsize=0.95*($1-$lefttabsize); + } + } if ($target ne 'tex') { if ($Apache::lonhomework::type ne 'exam') { - $question.='
'.$optionlist.$text."\n"; + $question.="
\n".$optionlist.$text; } else { - $question.='
'.$text."\n"; + $question.="
\n".$text; } if ($Apache::lonhomework::type eq 'exam') { - $question.=&Apache::optionresponse::webbubbles(\@used_letters,\@used_letters,$temp); + my @blank; + $question.=&Apache::optionresponse::webbubbles(\@used_letters,\@blank,$temp,$last_letter); } } else { + # Note that if left or right positioned, we must + # confine the bubbles to righttabsize: + # if ($Apache::lonhomework::type eq 'exam') { $question.=' '.$optionlist.$text."\n"; my @emptyItems = (); for (my $i=0;$i<=$#used_letters;$i++) {push @emptyItems, ' ';} - $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 '; + $question.='\vskip -1 mm\noindent\begin{list}{}{\setlength{\listparindent}{0mm}\setlength{\leftmargin}{2mm}}' + .'\item \hskip -3mm \textbf{'.$internal_counter.'}'; + if (&itemdisplay('left') || &itemdisplay('right')) { + $question .= &Apache::optionresponse::bubbles(\@used_letters,\@emptyItems, "", $righttabsize); + } + else { + $question .= &Apache::optionresponse::bubbles(\@used_letters,\@emptyItems); + } + $question .= '\end{list} \vskip -8 mm \strut '; $internal_counter++; } else { - $question.=' \\\\ '.$optionlist.$text."\n"; + $question.=' '.$optionlist.$text.'\strut\\\\\strut '."\n"; } } $temp++; @@ -443,11 +584,33 @@ sub displayfoils { } elsif ($result=&itemdisplay('bottom')) { $result=$question.$result; } elsif ($result=&itemdisplay('right')) { - $result='
'.$question.''.$result. - '
'; + if ($target ne 'tex') { + #remove the first
+ $question=~s|
||; + $result='
'.$question. + ''.$result.'
'; + } else { + $lefttabsize.=' mm '; + $righttabsize.=' mm '; + $result='\setlength{\tabcolsep}{1 mm}\begin{tabular}{p{'.$righttabsize.'}p{'.$lefttabsize.'}}\begin{minipage}{'.$righttabsize.'}'.$question.'\end{minipage}&\begin{minipage}{'.$lefttabsize.'}'.$result.'\end{minipage}\end{tabular}'; + } } elsif ($result=&itemdisplay('left')) { - $result='
'.$result.''.$question. - '
'; + if ($target ne 'tex') { + #remove the first
+ $question=~s|
||; + $result='
'.$result. + ''.$question.'
'; + } else { + $lefttabsize.=' mm '; + $righttabsize.=' mm '; + $result='\setlength{\tabcolsep}{1 mm}\begin{tabular}{p{'.$lefttabsize.'}p{'.$righttabsize.'}}\begin{minipage}{'.$lefttabsize.'}'.$result.'\end{minipage}&\begin{minipage}{'.$righttabsize.'}'.$question.'\end{minipage}\end{tabular}'; + } + } + if ($target eq 'web') { + &Apache::response::setup_prior_tries_hash(\&format_prior_answer, + [\@whichfoils, + 'submissiongrading', + 'submissionitems']); } if ($target ne 'tex') {$result.="
";} else {$result.=' \\\\ ';} return $result; @@ -487,31 +650,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' || $target eq 'tex') { - #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(); } @@ -526,8 +670,11 @@ 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; + if ($target eq 'analyze') { + &Apache::response::check_if_computed($token,$parstack,$safeeval,'value'); + } } elsif ($target eq 'edit') { $result=&Apache::edit::tag_start($target,$token,"Foil"); my $level='-2'; @@ -558,43 +705,40 @@ 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') { + if ($target eq 'tex' && $Apache::lonhomework::type eq 'exam') { + $text='\vskip 5mm $\triangleright$ '.$text; + } my $value = &Apache::lonxml::get_param('value',$parstack,$safeeval); if ($value ne 'unused') { my $name = &Apache::lonxml::get_param('name',$parstack,$safeeval); - my $location =&Apache::lonxml::get_param('location',$parstack,$safeeval); &Apache::lonxml::debug("Got a name of :$name:"); - if (!$name) { $name=$Apache::lonxml::curdepth; } + if (!$name) { + &Apache::lonxml::warning("Foils without names exist. This can cause problems to malfunction."); + $name=$Apache::lonxml::curdepth; + } &Apache::lonxml::debug("Using a name of :$name:"); + if (defined($Apache::response::foilnames{$name})) { + &Apache::lonxml::error(&mt("Foil name [_1] appears more than once. Foil names need to be unique.",$name)); + } + $Apache::response::foilnames{$name}++; + my $location =&Apache::lonxml::get_param('location',$parstack, + $safeeval); if ( $Apache::matchresponse::conceptgroup && !&Apache::response::showallfoils() ) { push @{ $Apache::response::conceptgroup{'names'} }, $name; $Apache::response::conceptgroup{"$name.value"} = $value; - if ($target eq 'tex' && $Apache::lonhomework::type eq 'exam') { - $Apache::response::conceptgroup{"$name.text"} = ' $\triangleright$ '.$text; - } else { - $Apache::response::conceptgroup{"$name.text"} = $text; - } + $Apache::response::conceptgroup{"$name.text"} = $text; $Apache::response::conceptgroup{"$name.location"} = $location; } else { push @{ $Apache::response::foilgroup{'names'} }, $name; $Apache::response::foilgroup{"$name.value"} = $value; - if ($Apache::lonhomework::type eq 'exam') { - if ($target eq 'tex') { - $Apache::response::foilgroup{"$name.text"} = '\vskip 5 mm $\triangleright$ '.$text; - } else { - $Apache::response::foilgroup{"$name.text"} = $text; - } - } else { - if ($target eq 'tex') { - $Apache::response::foilgroup{"$name.text"} = ' $\triangleright$ '.$text; - } else { - $Apache::response::foilgroup{"$name.text"} = $text; - } - } + $Apache::response::foilgroup{"$name.text"} = $text; $Apache::response::foilgroup{"$name.location"} = $location; } } 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.