--- loncom/homework/optionresponse.pm 2004/04/23 21:37:41 1.108
+++ loncom/homework/optionresponse.pm 2006/03/15 00:08:53 1.134
@@ -1,7 +1,7 @@
# LearningOnline Network with CAPA
# option list style responses
#
-# $Id: optionresponse.pm,v 1.108 2004/04/23 21:37:41 albertel Exp $
+# $Id: optionresponse.pm,v 1.134 2006/03/15 00:08:53 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -29,6 +29,7 @@ package Apache::optionresponse;
use strict;
use Apache::response();
use Apache::lonlocal;
+use Apache::lonnet;
BEGIN {
&Apache::lonxml::register('Apache::optionresponse',('optionresponse'));
@@ -38,7 +39,7 @@ sub start_optionresponse {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
my $result='';
#when in a option response use these
- &Apache::lonxml::register('Apache::optionresponse',('foilgroup','foil','conceptgroup'));
+ &Apache::lonxml::register('Apache::optionresponse',('foilgroup','foil','conceptgroup','drawoptionlist'));
push (@Apache::lonxml::namespace,'optionresponse');
my $id = &Apache::response::start_response($parstack,$safeeval);
%Apache::hint::option=();
@@ -78,7 +79,7 @@ sub end_optionresponse {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
&Apache::response::end_response;
pop @Apache::lonxml::namespace;
- &Apache::lonxml::deregister('Apache::optionresponse',('foilgroup','foil','conceptgroup'));
+ &Apache::lonxml::deregister('Apache::optionresponse',('foilgroup','foil','conceptgroup','drawoptionlist'));
my $result;
if ($target eq 'edit') { $result=&Apache::edit::end_table(); }
undef(%Apache::response::foilnames);
@@ -92,7 +93,7 @@ sub start_foilgroup {
my $result='';
%Apache::response::foilgroup=();
$Apache::optionresponse::conceptgroup=0;
- &Apache::response::setrandomnumber();
+ &Apache::response::pushrandomnumber();
if ($target eq 'edit') {
my $optionlist="\n";
my $option;
@@ -113,6 +114,9 @@ sub start_foilgroup {
Delete an Option:
ENDTABLE
+ $result.= &Apache::edit::checked_arg('Print options:','texoptions',
+ [ ['nochoice','Don\'t show option list'] ]
+ ,$token);
$result.= &Apache::edit::end_row();
$result.= &Apache::edit::start_spanning_row();
$result.= $insertlist.' ';
@@ -121,14 +125,14 @@ ENDTABLE
my @options;
my $optchanged=0;
eval '@options ='.&Apache::lonxml::get_param('options',$parstack,$safeeval);
- if ($ENV{"form.$Apache::lonxml::curdepth.deleteopt"}) {
- my $delopt=$ENV{"form.$Apache::lonxml::curdepth.deleteopt"};
+ if ($env{"form.$Apache::lonxml::curdepth.deleteopt"}) {
+ my $delopt=$env{"form.$Apache::lonxml::curdepth.deleteopt"};
&Apache::lonxml::debug("Deleting :$delopt:");
splice(@options,$delopt-1,1);
$optchanged=1;
}
- if ($ENV{"form.$Apache::lonxml::curdepth.options"}) {
- my $newopt = $ENV{"form.$Apache::lonxml::curdepth.options"};
+ if ($env{"form.$Apache::lonxml::curdepth.options"}) {
+ my $newopt = $env{"form.$Apache::lonxml::curdepth.options"};
if ($options[0]) {
push(@options,$newopt);
} else {
@@ -136,7 +140,9 @@ ENDTABLE
}
$optchanged=1;
}
- if ($optchanged) {
+ my $rebuildtag = &Apache::edit::get_new_args($token,$parstack,$safeeval,
+ ('texoptions'));
+ if ($optchanged || $rebuildtag ) {
$result = "';
+ $result.=')" ';
+ $result .= 'texoptions="'.$token->[2]{'texoptions'}.'" ';
+ $result .= '>';
} # else nothing changed so just use the default mechanism
}
if ($target eq 'tex' and $Apache::lonhomework::type ne 'exam') {
- $result .= ' \begin{enumerate} ';
+ $result .= ' \renewcommand{\labelenumi}{\Alph{enumi}.}
+ \begin{enumerate} ';
}
return $result;
}
@@ -163,6 +172,8 @@ sub end_foilgroup {
my $name;
my @opt;
eval '@opt ='.&Apache::lonxml::get_param('options',$parstack,$safeeval);
+ &Apache::lonxml::debug("options:".join(':',@opt));
+
my $TeXlayout=&Apache::lonxml::get_param('TeXlayout',$parstack,$safeeval,
-2,0);
if ($target eq 'tex' && $tex_option_switch eq 'nochoice') {@opt=();}
@@ -181,7 +192,7 @@ sub end_foilgroup {
my $part_id="$Apache::inputtags::part.$Apache::inputtags::response[-1]";
push (@{ $Apache::lonhomework::analyze{"$part_id.options"} },@opt);
} elsif ( $target eq 'grade') {
- if ( defined $ENV{'form.submitted'}) {
+ if ( &Apache::response::submitted()) {
my @whichopt = &whichfoils($max,$randomize);
my $temp=1;my $name;
my %responsehash;
@@ -191,7 +202,7 @@ sub end_foilgroup {
my $ignored=0;
foreach $name (@whichopt) {
my $response=&Apache::response::getresponse($temp);
- if ($ENV{'form.submitted'} eq 'scantron') {
+ if ($env{'form.submitted'} eq 'scantron' && $response=~/\S/) {
$response = $opt[$response];
}
if ( $response =~ /[^\s]/) {
@@ -219,7 +230,16 @@ sub end_foilgroup {
$responsestr;
$Apache::lonhomework::results{"resource.$part.$id.submissiongrading"}=$gradestr;
- if (!$Apache::lonhomework::scantronmode) {
+ 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';
@@ -237,7 +257,11 @@ sub end_foilgroup {
} else {
my $ad;
if ($wrong==0 && $right==0) {
- #nothing submitted
+ #nothing submitted only assign a score if we
+ #need to override a previous grade
+ if (defined($Apache::lonhomework::history{"resource.$part.$id.awarddetail"})) {
+ $ad='ASSIGNED_SCORE';
+ }
} else {
$ad='ASSIGNED_SCORE';
}
@@ -256,6 +280,7 @@ sub end_foilgroup {
if ($target eq 'tex' and $Apache::lonhomework::type ne 'exam') {
$result .= '\end{enumerate}';
}
+ &Apache::response::poprandomnumber();
return $result;
}
@@ -277,17 +302,34 @@ sub whichfoils {
}
sub displayanswers {
- my ($max,$randomize,@opt)=@_;
- if (!defined(@{ $Apache::response::foilgroup{'names'} })) {return;}
- my @names = @{ $Apache::response::foilgroup{'names'} };
- my @whichopt = &whichfoils($max,$randomize);
- my $result=&Apache::response::answer_header('optionresponse');
- foreach my $name (@whichopt) {
- $result.=&Apache::response::answer_part('optionresponse',
- $Apache::response::foilgroup{$name.'.value'})
- }
- $result.=&Apache::response::answer_footer('optionresponse');
- return $result;
+ my ($max,$randomize,@opt)=@_;
+ if (!defined(@{ $Apache::response::foilgroup{'names'} })) {return;}
+ my @names = @{ $Apache::response::foilgroup{'names'} };
+ my @whichopt = &whichfoils($max,$randomize);
+ my $result;
+ if ($Apache::lonhomework::type eq 'exam') {
+ my $i = 0;
+ my %opt = map { ($_,$i++) } @opt;
+
+ $i = 0;
+ my @alphabet = ('A'..'Z');
+ foreach my $name (@whichopt) {
+ $result.=&Apache::response::answer_header('optionresponse',$i++);
+ $result.=&Apache::response::answer_part('optionresponse',
+ $alphabet[$opt{$Apache::response::foilgroup{$name.'.value'}}]);
+ $result.=&Apache::response::answer_part('optionresponse',
+ $Apache::response::foilgroup{$name.'.value'});
+ $result.=&Apache::response::answer_footer('optionresponse');
+ }
+ } else {
+ $result=&Apache::response::answer_header('optionresponse');
+ foreach my $name (@whichopt) {
+ $result.=&Apache::response::answer_part('optionresponse',
+ $Apache::response::foilgroup{$name.'.value'});
+ }
+ $result.=&Apache::response::answer_footer('optionresponse');
+ }
+ return $result;
}
sub check_for_invalid {
@@ -342,13 +384,13 @@ sub displayfoils {
if ($text=~/^\s*$/) {
$text=$value.$text;
} else {
- $text=$value.': '.$text;
+ $text=''.$value.': '.$text;
}
} else {
$text=''.$text;
}
$result.=$text."\n";
- }
+ }
if ($Apache::lonhomework::type eq 'exam') {
$result.=&webbubbles(\@opt,\@alphabet,$temp,$lastopt);
}
@@ -369,13 +411,13 @@ sub displayfoils {
}
my $lastopt=$lastresponse{$name};
my $optionlist="\n";
- my $option;
- foreach $option (@opt) {
- if ($option eq $lastopt) {
- $optionlist.="\n";
- } else {
- $optionlist.="\n";
- }
+ foreach my $option (@opt) {
+ my $escopt=&HTML::Entities::encode($option,'\'"&<>');
+ if ($option eq $lastopt) {
+ $optionlist.="\n";
+ } else {
+ $optionlist.="\n";
+ }
}
if ($target ne 'tex') {
if ($Apache::lonhomework::type ne 'exam') {
@@ -439,6 +481,65 @@ sub displayfoils {
}
+# Correct a single option list element.
+# - For embedded tags,
+# we pass literally the stuff between them.
+# - For everything else, we run through latex_special_symbols
+# so that any symbols that have meaning to LaTeX will be
+# correctly escaped.
+#
+sub correct_option {
+ my $option = shift;
+
+
+ # There's probably a beter way with perl if I was
+ # more of a regexp wiz..(RF).
+
+ my $strlen = length($option);
+ my $here = 0; # Where to start searching for
+ my $result =""; # The return string is built here.
+
+ while ($here < $strlen) {
+ # look for an opening tag:
+
+ my $openloc = index($option, "", $here);
+ if ($openloc == -1) {
+ # No more... operate with latex_special_symbols on
+ # the rest of the string.
+
+ $result .= &Apache::lonxml::latex_special_symbols(substr($option, $here));
+ return $result;
+ } else {
+ # Need to pass the string up to the tag
+ # through l_s_s ...
+ $result .= &Apache::lonxml::latex_special_symbols(substr($option, $here, $openloc-$here));
+ }
+ # look for the closing tag...
+ # We're a bit stupid..or tolerant...
+ # in that if the user forgets the tag
+ # we infer they intended one at the end of the option.
+ $openloc += 9; # 9 chars in
+
+ my $closeloc = index($option, "", $openloc); # 9 chars in
+ if ($closeloc == -1) {
+ $closeloc = $strlen + 9; # 10chars in faked off end.
+ }
+ # Pass from openloc through closeloc without any interpretation:
+
+ &Apache::lonnet::logthis("Segment inside display: $openloc through $closeloc");
+ $result .= substr($option, $openloc, $closeloc - $openloc);
+ $here = $closeloc + 10; # Next search is after the
+ }
+
+ return $result;
+
+ # return &Apache::lonxml::latex_special_symbols($option);
+}
+
+# Correct the option list elements so that if there
+# are special symbosl that have meaning to LaTeX
+# they get fixed up to display correctly.
+
sub optionlist_correction {
my ($TeXlayout,@options) = @_;
my $texoptionlist='\\item [] Choices: ';
@@ -446,15 +547,15 @@ sub optionlist_correction {
if (scalar(@options) > 0) {
foreach my $option (@options) {
$texoptionlist.='{\bf '.
- &Apache::lonxml::latex_special_symbols($option).
+ &correct_option($option).
'}';
if ($TeXlayout eq 'vertical') {
$texoptionlist.=' \vskip 0 mm ',
} else {
- $texoptionlist.=',';
+ $texoptionlist.=', ';
}
}
- chop($texoptionlist);
+ $texoptionlist=~s/, $//;
if ($TeXlayout ne 'vertical') {$texoptionlist.='.';}
} else {
if ($TeXlayout ne 'vertical') {$texoptionlist='\\item [] \\vskip -5 mm';}
@@ -477,8 +578,11 @@ sub webbubbles {
}
$result.='