Diff for /loncom/homework/radiobuttonresponse.pm between versions 1.153.6.6 and 1.153.6.9

version 1.153.6.6, 2012/01/25 11:37:32 version 1.153.6.9, 2012/02/04 20:40:07
Line 247  sub end_foilgroup { Line 247  sub end_foilgroup {
     my $part             = $Apache::inputtags::part;      my $part             = $Apache::inputtags::part;
     my $bubbles_per_line = &getbubblesnum( $part, $id );      my $bubbles_per_line = &getbubblesnum( $part, $id );
   
   
     if (   $target eq 'grade'      if (   $target eq 'grade'
         || $target eq 'web'          || $target eq 'web'
         || $target eq 'answer'          || $target eq 'answer'
Line 375  sub format_prior_answer { Line 376  sub format_prior_answer {
   
 }  }
   
 ##  ## 
 sub displayallfoils{  # Return the last survey response.  The logic is slightly different than that of 
     my ( $direction, $target ) = @_;  # get_last_responses.  TODO: See if there are chunks of code betweenthis and
     my $result;  # get_last_reponses that are common and can be factored.
     &Apache::lonxml::debug("survey style display");  #
     my @names;  # @param $part - Problem part under consideration.
     if ( $Apache::response::foilgroup{'names'} ) {  # @param $showanswer - True if answers should be shown.
         @names = @{ $Apache::response::foilgroup{'names'} };  # @param $id         - Problem id.
     }  #
   # @return hash reference.
     # Figure out how to bracket the list of foils for  # @retval reference to the has indexed by answer selection that 
     # the TeX target:  #         indicates the most recent answer.
     #  #
   sub get_last_survey_response {
     my $begin_environment;      my ($part, $showanswer, $id) = @_;
     my $end_environment;  
       
     if ($target eq 'tex') {  
   
  # Decide how to bracket the list of foils:  
   
       my $newvariation;
       my $lastresponse; # stringified last response.
   
         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 ( $lastresponse, $newvariation, $showanswer );  
     if (      if (
         (          (
             (              (
Line 432  sub displayallfoils{ Line 412  sub displayallfoils{
             $newvariation = 1;              $newvariation = 1;
         }          }
     }      }
     $showanswer = &Apache::response::show_answer();  
     unless (      unless (
         (          (
             (              (
Line 449  sub displayallfoils{ Line 428  sub displayallfoils{
         $lastresponse =          $lastresponse =
           $Apache::lonhomework::history{"resource.$part.$id.submission"};            $Apache::lonhomework::history{"resource.$part.$id.submission"};
     }      }
     if ( $direction eq 'horizontal' ) { $result .= '<table><tr>'; }  
     my %lastresponse = &Apache::lonnet::str2hash($lastresponse);      my %lastresponse = &Apache::lonnet::str2hash($lastresponse);
      
   
       return \%lastresponse;
   
   }
   ##
   # Removes the names from a foil group that are marked as unused.
   #
   # @param $names - reference to the array of names to filter.
   #
   # @return arrayref
   # @retval reference to the filtered array.
   #
   sub remove_unused {
       my ($names) = @_;
       my @result;
   
       foreach my $name (@{$names}) {
    if ($Apache::response::foilgroup{$name . '.value'} ne 'unused') {
       push(@result, $name);
    }
       }
       return \@result;
   }
   ## 
   # Displays all foils in a survey type problem for HTML rendition.
   # TODO: See if there is any logic in this sub that can be shared
   #      with display_foils_html
   #
   # @param $names        - ref to array of names of the foils to display.
   # @param $part         - Problem part number.
   # @param $showanswer   - If true, show the answers.
   # @param $lastresponse - Ref to the last response hash.
   # @param $direction    - Display direction of the radiobuttons.
   #
   # @return string
   # @retval HTML required to display the resource in a browser.
   #
   sub display_survey_html {
       my ($names, $part, $showanswer, $lastresponse, $direction) = @_;
       my $result;
   
       # Figure out a few fragments of html that depend onthe 
       # orientation of the radiobuttons:
       # closing_html - HTML to emit at the end of the resource.
       # pre_foil     - HTML to emit prior to each foil.
       # post_foil    - HTML to emit following each foil.
       #
       #  The opening HTML is just added to the $result now
       #
       #  Figuring these outin advance compresses the loop over foils into something
       #  pretty simple:
       #
       # NOTE: There's probably a really cool way to do this with style sheets
       #       and picking the selector based on the orientation, if someone wants to puzzle
       #       that out.  In that case, probably the whole thing lives in a <div> and each
       #       foil lives in a <p>
       #
   
       my $closing_html;
       my $pre_foil;
       my $post_foil;
   
       if ($direction eq 'horizontal') {
    $result       .= '<table><tr>';
    $closing_html = '</tr></table>';
    $pre_foil     = '<td>';
    $post_foil    = '</td>';
       } else {
    $pre_foil     = '<br />';
       }
       # Different rendering depending on whether answers are shown:
   
   
     if ($showanswer) {      if ($showanswer) {
         foreach my $name (@names) {   foreach my $name (@{$names}) {
             if ( $Apache::response::foilgroup{ $name . '.value' } ne 'unused' )  
             {      $result .= $pre_foil;
                 if ( ( $direction eq 'horizontal' ) && ( $target ne 'tex' ) ) {      my $foiltext =  $Apache::response::foilgroup{$name . '.text'};
                     $result .= "<td>";  
                 }      # Bold the prior  response:
                 else {  
                     if ( $target eq 'tex' ) {      if (defined($lastresponse->{$name})) {
                         $result .= '\item \vskip -2mm ';   $result .= '<b>' . $foiltext . '</b>';
                     }      } else {
                     else {   $result .= $foiltext;
                         $result .= "<br />";      }
                     }  
                 }      $result .= $post_foil;
                 if ( defined( $lastresponse{$name} ) ) {   }
                     if ( $target eq 'tex' ) {      } else {
                         $result .= '}';   my $temp = 0;
                     }   foreach my $name (@{$names}) {
                     else {      $result .=  $pre_foil;
                         $result .= '<b>';  
                     }      $result .= &html_radiobutton(
                 }   $part, $Apache::inputtags::response['-1'], $name, $lastresponse, $temp
                 $result .= $Apache::response::foilgroup{ $name . '.text' };       );
                 if ( defined( $lastresponse{$name} ) && ( $target ne 'tex' ) ) {  
                     $result .= '</b>';      $result .= $post_foil;
                 }      $temp++;
                 if ( ( $direction eq 'horizontal' ) && ( $target ne 'tex' ) ) {         
                     $result .= "</td>";   }
                 }  
             }  
         }  
     }      }
     else {  
         foreach my $name (@names) {      $result .= $closing_html;
             if ( $Apache::response::foilgroup{ $name . '.value' } ne 'unused' )      return $result;
             {  
                 if ( $direction eq 'horizontal' ) {  }
                     $result .= "<td>";  
                 }  ##
                 else {  #  Generate LaTeX for surveys.
                     if ( $target eq 'tex' ) {  #  
                         if (   $env{'form.pdfFormFields'} eq 'yes'  #   @param $names - names of the foils to display.
                             && $Apache::inputtags::status[-1] eq 'CAN_ANSWER' )  #   @param $showanswer - flag that is true to display answers.
                         {  #   @param $lastresponse - Reference to a hash the indicates the last response.
                             my $fieldname =  #   @param $direction    - Orientation of foils ('horiztonal' or otherwise).
                                 $env{'request.symb'}   #   @param $venv         - LaTeX name for vertical env.
                               . '&part_'  #
                               . $Apache::inputtags::part  #   @return string
                               . '&radiobuttonresponse'  #   @retval LaTeX rendering of the survey question.
                               . '&HWVAL_'  
                               . $Apache::inputtags::response['-1'];  sub latex_survey {
                             $result .= '\item[{'      my ($names, $showanswer, $lastresponse, $direction, $venv) = @_;
                               . &Apache::lonxml::print_pdf_radiobutton(  
                                 $fieldname, $temp )      my $result;
                               . '}]'  
                               . $Apache::response::foilgroup{ $name . '.text' }  
                               . "\n";   
                         }  
                         else {      if ($showanswer) {
                             $result .= '\item \vskip -2mm ';  
                         }   $result .= "\\begin{$venv}";
                     }   foreach my $name (@{$names}) {
                     else {      
                         $result .= "<br />";      
                     }      $result .= '\item \vskip -2mm ';
                 }      
                 if ( $target eq 'tex' ) {      if ( defined( $lastresponse->{$name} ) ) {
                     if (   $env{'form.pdfFormFields'} ne 'yes'   $result .= '}';
                         or $Apache::inputtags::status[-1] ne 'CAN_ANSWER' )      }
                     {      $result .= $Apache::response::foilgroup{ $name . '.text' } . ' ';
                         $result .=   }
                             '$\bigcirc$'   $result .= "\\end{$venv}";
                           . $Apache::response::foilgroup{ $name . '.text' }  
                           . '\\\\';    #' stupid emacs      } elsif ( $env{'form.pdfFormFields'} eq 'yes'
                     }        && $Apache::inputtags::status[-1] eq 'CAN_ANSWER') {
                     $i++;   $result .= &display_pdf_form($names, $direction, $venv);
                 }      } else {
                 else {   if ($direction eq 'horizontal') {
                     $result .= '<label>';      my @foil_texts = &get_foil_texts($names);
                     $result .= "<input      $result .=  &Apache::caparesponse::make_horizontal_latex_bubbles(
                        onchange=\"javascript:setSubmittedPart('$part');\"      $names, \@foil_texts, '$\bigcirc$');
                        type=\"radio\"   } else {
                        name=\"HWVAL_$Apache::inputtags::response['-1']\"      $result .= "\\begin{$venv}";
                        value=\"$temp\"";  
       my $temp = 0;
                     if ( defined( $lastresponse{$name} ) ) {      my $i    = 0;
                         $result .= ' checked="checked"';      foreach my $name (@{$names}) {
                     }  
                     $result .= ' />'   $result .= '\item \vskip -2mm ';
                       . $Apache::response::foilgroup{ $name . '.text' }  
                       . '</label>';   if ($env{'form.pdfFormFields'} ne 'yes'
                 }      or $Apache::inputtags::status[-1] ne 'CAN_ANSWER' )
                 $temp++;   {
                 if ( $target ne 'tex' ) {      $result .=
                     if (   ( $direction eq 'horizontal' )   '$\bigcirc$'
                         && ( $target ne 'tex' ) )   . $Apache::response::foilgroup{ $name . '.text' }
                     {      . '\\\\';    #' stupid emacs
                         $result .= "</td>";   }
                     }  
                 }   $i++;    
                 else {   $temp++;
                     $result .= '\vskip 0 mm ';  
                 }   $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';
     }      }
   }
   
   
   
   ##
   #
   #  Displays all the foils of a problem in a format suitable for
   #   surveys, surveys for credit, anonymous surveys and anonymous surveys for credit.
   #
   #  @param $direction - Display direction of the choices ('horiztonal' or not).
   #  @param $target    - Rendering target.
   #
   #  @return string
   #  @retval Text that renders for the selected target.
   # 
   sub displayallfoils{
       my ( $direction, $target ) = @_;
       my $result;
       &Apache::lonxml::debug("survey style display");
   
       my @names;
   
     if ( ( $direction eq 'horizontal' ) && ( $target ne 'tex' ) ) {      if ( $Apache::response::foilgroup{'names'} ) {
         $result .= '</tr></table>';          @names = @{ $Apache::response::foilgroup{'names'} };
     }      }
   
     # Close tex bracketing:  
   
     if ($target eq 'tex') {      my $id   = $Apache::inputtags::response['-1'];
  $result .= $end_environment;      my $part = $Apache::inputtags::part;
       
       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 {
   
    my $vertical_env = &latex_vertical_environment();
    $result .= &latex_survey(
       $used_names, $showanswer, $lastresponse, $direction, $vertical_env
    );
   
     }      }
   
   
   
     return $result;      return $result;
 }  }
   
Line 885  sub get_last_response { Line 996  sub get_last_response {
 # @param $target     - Rendition target...there are several html targets.  # @param $target     - Rendition target...there are several html targets.
 # @param $direction  - 'horizontal' if layout is horizontal.  # @param $direction  - 'horizontal' if layout is horizontal.
 # @param $part       - Part of the problem that's being displayed.  # @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.  # @param $show_answer- True if answers should be shown.
 #  #
 # @return string  # @return string
 # @retval generated html.  # @retval generated html.
 #  #
 sub display_foils_html {  sub display_foils_html {
     my ($whichfoils, $target, $direction, $part, $solved, $show_answer) = @_;      my ($whichfoils, $target, $direction, $part, $show_answer) = @_;
     my $result;      my $result;
   
     # if the answers get shown, we need to label each item as correct or      # if the answers get shown, we need to label each item as correct or
Line 990  sub display_foils_html { Line 1100  sub display_foils_html {
 # @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 $bubbles_per_line - Number of bubbles on a line.
 # @param $direction        - Rendering direction 'horizontal' is what we're looking for.  # @param $direction        - Rendering direction 'horizontal' is what we're looking for.
 # @param $vbegin           - Start latex fragment in vertical rendering.  # @param $venv             - Name of LaTeX environment to use for vertical rendering.
 # @param $vend             - End latex fragmentin vertical rendering.  
 #  #
 # @return string  # @return string
 # @return the latex rendering of the exam problem.  # @return the latex rendering of the exam problem.
 #  #
 #  #
 sub display_latex_exam {  sub display_latex_exam {
     my ($whichfoils, $bubbles_per_line, $direction, $vbegin, $vend) = @_;      my ($whichfoils, $bubbles_per_line, $direction, $venv) = @_;
     my $result;      my $result;
     my $numlines;      my $numlines;
     my $bubble_number = 0;      my $bubble_number = 0;
Line 1017  sub display_latex_exam { Line 1126  sub display_latex_exam {
   
   
     } else {      } else {
  $result .= $vbegin;   $result .= "\\begin{$venv}";
   
  # This section puts out the prefix that tells the user   # This section puts out the prefix that tells the user
  # (if necessary) to only choose one bubble in the next n lines   # (if necessary) to only choose one bubble in the next n lines
Line 1071  sub display_latex_exam { Line 1180  sub display_latex_exam {
     $i++;      $i++;
     $bubble_number++;      $bubble_number++;
  }   }
  $result .= $vend   $result .= "\\end{$venv}";
   
     }      }
   
Line 1084  sub display_latex_exam { Line 1193  sub display_latex_exam {
 #  #
 #  @param $whichfoils - The foils to display  #  @param $whichfoils - The foils to display
 #  @param $direction  - Display direction ('horizontal' is what matters to us).  #  @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.  #  @param  $vend      - End the vertical environment being used.
 #  #
 #  @return string  #  @return string
 #  @retval - The LaTeX rendering of the resource.'  #  @retval - The LaTeX rendering of the resource.'
 #  #
 sub display_latex {  sub display_latex {
     my ($whichfoils, $direction, $vbegin, $vend) = @_;      my ($whichfoils, $direction, $venv) = @_;
     my $result;      my $result;
   
     # how we render depends on the direction.      # how we render depends on the direction.
Line 1105  sub display_latex { Line 1214  sub display_latex {
  $result .= &Apache::caparesponse::make_horizontal_latex_bubbles(   $result .= &Apache::caparesponse::make_horizontal_latex_bubbles(
     $whichfoils, \@foil_texts, '');      $whichfoils, \@foil_texts, '');
     } else {      } else {
  $result .= $vbegin;   $result .= "\\begin{$venv}";
  foreach my $name (@{$whichfoils}) {   foreach my $name (@{$whichfoils}) {
     $result .=  '\vspace*{-2 mm}\item '      $result .=  '\vspace*{-2 mm}\item '
  . $Apache::response::foilgroup{ $name . '.text' };   . $Apache::response::foilgroup{ $name . '.text' };
  }   }
   
  $result .= $vend;   $result .= "\\end{$venv}";
     }      }
     return $result;      return $result;
 }  }
Line 1126  sub display_latex { Line 1235  sub display_latex {
 #                     they should be displayed.  #                     they should be displayed.
 # @param $direction  - Rendering direction.  'horiztonal' means inputs are laid out  # @param $direction  - Rendering direction.  'horiztonal' means inputs are laid out
 #                      horizontally otherwise they are stacked vertically.  #                      horizontally otherwise they are stacked vertically.
   # @param $venv       - Vertical environment in which to wrap the foils.
 #  #
 # @return string  # @return string
 # @retval String containing the rendering of the resource.  # @retval String containing the rendering of the resource.
 #  #
   # TODO: Take into account direction!!!
   #
 sub display_pdf_form {  sub display_pdf_form {
     my ($whichfoils) = @_;      my ($whichfoils, $direction, $venv) = @_;
     my $temp = 0;      my $temp = 0;
     my $result;      my $result;
   
       $result .= "\\begin{$venv}";
     foreach my $name ( @{$whichfoils} ) {      foreach my $name ( @{$whichfoils} ) {
   
  my $fieldname =   my $fieldname =
Line 1153  sub display_pdf_form { Line 1266  sub display_pdf_form {
   
  $temp++;   $temp++;
     }      }
       $result .= "\\end{$venv}";
   
     return $result;      return $result;
 }  }
Line 1186  sub displayfoils { Line 1300  sub displayfoils {
     {      {
   
  $result = &display_foils_html(   $result = &display_foils_html(
     $whichfoils, $target, $direction, $part, $solved, 1);      $whichfoils, $target, $direction, $part,  1);
   
  # other html   # other html
     }  elsif ($target ne 'tex') {      }  elsif ($target ne 'tex') {
Line 1196  sub displayfoils { Line 1310  sub displayfoils {
        # LaTeX rendering:         # LaTeX rendering:
     } else {      } else {
   
         my $i             = 0;  
         my $bubble_number = 0;  
         my $line          = 0;  
         my $temp          = 0;  
         my $id            = $Apache::inputtags::response['-1'];          my $id            = $Apache::inputtags::response['-1'];
         my $part          = $Apache::inputtags::part;          my $part          = $Apache::inputtags::part;
   
   
   
  my $numlines;   my $numlines;
   
  # Decide how to bracket the list of foils:   # Decide how to bracket the list of foils:
   
  my $begin_environment;   my $vertical_env = &latex_vertical_environment();
  my $end_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.   # Rendering for latex exams.
   
  if ( ( $Apache::lonhomework::type eq 'exam' ) )   if ( ( $Apache::lonhomework::type eq 'exam' ) )
  {   {
     $result .= &display_latex_exam(      $result .= &display_latex_exam(
  $whichfoils, $bubbles_per_line, $direction, $begin_environment,    $whichfoils, $bubbles_per_line, $direction, $vertical_env);
  $end_environment);  
   
     $result .= '\vskip 0mm ';      $result .= '\vskip 0mm ';
           
Line 1242  sub displayfoils { Line 1337  sub displayfoils {
     if ( ($env{'form.pdfFormFields'} eq 'yes')      if ( ($env{'form.pdfFormFields'} eq 'yes')
     && ($Apache::inputtags::status[-1] eq 'CAN_ANSWER'))      && ($Apache::inputtags::status[-1] eq 'CAN_ANSWER'))
     {      {
  $result .= $begin_environment;   $result .= &display_pdf_form($whichfoils, $direction, $vertical_env);
  $result .= &display_pdf_form($whichfoils, $direction);  
  $result .= $end_environment;  
     } else {      } else {
  $result .= &display_latex(   $result .= &display_latex($whichfoils,  $direction, $vertical_env );
      $whichfoils,  $direction, $begin_environment, $end_environment  
     );  
     }      }
     $result .= '\vskip 0 mm ';       $result .= '\vskip 0 mm '; 
                 

Removed from v.1.153.6.6  
changed lines
  Added in v.1.153.6.9


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>