--- loncom/homework/radiobuttonresponse.pm 2012/01/05 11:56:34 1.153
+++ loncom/homework/radiobuttonresponse.pm 2012/01/23 12:00:13 1.153.6.4
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# mutliple choice style responses
#
-# $Id: radiobuttonresponse.pm,v 1.153 2012/01/05 11:56:34 foxr Exp $
+# $Id: radiobuttonresponse.pm,v 1.153.6.4 2012/01/23 12:00:13 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -33,6 +33,9 @@ use Apache::lonnet;
use Apache::response;
my $default_bubbles_per_line = 10;
+my @alphabet = ( 'A' .. 'Z' ); # Foil labels.
+
+
BEGIN {
&Apache::lonxml::register( 'Apache::radiobuttonresponse',
@@ -118,14 +121,7 @@ sub start_radiobuttonresponse {
else {
$result .= ' \renewcommand{\labelenumi}{\Alph{enumi}.}';
}
- if ( $env{'form.pdfFormFields'} eq 'yes'
- && $Apache::inputtags::status[-1] eq 'CAN_ANSWER' )
- {
- $result .= '\begin{itemize}';
- }
- else {
- $result .= '\begin{enumerate}';
- }
+
}
elsif ( $target eq 'analyze' ) {
my $part_id = "$Apache::inputtags::part.$id";
@@ -140,16 +136,7 @@ sub end_radiobuttonresponse {
@_;
my $result;
if ( $target eq 'edit' ) { $result = &Apache::edit::end_table(); }
- if ( $target eq 'tex' ) {
- if ( $env{'form.pdfFormFields'} eq 'yes'
- and $Apache::inputtags::status[-1] eq 'CAN_ANSWER' )
- {
- $result .= '\end{itemize}';
- }
- else {
- $result .= '\end{enumerate}';
- }
- }
+
&Apache::response::end_response;
pop @Apache::lonxml::namespace;
&Apache::lonxml::deregister( 'Apache::radiobuttonresponse',
@@ -387,6 +374,7 @@ sub format_prior_answer {
}
+##
sub displayallfoils {
my ( $direction, $target ) = @_;
my $result;
@@ -767,6 +755,287 @@ sub whichfoils {
&Apache::lonxml::debug("Answer is $answer");
return ( $answer, @whichfalse );
}
+##
+# Generate the HTML for a single html foil.
+# @param $part - The part for which the response is being generated.
+# @param $fieldname - The basename of the radiobutton field
+# @param $name - The foilname.
+# @param $last_responses - Reference to a hash that holds the most recent
+# responses.
+# @param $value - radiobutton value.
+#
+# @return text
+# @retval The generated html.
+#
+sub html_radiobutton {
+ my ($part, $fieldname, $name, $last_responses, $value) = @_;
+
+ my $result='';
+
+ return $result;
+
+}
+##
+# Return a reference to the last response hash. This hash has exactly
+# one or zero entries. The one entry is keyed by the foil 'name' of
+# the prior response
+#
+# @param $part - Number of the problem part.
+#
+# @return reference to a hash.
+# @retval see above.
+#
+sub get_last_response {
+ my ($part) = @_;
+
+ my $id = $Apache::inputtags::response['-1'];
+ my ( $lastresponse, $newvariation );
+
+ if ((( $Apache::lonhomework::history{"resource.$part.type"} eq 'randomizetry')
+ || ( $Apache::lonhomework::type eq 'randomizetry' )
+ )
+ && ( $Apache::inputtags::status[-1] eq 'CAN_ANSWER' )
+ )
+ {
+
+ if ( $env{ 'form.' . $part . '.rndseed' } ne
+ $Apache::lonhomework::history{"resource.$part.rndseed"} )
+ {
+ $newvariation = 1;
+ }
+ }
+ unless ($newvariation) {
+ $lastresponse =
+ $Apache::lonhomework::history{"resource.$part.$id.submission"};
+ }
+ my %lastresponse = &Apache::lonnet::str2hash($lastresponse);
+
+ return \%lastresponse;
+}
+
+##
+# Display foils in html rendition.:
+#
+# @param $whichfoils - Set of foils to display.
+# @param $target - Rendition target...there are several html targets.
+# @param $direction - 'horizontal' if layout is horizontal.
+# @param $part - Part of the problem that's being displayed.
+# @param $solved - Solution state of the problem.
+# @param $show_answer- True if answers should be shown.
+#
+# @return string
+# @retval generated html.
+#
+sub display_foils_html {
+ my ($whichfoils, $target, $direction, $part, $solved, $show_answer) = @_;
+ my $result;
+
+ # if the answers get shown, we need to label each item as correct or
+ # incorrect.
+
+ if ($show_answer) {
+ my $item_pretext = ' '; # html prior to each item
+ my $item_posttext = ''; # html after each item.
+ my $finalclose = ''; # html to close off the whole shebang
+
+
+ # Horizontal layout is a table with each foil in a cell
+
+ if ($direction eq 'horizontal') {
+ $result = '
';
+ $item_pretext = '
' . $item_pretext;
+ $item_posttext = '
';
+ $finalclose = '
';
+ }
+
+ foreach my $name (@{$whichfoils}) {
+
+ # If the item gets further surrounded by tags, this
+ # holds the closures for those tages.
+
+ my $item_closetag = '';
+
+ $result .= $item_pretext;
+
+ # Label each foil as correct or incorrect:
+
+ if ($Apache::response::foilgroup{$name . '.value'} eq 'true') {
+ $result .= &mt('Correct:') . '';
+ $item_closetag .= '';
+
+ } else {
+ $result .= &mt('Incorrect');
+ }
+
+ # Web rendition encloses the
+ # item text in a label tag as well:
+
+ if ($target eq 'web') {
+ $result .= '' . $item_closetag;
+ }
+ $result .= $Apache::response::foilgroup{$name . '.text'};
+ $result .= $item_closetag;
+ $result .= $item_posttext;
+ $result .= "\n"; # make the html a bit more readable.
+ }
+
+ $result .= $finalclose;
+
+ } else {
+ $result .= ' '; # end line prior to foilgroup:
+
+ # Not showing the answers, we need to generate the HTML appropriate
+ # to allowing the student to respond.
+
+ my $item_pretext;
+ my $item_posttext;
+ my $lastresponse = &get_last_response($part);
+
+ if ( $direction eq 'horizontal' ) {
+ $item_pretext = '
';
+ $item_posttext = '
';
+ }
+ else {
+ $item_pretext = ' ';
+ }
+ my $item_no = 0;
+ foreach my $name (@{$whichfoils}) {
+ $result .= $item_pretext;
+ $result .= &html_radiobutton(
+ $part, $Apache::inputtags::response[-1],
+ $name, $lastresponse, $item_no
+ );
+ $result .= $item_posttext;
+ $item_no++;
+ }
+
+ if ($direction eq 'horizontal' ) {
+ $result .= "";
+ } else {
+ $result .= " ";
+ }
+ }
+
+ return $result;
+}
+##
+# Display foils in exam mode for latex
+#
+# @param $whichfoils - Reference to an array that contains the foil names to display
+# @param $bubbles_per_line - Number of bubbles on a line.
+#
+# @return string
+# @return the latex rendering of the exam problem.
+#
+# @note The direction is not honored for exams. The lines reflect the number of
+# bubbles on an exam sheet.
+#
+sub display_latex_exam {
+ my ($whichfoils, $bubbles_per_line) = @_;
+ my $result;
+ my $numlines;
+ my $bubble_number = 0;
+ my $line = 0;
+ my $i = 0;
+
+ # This section puts out the prefix that tells the user
+ # (if necessary) to only choose one bubble in the next n lines
+ # for problems with more than one line worth of bubbles in the grid sheet:
+
+ my $numitems = scalar( @{$whichfoils} );
+ $numlines = int( $numitems / $bubbles_per_line );
+ if ( ( $numitems % $bubbles_per_line ) != 0 ) {
+ $numlines++;
+ }
+ if ( $numlines < 1 ) {
+ $numlines = 1;
+ }
+ if ( $numlines > 1 ) {
+ my $linetext;
+ for ( my $i = 0 ; $i < $numlines ; $i++ ) {
+ $linetext .= $Apache::lonxml::counter + $i . ', ';
+ }
+ $linetext =~ s/,\s$//;
+ $result .=
+ '\item[\small {\textbf{'
+ . $linetext . '}}]'
+ . ' {\footnotesize '
+ . &mt( '(Bubble once in [_1] lines)', $numlines )
+ . '} \hspace*{\fill} \\\\';
+ }
+ else {
+ $result .= '\item[\textbf{' . $Apache::lonxml::counter . '}.]';
+ }
+
+ # Now output the bubbles themselves:
+
+ foreach my $name (@{$whichfoils}) {
+ if ( $bubble_number >= $bubbles_per_line ) {
+ $line++;
+ $i = 0;
+ $bubble_number = 0;
+ }
+ my $identifier;
+ if ( $numlines > 1 ) {
+ $identifier = $Apache::lonxml::counter + $line;
+ }
+ $result .=
+ '{\small \textbf{'
+ . $identifier
+ . $alphabet[$i]
+ . '}}$\bigcirc$'
+ . $Apache::response::foilgroup{ $name . '.text' }
+ . '\\\\'; #' stupid emacs -- it thinks it needs that apostrophe to close the quote
+
+ $i++;
+ $bubble_number++;
+ }
+
+ return $result;
+
+}
+
+##
+# Display latex when exam mode is not on.
+#
+# @param $whichfoils - The foils to display
+# @param $direction - Display direction ('horizontal' is what matters to us).
+# @param $vbegin - Begin the vertical environment being used.
+# @param $vend - End the vertical environment being used.
+#
+# @return string
+# @retval - The LaTeX rendering of the resource.'
+#
+sub display_latex {
+ my ($whichfoils, $direction, $vbegin, $vend) = @_;
+ my $result;
+
+ $result .= $vbegin;
+ foreach my $name (@{$whichfoils}) {
+ $result .= '\vspace*{-2 mm}\item '
+ . $Apache::response::foilgroup{ $name . '.text' };
+ }
+
+ $result .= $vend;
+
+ return $result;
+}
+
+
+##
sub displayfoils {
my ( $target, $answer, $whichfoils, $direction, $bubbles_per_line ) = @_;
@@ -774,196 +1043,100 @@ sub displayfoils {
my $part = $Apache::inputtags::part;
my $solved = $Apache::lonhomework::history{"resource.$part.solved"};
+
+ # Show answers html.
+
if ( ( $target ne 'tex' )
&& &Apache::response::show_answer() )
{
- if ( $direction eq 'horizontal' ) {
- if ( $target ne 'tex' ) {
- $result .= '
';
- }
- }
- foreach my $name ( @{$whichfoils} ) {
- if ( $direction eq 'horizontal' ) {
- if ( $target ne 'tex' ) { $result .= '