--- loncom/homework/radiobuttonresponse.pm 2012/01/20 11:41:31 1.153.6.1 +++ 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.1 2012/01/20 11:41:31 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 # @@ -31,14 +31,22 @@ 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. + + BEGIN { &Apache::lonxml::register( 'Apache::radiobuttonresponse', ('radiobuttonresponse') ); } +#--------------------------------------------------------------------------- +# +# Generic utility subs. + sub bubble_line_count { my ( $numfoils, $bubbles_per_line ) = @_; my $bubble_lines; @@ -50,6 +58,10 @@ sub bubble_line_count { } + +#------------------------------------------------------------------------------ +# +# XML handlers. sub start_radiobuttonresponse { my ( $target, $token, $tagstack, $parstack, $parser, $safeeval, $style ) = @_; @@ -118,14 +130,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 +145,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', @@ -259,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' @@ -387,21 +384,25 @@ sub format_prior_answer { } -## -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'} }; - } +## +# Return the last survey response. The logic is slightly different than that of +# get_last_responses. TODO: See if there are chunks of code betweenthis and +# get_last_reponses that are common and can be factored. +# +# @param $part - Problem part under consideration. +# @param $showanswer - True if answers should be shown. +# @param $id - Problem id. +# +# @return hash reference. +# @retval reference to the has indexed by answer selection that +# indicates the most recent answer. +# +sub get_last_survey_response { + my ($part, $showanswer, $id) = @_; + + my $newvariation; + my $lastresponse; # stringified last response. - my $temp = 0; - my $i = 0; - my $id = $Apache::inputtags::response['-1']; - my $part = $Apache::inputtags::part; - my ( $lastresponse, $newvariation, $showanswer ); if ( ( ( @@ -419,7 +420,6 @@ sub displayallfoils { $newvariation = 1; } } - $showanswer = &Apache::response::show_answer(); unless ( ( ( @@ -436,122 +436,275 @@ sub displayallfoils { $lastresponse = $Apache::lonhomework::history{"resource.$part.$id.submission"}; } - if ( $direction eq 'horizontal' ) { $result .= '
";
- }
- else {
- if ( $target eq 'tex' ) {
- $result .= '\item \vskip -2mm ';
- }
- else {
- $result .= " "; - } - } - if ( defined( $lastresponse{$name} ) ) { - if ( $target eq 'tex' ) { - $result .= '}'; - } - else { - $result .= ''; - } - } - $result .= $Apache::response::foilgroup{ $name . '.text' }; - if ( defined( $lastresponse{$name} ) && ( $target ne 'tex' ) ) { - $result .= ''; - } - if ( ( $direction eq 'horizontal' ) && ( $target ne 'tex' ) ) { - $result .= " | ";
- }
- }
- }
+
+ $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}";
+ }
+
+
}
- else {
- foreach my $name (@names) {
- if ( $Apache::response::foilgroup{ $name . '.value' } ne 'unused' )
- {
- if ( $direction eq 'horizontal' ) {
- $result .= "";
- }
- else {
- if ( $target eq 'tex' ) {
- 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 ';
- }
- }
- else {
- $result .= " "; - } - } - if ( $target eq 'tex' ) { - if ( $env{'form.pdfFormFields'} ne 'yes' - or $Apache::inputtags::status[-1] ne 'CAN_ANSWER' ) - { - $result .= - '$\bigcirc$' - . $Apache::response::foilgroup{ $name . '.text' } - . '\\\\'; #' stupid emacs - } - $i++; - } - else { - $result .= ' | ";
- }
- }
- else {
- $result .= '\vskip 0 mm ';
- }
- }
- }
+
+ 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';
}
+}
- if ( ( $direction eq 'horizontal' ) && ( $target ne 'tex' ) ) {
- $result .= '
' . $item_pretext; - $item_posttext = ' | '; - $finalclose = '
'; }
-# }
-# if ( $target ne 'tex' ) {
-# $result .= " "; -# } -# else { -# $result .= '\item \vskip -2 mm '; -# } -# if ( $Apache::response::foilgroup{ $name . '.value' } eq 'true' ) { -# if ( $target ne 'tex' ) { -# $result .= &mt('Correct:') . ''; -# } -# else { -# $result .= &mt('Correct:') . ' \textbf{'; -# } -# } -# else { -# $result .= &mt('Incorrect:'); -# } -# if ( $target eq 'web' ) { $result .= ""; } -# if ( $Apache::response::foilgroup{ $name . '.value' } eq 'true' ) { -# if ( $target ne 'tex' ) { $result .= ''; } -# else { $result .= '}'; } -# } -# if ( $direction eq 'horizontal' ) { -# if ( $target ne 'tex' ) { $result .= ' | '; }
-# }
-# }
-# if ( $direction eq 'horizontal' ) {
-# if ( $target ne 'tex' ) {
-# $result .= '
";
- }
- else {
- $result .= " "; - } - } - if ( $target ne 'tex' ) { - $result .= ' | ";
- }
- $temp++;
- }
- if ( $target ne 'tex' && $direction eq 'horizontal' ) {
- $result .= "