--- loncom/homework/radiobuttonresponse.pm 2012/01/30 11:36:55 1.153.6.8
+++ loncom/homework/radiobuttonresponse.pm 2012/02/05 16:11:57 1.153.6.10
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# mutliple choice style responses
#
-# $Id: radiobuttonresponse.pm,v 1.153.6.8 2012/01/30 11:36:55 foxr Exp $
+# $Id: radiobuttonresponse.pm,v 1.153.6.10 2012/02/05 16:11:57 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -43,6 +43,10 @@ BEGIN {
('radiobuttonresponse') );
}
+#---------------------------------------------------------------------------
+#
+# Generic utility subs.
+
sub bubble_line_count {
my ( $numfoils, $bubbles_per_line ) = @_;
my $bubble_lines;
@@ -54,6 +58,10 @@ sub bubble_line_count {
}
+
+#------------------------------------------------------------------------------
+#
+# XML handlers.
sub start_radiobuttonresponse {
my ( $target, $token, $tagstack, $parstack, $parser, $safeeval, $style ) =
@_;
@@ -247,6 +255,7 @@ sub end_foilgroup {
my $part = $Apache::inputtags::part;
my $bubbles_per_line = &getbubblesnum( $part, $id );
+
if ( $target eq 'grade'
|| $target eq 'web'
|| $target eq 'answer'
@@ -487,25 +496,25 @@ sub display_survey_html {
# foil lives in a
#
- my $closing_html;
- my $pre_foil;
- my $post_foil;
-
- if ($direction eq 'horizontal') {
- $result .= '
';
- $pre_foil = '';
- $post_foil = ' | ';
- } else {
- $pre_foil = '
';
- }
- # Different rendering depending on whether answers are shown:
+ my ($opening_html, $closing_html, $pre_foil, $post_foil) =
+ &html_direction_fragments($direction);
- if ($showanswer) {
- foreach my $name (@{$names}) {
+ $result = $opening_html;
+
+ # Different rendering depending on whether answers are shown:
+ # I played with different factorings but this seems the most concise/clear...
+ # although I don't like the $showanswer conditino inside the loop. Other things I tried
+ # - two loops..much longer code..no gain in clarity.
+ # - Using a visitor patttern passing it the rendering code chunklets and
+ # an anonymous hash reference for state data etc. Very cool but
+ # quite a bit more code and quite a bit less clear.
+
+ my $temp = 0;
+ foreach my $name (@{$names}) {
+ $result .= $pre_foil;
- $result .= $pre_foil;
+ if ($showanswer) {
my $foiltext = $Apache::response::foilgroup{$name . '.text'};
# Bold the prior response:
@@ -515,29 +524,135 @@ sub display_survey_html {
} else {
$result .= $foiltext;
}
-
- $result .= $post_foil;
- }
- } else {
- my $temp = 0;
- foreach my $name (@{$names}) {
- $result .= $pre_foil;
-
+ } else {
$result .= &html_radiobutton(
$part, $Apache::inputtags::response['-1'], $name, $lastresponse, $temp
);
-
- $result .= $post_foil;
- $temp++;
-
}
+
+ $result .= $post_foil;
+ $temp++;
}
+
$result .= $closing_html;
return $result;
}
+##
+# Generate LaTeX for surveys.
+#
+# @param $names - names of the foils to display.
+# @param $showanswer - flag that is true to display answers.
+# @param $lastresponse - Reference to a hash the indicates the last response.
+# @param $direction - Orientation of foils ('horiztonal' or otherwise).
+# @param $venv - LaTeX name for vertical env.
+#
+# @return string
+# @retval LaTeX rendering of the survey question.
+
+sub latex_survey {
+ my ($names, $showanswer, $lastresponse, $direction, $venv) = @_;
+
+ my $result;
+
+
+
+
+ if ($showanswer) {
+
+ $result .= "\\begin{$venv}";
+ foreach my $name (@{$names}) {
+
+
+ $result .= '\item \vskip -2mm ';
+
+ if ( defined( $lastresponse->{$name} ) ) {
+ $result .= '}';
+ }
+ $result .= $Apache::response::foilgroup{ $name . '.text' } . ' ';
+ }
+ $result .= "\\end{$venv}";
+
+ } elsif ( $env{'form.pdfFormFields'} eq 'yes'
+ && $Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
+ $result .= &display_pdf_form($names, $direction, $venv);
+ } else {
+ if ($direction eq 'horizontal') {
+ my @foil_texts = &get_foil_texts($names);
+ $result .= &Apache::caparesponse::make_horizontal_latex_bubbles(
+ $names, \@foil_texts, '$\bigcirc$');
+ } else {
+ $result .= "\\begin{$venv}";
+
+ my $temp = 0;
+ my $i = 0;
+ foreach my $name (@{$names}) {
+
+ $result .= '\item \vskip -2mm ';
+
+ if ($env{'form.pdfFormFields'} ne 'yes'
+ or $Apache::inputtags::status[-1] ne 'CAN_ANSWER' )
+ {
+ $result .=
+ '$\bigcirc$'
+ . $Apache::response::foilgroup{ $name . '.text' }
+ . '\\\\'; #' stupid emacs
+ }
+
+ $i++;
+ $temp++;
+
+ $result .= '\vskip 0 mm ';
+ }
+ $result .= "\\end{$venv}";
+ }
+
+
+ }
+
+ return $result;
+
+
+}
+##
+# Figure out the LaTeX environment in which to wrap the LaTeX vertical output.
+#
+# @return string
+# @retval the environment name. The LaTeX should be wrapped a
+# \begin{retval} \end{retval} pair.
+#
+sub latex_vertical_environment {
+ if ($env{'form.pdfFormFields'} eq 'yes'
+ && $Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
+ return 'itemize';
+ } else {
+ return 'enumerate';
+ }
+}
+
+##
+# Figure out the key html fragments that depend on the rendering direction:
+#
+# @param $direction - 'horizontal' for horizontal direction.
+#
+# @return list
+# @retval (part_start, part_end, foil_start, foil_end)
+# Where:
+# - part_start is the HTML to emit at the start of the part.
+# - part_end is the HTML to emit at the end of the part.
+# - foil_start is the HTML to emit prior to each foil.
+# - foil_end is the HTML to emit after each foil
+#
+sub html_direction_fragments {
+ my $direction = shift;
+ if ($direction eq 'horizontal') {
+ return ('', '', ' | ');
+ } else {
+ return ('', '
', '
', '');
+ }
+}
##
#
@@ -554,115 +669,37 @@ sub displayallfoils{
my ( $direction, $target ) = @_;
my $result;
&Apache::lonxml::debug("survey style display");
+
my @names;
+
if ( $Apache::response::foilgroup{'names'} ) {
@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'];
my $part = $Apache::inputtags::part;
- my $showanswer;
- my $lastresponse;
- $showanswer = &Apache::response::show_answer();
-
+
+ my $showanswer = &Apache::response::show_answer();
my $lastresponse = &get_last_survey_response($part, $showanswer, $id);
-
my $used_names = &remove_unused(\@names);
if ($target ne 'tex') {
- $result .= &display_survey_html($used_names, $part, $showanswer, $lastresponse, $direction);
- } else {
+ $result .= &display_survey_html(
+ $used_names, $part, $showanswer, $lastresponse, $direction
+ );
+ } else {
+
+ my $vertical_env = &latex_vertical_environment();
+ $result .= &latex_survey(
+ $used_names, $showanswer, $lastresponse, $direction, $vertical_env
+ );
- if ($showanswer) {
- foreach my $name (@{$used_names}) {
- if ( $Apache::response::foilgroup{ $name . '.value' } ne 'unused' )
- {
-
- $result .= '\item \vskip -2mm ';
-
- if ( defined( $lastresponse->{$name} ) ) {
- $result .= '}';
- }
- $result .= $Apache::response::foilgroup{ $name . '.text' };
- }
- }
- } else {
- foreach my $name (@{$used_names}) {
- if ( $Apache::response::foilgroup{ $name . '.value' } ne 'unused' )
- {
- if ( $env{'form.pdfFormFields'} eq 'yes'
- && $Apache::inputtags::status[-1] eq 'CAN_ANSWER' )
- {
- 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";
- }
- else {
- $result .= '\item \vskip -2mm ';
- }
-
- if ( $env{'form.pdfFormFields'} ne 'yes'
- or $Apache::inputtags::status[-1] ne 'CAN_ANSWER' )
- {
- $result .=
- '$\bigcirc$'
- . $Apache::response::foilgroup{ $name . '.text' }
- . '\\\\'; #' stupid emacs
- }
- $i++;
-
- $temp++;
-
- $result .= '\vskip 0 mm ';
- }
- }
- }
}
- # Close tex bracketing:
- if ($target eq 'tex') {
- $result .= $end_environment;
- }
return $result;
}
@@ -989,23 +1026,17 @@ sub display_foils_html {
my ($whichfoils, $target, $direction, $part, $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
+ my ($opening_html, $finalclose, $item_pretext, $item_posttext) =
+ &html_direction_fragments($direction);
+ $result .= $opening_html;
- # Horizontal layout is a table with each foil in a cell
- if ($direction eq 'horizontal') {
- $result = '';
- $item_pretext = '' . $item_pretext;
- $item_posttext = ' | ';
- $finalclose = '
';
- }
+ if ($show_answer) {
foreach my $name (@{$whichfoils}) {
@@ -1039,25 +1070,10 @@ sub display_foils_html {
$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;
@@ -1068,13 +1084,9 @@ sub display_foils_html {
$result .= $item_posttext;
$item_no++;
}
-
- if ($direction eq 'horizontal' ) {
- $result .= "";
- } else {
- $result .= "
";
- }
+
}
+ $result .= $finalclose;
return $result;
}
@@ -1084,22 +1096,21 @@ sub display_foils_html {
# @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.
+# @param $venv - Name of LaTeX environment to use for vertical rendering.
#
# @return string
# @return the latex rendering of the exam problem.
#
#
sub display_latex_exam {
- my ($whichfoils, $bubbles_per_line, $direction, $vbegin, $vend) = @_;
+ my ($whichfoils, $bubbles_per_line, $direction, $venv) = @_;
my $result;
my $numlines;
my $bubble_number = 0;
my $line = 0;
my $i = 0;
-
+
if ($direction eq 'horizontal') {
# Marshall the display text for each foil and turn things over to
@@ -1109,9 +1120,8 @@ sub display_latex_exam {
$result .= &Apache::caparesponse::make_horizontal_latex_bubbles(
$whichfoils, \@foil_texts, '$\bigcirc$');
-
} else {
- $result .= $vbegin;
+ $result .= "\\begin{$venv}";
# This section puts out the prefix that tells the user
# (if necessary) to only choose one bubble in the next n lines
@@ -1165,7 +1175,7 @@ sub display_latex_exam {
$i++;
$bubble_number++;
}
- $result .= $vend
+ $result .= "\\end{$venv}";
}
@@ -1178,14 +1188,14 @@ sub display_latex_exam {
#
# @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 $venv - Vertical env. to use for vertical rendering.
# @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 ($whichfoils, $direction, $venv) = @_;
my $result;
# how we render depends on the direction.
@@ -1199,13 +1209,13 @@ sub display_latex {
$result .= &Apache::caparesponse::make_horizontal_latex_bubbles(
$whichfoils, \@foil_texts, '');
} else {
- $result .= $vbegin;
+ $result .= "\\begin{$venv}";
foreach my $name (@{$whichfoils}) {
$result .= '\vspace*{-2 mm}\item '
. $Apache::response::foilgroup{ $name . '.text' };
}
- $result .= $vend;
+ $result .= "\\end{$venv}";
}
return $result;
}
@@ -1220,15 +1230,19 @@ sub display_latex {
# they should be displayed.
# @param $direction - Rendering direction. 'horiztonal' means inputs are laid out
# horizontally otherwise they are stacked vertically.
+# @param $venv - Vertical environment in which to wrap the foils.
#
# @return string
# @retval String containing the rendering of the resource.
#
+# TODO: Take into account direction!!!
+#
sub display_pdf_form {
- my ($whichfoils) = @_;
+ my ($whichfoils, $direction, $venv) = @_;
my $temp = 0;
my $result;
+ $result .= "\\begin{$venv}";
foreach my $name ( @{$whichfoils} ) {
my $fieldname =
@@ -1247,6 +1261,7 @@ sub display_pdf_form {
$temp++;
}
+ $result .= "\\end{$venv}";
return $result;
}
@@ -1290,40 +1305,21 @@ sub displayfoils {
# LaTeX rendering:
} else {
- my $i = 0;
- my $bubble_number = 0;
- my $line = 0;
- my $temp = 0;
+
my $id = $Apache::inputtags::response['-1'];
my $part = $Apache::inputtags::part;
-
-
-
my $numlines;
# Decide how to bracket the list of foils:
- my $begin_environment;
- my $end_environment;
+ my $vertical_env = &latex_vertical_environment();
- 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}';
- }
-
# Rendering for latex exams.
if ( ( $Apache::lonhomework::type eq 'exam' ) )
{
$result .= &display_latex_exam(
- $whichfoils, $bubbles_per_line, $direction, $begin_environment,
- $end_environment);
+ $whichfoils, $bubbles_per_line, $direction, $vertical_env);
$result .= '\vskip 0mm ';
@@ -1336,13 +1332,9 @@ sub displayfoils {
if ( ($env{'form.pdfFormFields'} eq 'yes')
&& ($Apache::inputtags::status[-1] eq 'CAN_ANSWER'))
{
- $result .= $begin_environment;
- $result .= &display_pdf_form($whichfoils, $direction);
- $result .= $end_environment;
+ $result .= &display_pdf_form($whichfoils, $direction, $vertical_env);
} else {
- $result .= &display_latex(
- $whichfoils, $direction, $begin_environment, $end_environment
- );
+ $result .= &display_latex($whichfoils, $direction, $vertical_env );
}
$result .= '\vskip 0 mm ';