--- loncom/homework/radiobuttonresponse.pm 2012/01/23 12:00:13 1.153.6.4
+++ loncom/homework/radiobuttonresponse.pm 2012/01/25 12:00:33 1.153.6.7
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# mutliple choice style responses
#
-# $Id: radiobuttonresponse.pm,v 1.153.6.4 2012/01/23 12:00:13 foxr Exp $
+# $Id: radiobuttonresponse.pm,v 1.153.6.7 2012/01/25 12:00:33 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -31,6 +31,7 @@ use HTML::Entities();
use Apache::lonlocal;
use Apache::lonnet;
use Apache::response;
+use Apache::caparesponse;
my $default_bubbles_per_line = 10;
my @alphabet = ( 'A' .. 'Z' ); # Foil labels.
@@ -375,7 +376,7 @@ sub format_prior_answer {
}
##
-sub displayallfoils {
+sub displayallfoils{
my ( $direction, $target ) = @_;
my $result;
&Apache::lonxml::debug("survey style display");
@@ -384,6 +385,31 @@ sub displayallfoils {
@names = @{ $Apache::response::foilgroup{'names'} };
}
+ # Figure out how to bracket the list of foils for
+ # the TeX target:
+ #
+
+ my $begin_environment;
+ my $end_environment;
+
+ if ($target eq 'tex') {
+
+ # Decide how to bracket the list of foils:
+
+
+ if ( $env{'form.pdfFormFields'} eq 'yes'
+ && $Apache::inputtags::status[-1] eq 'CAN_ANSWER' )
+ {
+ $begin_environment = '\begin{itemize}';
+ $end_environment = '\end{itemize}';
+ }
+ else {
+ $begin_environment = '\begin{enumerate}';
+ $end_environment = '\end{enumerate}';
+ }
+ $result .= $begin_environment;
+ }
+
my $temp = 0;
my $i = 0;
my $id = $Apache::inputtags::response['-1'];
@@ -423,7 +449,9 @@ sub displayallfoils {
$lastresponse =
$Apache::lonhomework::history{"resource.$part.$id.submission"};
}
- if ( $direction eq 'horizontal' ) { $result .= '
'; }
+ if ( $direction eq 'horizontal' && $target ne 'tex') {
+ $result .= '';
+ }
my %lastresponse = &Apache::lonnet::str2hash($lastresponse);
if ($showanswer) {
foreach my $name (@names) {
@@ -462,7 +490,7 @@ sub displayallfoils {
foreach my $name (@names) {
if ( $Apache::response::foilgroup{ $name . '.value' } ne 'unused' )
{
- if ( $direction eq 'horizontal' ) {
+ if ( $direction eq 'horizontal' && $target ne 'tex' ) {
$result .= "";
}
else {
@@ -536,9 +564,17 @@ sub displayallfoils {
if ( ( $direction eq 'horizontal' ) && ( $target ne 'tex' ) ) {
$result .= ' |
';
}
+
+ # Close tex bracketing:
+
+ if ($target eq 'tex') {
+ $result .= $end_environment;
+ }
return $result;
}
+
+
sub whichfoils {
my ( $max, $randomize ) = @_;
@@ -755,6 +791,25 @@ sub whichfoils {
&Apache::lonxml::debug("Answer is $answer");
return ( $answer, @whichfalse );
}
+
+##
+# Return a list of foil texts given foil names.
+#
+# @param $whichfoils - Reference to a list of foil names.
+#
+# @return array
+# @retval foil texts
+#
+sub get_foil_texts {
+ my ($whichfoils) = @_;
+ my @foil_texts;
+
+ foreach my $name (@{$whichfoils}) {
+ push(@foil_texts, $Apache::response::foilgroup{$name . '.text'});
+ }
+ return @foil_texts;
+}
+
##
# Generate the HTML for a single html foil.
# @param $part - The part for which the response is being generated.
@@ -934,78 +989,96 @@ sub display_foils_html {
##
# Display foils in exam mode for latex
#
-# @param $whichfoils - Reference to an array that contains the foil names to display
+# @param $whichfoils - Reference to an array that contains the foil names to display
# @param $bubbles_per_line - Number of bubbles on a line.
+# @param $direction - Rendering direction 'horizontal' is what we're looking for.
+# @param $vbegin - Start latex fragment in vertical rendering.
+# @param $vend - End latex fragmentin vertical rendering.
#
# @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 ($whichfoils, $bubbles_per_line, $direction, $vbegin, $vend) = @_;
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:
+ if ($direction eq 'horizontal') {
- foreach my $name (@{$whichfoils}) {
- if ( $bubble_number >= $bubbles_per_line ) {
- $line++;
- $i = 0;
- $bubble_number = 0;
+ # Marshall the display text for each foil and turn things over to
+ # Apache::response::make_horizontal_bubbles:
+
+ my @foil_texts = &get_foil_texts($whichfoils);
+ $result .= &Apache::caparesponse::make_horizontal_latex_bubbles(
+ $whichfoils, \@foil_texts, '$\bigcirc$');
+
+
+ } else {
+ $result .= $vbegin;
+
+ # 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;
}
- my $identifier;
if ( $numlines > 1 ) {
- $identifier = $Apache::lonxml::counter + $line;
+ 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} \\\\';
}
- $result .=
- '{\small \textbf{'
- . $identifier
- . $alphabet[$i]
- . '}}$\bigcirc$'
- . $Apache::response::foilgroup{ $name . '.text' }
- . '\\\\'; #' stupid emacs -- it thinks it needs that apostrophe to close the quote
+ 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++;
+ }
+ $result .= $vend
- $i++;
- $bubble_number++;
- }
-
- return $result;
+ }
+ return $result;
+
}
##
@@ -1023,19 +1096,83 @@ 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' };
+ # how we render depends on the direction.
+ # Vertical is some kind of list environment determined by vbegin/vend.
+ # Horizontal is a table that is generated by
+ # Apache::caparesponse::make_horizontal_latex_bubbles with an empty string
+ # for the actual bubble text.
+
+ if ($direction eq 'horizontal') {
+ my @foil_texts = &get_foil_texts($whichfoils);
+ $result .= &Apache::caparesponse::make_horizontal_latex_bubbles(
+ $whichfoils, \@foil_texts, '');
+ } else {
+ $result .= $vbegin;
+ foreach my $name (@{$whichfoils}) {
+ $result .= '\vspace*{-2 mm}\item '
+ . $Apache::response::foilgroup{ $name . '.text' };
+ }
+
+ $result .= $vend;
}
+ return $result;
+}
+
+
+##
+# Render foils for a PDF form. This is a variant of tex rednering that provides
+# sufficient markup that the final PDF is a form that can be filled in online,
+# or offline.
+#
+# @param $whichfoils - References an array of foils to display in the order in which
+# they should be displayed.
+# @param $direction - Rendering direction. 'horiztonal' means inputs are laid out
+# horizontally otherwise they are stacked vertically.
+#
+# @return string
+# @retval String containing the rendering of the resource.
+#
+sub display_pdf_form {
+ my ($whichfoils) = @_;
+ my $temp = 0;
+ my $result;
- $result .= $vend;
+ foreach my $name ( @{$whichfoils} ) {
+
+ my $fieldname =
+ $env{'request.symb'}
+ . '&part_'
+ . $Apache::inputtags::part
+ . '&radiobuttonresponse'
+ . '&HWVAL_'
+ . $Apache::inputtags::response['-1'];
+ $result .= '\item[{'
+ . &Apache::lonxml::print_pdf_radiobutton( $fieldname,
+ $temp )
+ . '}]'
+ . $Apache::response::foilgroup{ $name . '.text' }
+ . "\n";
+ $temp++;
+ }
+
return $result;
}
##
+# Display selected foils: This is really just a dispatchter to appropriate renderers
+#
+# @param $target - Target (e.g. 'tex'...).
+# @param $answer - True if answers should be shown.
+# @param $whichfoils - Array of foil selectors that indicate which foils shouild be
+# rendered, in rendering order.
+# @param $direction- Rendering direction ('horizontal' is the one we look for,
+# otherwise foils are rendered one per line vertically.
+# @param $bubbles_per_line - number of exam bubbles per line.
+#
+# @return string
+# @retval The rendered problem.
sub displayfoils {
my ( $target, $answer, $whichfoils, $direction, $bubbles_per_line ) = @_;
@@ -1092,9 +1229,10 @@ sub displayfoils {
if ( ( $Apache::lonhomework::type eq 'exam' ) )
{
- $result .= $begin_environment;
- $result .= &display_latex_exam($whichfoils, $bubbles_per_line);
- $result .= $end_environment;
+ $result .= &display_latex_exam(
+ $whichfoils, $bubbles_per_line, $direction, $begin_environment,
+ $end_environment);
+
$result .= '\vskip 0mm ';
} else {
@@ -1107,24 +1245,7 @@ sub displayfoils {
&& ($Apache::inputtags::status[-1] eq 'CAN_ANSWER'))
{
$result .= $begin_environment;
- foreach my $name ( @{$whichfoils} ) {
-
- my $fieldname =
- $env{'request.symb'}
- . '&part_'
- . $Apache::inputtags::part
- . '&radiobuttonresponse'
- . '&HWVAL_'
- . $Apache::inputtags::response['-1'];
- $result .= '\item[{'
- . &Apache::lonxml::print_pdf_radiobutton( $fieldname,
- $temp )
- . '}]'
- . $Apache::response::foilgroup{ $name . '.text' }
- . "\n";
-
- $temp++;
- }
+ $result .= &display_pdf_form($whichfoils, $direction);
$result .= $end_environment;
} else {
$result .= &display_latex(