Annotation of loncom/homework/radiobuttonresponse.pm, revision 1.153
1.22 albertel 1: # The LearningOnline Network with CAPA
2: # mutliple choice style responses
1.31 albertel 3: #
1.153 ! foxr 4: # $Id: radiobuttonresponse.pm,v 1.152 2011/09/16 22:23:54 raeburn Exp $
1.31 albertel 5: #
6: # Copyright Michigan State University Board of Trustees
7: #
8: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
9: #
10: # LON-CAPA is free software; you can redistribute it and/or modify
11: # it under the terms of the GNU General Public License as published by
12: # the Free Software Foundation; either version 2 of the License, or
13: # (at your option) any later version.
14: #
15: # LON-CAPA is distributed in the hope that it will be useful,
16: # but WITHOUT ANY WARRANTY; without even the implied warranty of
17: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18: # GNU General Public License for more details.
19: #
20: # You should have received a copy of the GNU General Public License
1.130 foxr 21: # along with LON-CAPA; if not, write to the Free Software# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
1.31 albertel 22: #
23: # /home/httpd/html/adm/gpl.txt
24: #
25: # http://www.lon-capa.org/
26: #
1.1 albertel 27:
28: package Apache::radiobuttonresponse;
29: use strict;
1.42 albertel 30: use HTML::Entities();
1.85 albertel 31: use Apache::lonlocal;
1.100 albertel 32: use Apache::lonnet;
1.115 foxr 33: use Apache::response;
1.1 albertel 34:
1.120 foxr 35: my $default_bubbles_per_line = 10;
1.121 foxr 36:
1.36 harris41 37: BEGIN {
1.153 ! foxr 38: &Apache::lonxml::register( 'Apache::radiobuttonresponse',
! 39: ('radiobuttonresponse') );
1.1 albertel 40: }
41:
1.121 foxr 42: sub bubble_line_count {
1.153 ! foxr 43: my ( $numfoils, $bubbles_per_line ) = @_;
1.121 foxr 44: my $bubble_lines;
1.153 ! foxr 45: $bubble_lines = int( $numfoils / $bubbles_per_line );
! 46: if ( ( $numfoils % $bubbles_per_line ) != 0 ) {
! 47: $bubble_lines++;
1.121 foxr 48: }
49: return $bubble_lines;
1.153 ! foxr 50:
1.121 foxr 51: }
52:
1.1 albertel 53: sub start_radiobuttonresponse {
1.153 ! foxr 54: my ( $target, $token, $tagstack, $parstack, $parser, $safeeval, $style ) =
! 55: @_;
1.83 albertel 56: my $result;
1.115 foxr 57:
1.83 albertel 58: #when in a radiobutton response use these
1.153 ! foxr 59: &Apache::lonxml::register( 'Apache::radiobuttonresponse',
! 60: ( 'foilgroup', 'foil', 'conceptgroup' ) );
! 61: push( @Apache::lonxml::namespace, 'radiobuttonresponse' );
! 62: my $id = &Apache::response::start_response( $parstack, $safeeval );
1.120 foxr 63:
1.153 ! foxr 64: %Apache::hint::radiobutton = ();
1.85 albertel 65: undef(%Apache::response::foilnames);
1.153 ! foxr 66: if ( $target eq 'meta' ) {
! 67: $result = &Apache::response::meta_package_write('radiobuttonresponse');
! 68: }
! 69: elsif ( $target eq 'edit' ) {
! 70: $result .=
! 71: &Apache::edit::start_table($token)
! 72: . '<tr><td>'
! 73: . &Apache::lonxml::description($token)
! 74: . &Apache::loncommon::help_open_topic('Radio_Response_Problems')
! 75: . '</td>'
! 76: . '<td><span class="LC_nobreak">'
! 77: . &mt('Delete?') . ' '
! 78: . &Apache::edit::deletelist( $target, $token )
! 79: . '</span></td>'
! 80: . '<td> '
! 81: . &Apache::edit::end_row()
! 82: . &Apache::edit::start_spanning_row();
! 83: $result .= &Apache::edit::text_arg( 'Max Number Of Shown Foils:',
! 84: 'max', $token, '4' )
! 85: . ' ' x 3
! 86: . &Apache::edit::select_arg( 'Randomize Foil Order:',
! 87: 'randomize', [ 'yes', 'no' ], $token )
! 88: . ' ' x 3
! 89: . &Apache::edit::select_arg(
! 90: 'Display Direction:', 'direction',
! 91: [ 'vertical', 'horizontal' ], $token
! 92: )
! 93: . &Apache::edit::end_row()
! 94: . &Apache::edit::start_spanning_row() . "\n";
! 95: }
! 96: elsif ( $target eq 'modified' ) {
! 97: my $constructtag =
! 98: &Apache::edit::get_new_args( $token, $parstack, $safeeval, 'max',
! 99: 'randomize', 'direction' );
! 100: if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
! 101: }
! 102: elsif ( $target eq 'tex' ) {
! 103: my $type =
! 104: &Apache::lonxml::get_param( 'TeXtype', $parstack, $safeeval, undef,
! 105: 0 );
! 106: if ( $type eq '1' ) {
! 107: $result .= ' \renewcommand{\labelenumi}{\arabic{enumi}.}';
! 108: }
! 109: elsif ( $type eq 'A' ) {
! 110: $result .= ' \renewcommand{\labelenumi}{\Alph{enumi}.}';
! 111: }
! 112: elsif ( $type eq 'a' ) {
! 113: $result .= ' \renewcommand{\labelenumi}{\alph{enumi}.}';
! 114: }
! 115: elsif ( $type eq 'i' ) {
! 116: $result .= ' \renewcommand{\labelenumi}{\roman{enumi}.}';
! 117: }
! 118: else {
! 119: $result .= ' \renewcommand{\labelenumi}{\Alph{enumi}.}';
! 120: }
! 121: if ( $env{'form.pdfFormFields'} eq 'yes'
! 122: && $Apache::inputtags::status[-1] eq 'CAN_ANSWER' )
! 123: {
1.145 onken 124: $result .= '\begin{itemize}';
1.153 ! foxr 125: }
! 126: else {
1.135 onken 127: $result .= '\begin{enumerate}';
128: }
1.153 ! foxr 129: }
! 130: elsif ( $target eq 'analyze' ) {
! 131: my $part_id = "$Apache::inputtags::part.$id";
1.131 raeburn 132: $Apache::lonhomework::analyze{"$part_id.type"} = 'radiobuttonresponse';
1.153 ! foxr 133: push( @{ $Apache::lonhomework::analyze{"parts"} }, $part_id );
1.83 albertel 134: }
135: return $result;
1.1 albertel 136: }
137:
138: sub end_radiobuttonresponse {
1.153 ! foxr 139: my ( $target, $token, $tagstack, $parstack, $parser, $safeeval, $style ) =
! 140: @_;
1.83 albertel 141: my $result;
1.153 ! foxr 142: if ( $target eq 'edit' ) { $result = &Apache::edit::end_table(); }
! 143: if ( $target eq 'tex' ) {
! 144: if ( $env{'form.pdfFormFields'} eq 'yes'
! 145: and $Apache::inputtags::status[-1] eq 'CAN_ANSWER' )
! 146: {
1.145 onken 147: $result .= '\end{itemize}';
1.153 ! foxr 148: }
! 149: else {
1.145 onken 150: $result .= '\end{enumerate}';
151: }
1.135 onken 152: }
1.83 albertel 153: &Apache::response::end_response;
154: pop @Apache::lonxml::namespace;
1.153 ! foxr 155: &Apache::lonxml::deregister( 'Apache::radiobuttonresponse',
! 156: ( 'foilgroup', 'foil', 'conceptgroup' ) );
1.85 albertel 157: undef(%Apache::response::foilnames);
1.83 albertel 158: return $result;
1.1 albertel 159: }
160:
1.153 ! foxr 161: %Apache::response::foilgroup = ();
! 162:
1.1 albertel 163: sub start_foilgroup {
1.153 ! foxr 164: my ( $target, $token, $tagstack, $parstack, $parser, $safeeval, $style ) =
! 165: @_;
! 166: %Apache::response::foilgroup = ();
! 167: $Apache::radiobuttonresponse::conceptgroup = 0;
! 168: &Apache::response::pushrandomnumber( undef, $target );
1.151 raeburn 169: return;
1.5 albertel 170: }
171:
1.15 albertel 172: sub storesurvey {
1.144 raeburn 173: my ($style) = @_;
1.99 albertel 174: if ( !&Apache::response::submitted() ) { return ''; }
1.153 ! foxr 175: my $response = $env{ 'form.HWVAL_' . $Apache::inputtags::response['-1'] };
1.83 albertel 176: &Apache::lonxml::debug("Here I am!:$response:");
1.153 ! foxr 177: if ( $response !~ /[0-9]+/ ) { return ''; }
! 178: my $part = $Apache::inputtags::part;
! 179: my $id = $Apache::inputtags::response['-1'];
! 180: my @whichfoils = @{ $Apache::response::foilgroup{'names'} };
1.83 albertel 181: my %responsehash;
1.153 ! foxr 182: $responsehash{ $whichfoils[$response] } = $response;
! 183: my $responsestr = &Apache::lonnet::hash2str(%responsehash);
! 184: $Apache::lonhomework::results{"resource.$part.$id.submission"} =
! 185: $responsestr;
! 186: my %previous =
! 187: &Apache::response::check_for_previous( $responsestr, $part, $id );
1.144 raeburn 188: my $ad;
1.153 ! foxr 189:
! 190: if ( $style eq 'anonsurvey' ) {
! 191: $ad = $Apache::lonhomework::results{"resource.$part.$id.awarddetail"} =
! 192: 'ANONYMOUS';
! 193: }
! 194: elsif ( $style eq 'anonsurveycred' ) {
! 195: $ad = $Apache::lonhomework::results{"resource.$part.$id.awarddetail"} =
! 196: 'ANONYMOUS_CREDIT';
! 197: }
! 198: elsif ( $style eq 'surveycred' ) {
! 199: $ad = $Apache::lonhomework::results{"resource.$part.$id.awarddetail"} =
! 200: 'SUBMITTED_CREDIT';
! 201: }
! 202: else {
! 203: $ad = $Apache::lonhomework::results{"resource.$part.$id.awarddetail"} =
! 204: 'SUBMITTED';
1.144 raeburn 205: }
1.153 ! foxr 206: &Apache::response::handle_previous( \%previous, $ad );
1.83 albertel 207: &Apache::lonxml::debug("submitted a $response<br />\n");
208: return '';
1.15 albertel 209: }
210:
1.32 albertel 211: sub grade_response {
1.153 ! foxr 212: my ( $answer, $whichfoils, $bubbles_per_line ) = @_;
1.123 albertel 213:
1.99 albertel 214: if ( !&Apache::response::submitted() ) { return; }
1.83 albertel 215: my $response;
1.116 foxr 216:
1.153 ! foxr 217: if ( $env{'form.submitted'} eq 'scantron' ) {
! 218: $response =
! 219: &Apache::response::getresponse( 1, undef,
! 220: &bubble_line_count( scalar( @{$whichfoils} ), $bubbles_per_line ),
! 221: $bubbles_per_line );
! 222:
! 223: }
! 224: else {
! 225: $response = $env{ 'form.HWVAL_' . $Apache::inputtags::response['-1'] };
1.83 albertel 226: }
1.120 foxr 227:
1.153 ! foxr 228: if ( $response !~ /[0-9]+/ ) { return; }
! 229: my $part = $Apache::inputtags::part;
! 230: my $id = $Apache::inputtags::response['-1'];
1.83 albertel 231: my %responsehash;
1.153 ! foxr 232: $responsehash{ $whichfoils->[$response] } = $response;
! 233: my $responsestr = &Apache::lonnet::hash2str(%responsehash);
! 234: my %previous =
! 235: &Apache::response::check_for_previous( $responsestr, $part, $id );
! 236: $Apache::lonhomework::results{"resource.$part.$id.submission"} =
! 237: $responsestr;
1.83 albertel 238: &Apache::lonxml::debug("submitted a $response<br />\n");
239: my $ad;
1.153 ! foxr 240:
! 241: if ( $response == $answer ) {
! 242: $ad = 'EXACT_ANS';
! 243: }
! 244: else {
! 245: $ad = 'INCORRECT';
1.83 albertel 246: }
1.153 ! foxr 247: $Apache::lonhomework::results{"resource.$part.$id.awarddetail"} = $ad;
! 248: &Apache::response::handle_previous( \%previous, $ad );
1.32 albertel 249: }
250:
1.1 albertel 251: sub end_foilgroup {
1.153 ! foxr 252: my ( $target, $token, $tagstack, $parstack, $parser, $safeeval, $style ) =
! 253: @_;
1.29 albertel 254:
1.83 albertel 255: my $result;
1.121 foxr 256: my $bubble_lines;
257: my $answer_count;
1.153 ! foxr 258: my $id = $Apache::inputtags::response['-1'];
! 259: my $part = $Apache::inputtags::part;
! 260: my $bubbles_per_line = &getbubblesnum( $part, $id );
! 261:
! 262: if ( $target eq 'grade'
! 263: || $target eq 'web'
! 264: || $target eq 'answer'
! 265: || $target eq 'tex'
! 266: || $target eq 'analyze' )
! 267: {
! 268: my $style = $Apache::lonhomework::type;
! 269: my $direction =
! 270: &Apache::lonxml::get_param( 'direction', $parstack, $safeeval, '-2' );
! 271: if (
! 272: (
! 273: ( $style eq 'survey' )
! 274: || ( $style eq 'surveycred' )
! 275: || ( $style eq 'anonsurvey' )
! 276: || ( $style eq 'anonsurveycred' )
! 277: )
! 278: && ( $target ne 'analyze' )
! 279: )
! 280: {
! 281: if ( $target eq 'web' || $target eq 'tex' ) {
! 282: $result = &displayallfoils( $direction, $target );
! 283: }
! 284: elsif ( $target eq 'answer' ) {
! 285: $result = &displayallanswers();
! 286: }
! 287: elsif ( $target eq 'grade' ) {
! 288: $result = &storesurvey($style);
! 289: }
! 290: $answer_count =
! 291: scalar( @{ $Apache::response::foilgroup{'names'} } );
! 292:
! 293: }
! 294: else {
! 295:
! 296: my $name;
! 297: my $max =
! 298: &Apache::lonxml::get_param( 'max', $parstack, $safeeval, '-2' );
! 299: my $randomize =
! 300: &Apache::lonxml::get_param( 'randomize', $parstack, $safeeval,
! 301: '-2' );
! 302: my ( $answer, @shown ) = &whichfoils( $max, $randomize );
! 303: $answer_count = scalar(@shown);
! 304:
! 305: if ( $target eq 'web' || $target eq 'tex' ) {
! 306: $result =
! 307: &displayfoils( $target, $answer, \@shown, $direction,
! 308: $bubbles_per_line );
! 309: }
! 310: elsif ( $target eq 'answer' ) {
! 311: $result =
! 312: &displayanswers( $answer, \@shown, $bubbles_per_line );
! 313: }
! 314: elsif ( $target eq 'grade' ) {
! 315: &grade_response( $answer, \@shown, $bubbles_per_line );
! 316: }
! 317: elsif ( $target eq 'analyze' ) {
! 318: my $bubble_lines =
! 319: &bubble_line_count( $answer_count, $bubbles_per_line );
! 320: &Apache::response::analyze_store_foilgroup( \@shown,
! 321: [ 'text', 'value', 'location' ] );
! 322: my $part_id = "$part.$id";
! 323: push(
! 324: @{ $Apache::lonhomework::analyze{"$part_id.options"} },
! 325: ( 'true', 'false' )
! 326: );
1.121 foxr 327:
1.153 ! foxr 328: }
! 329: }
! 330: $Apache::lonxml::post_evaluate = 0;
! 331: }
! 332: if ( $target eq 'web' ) {
! 333: &Apache::response::setup_prior_tries_hash( \&format_prior_answer,
! 334: [ \%Apache::response::foilgroup ] );
1.114 albertel 335: }
1.128 foxr 336: &Apache::response::poprandomnumber();
1.153 ! foxr 337: $bubble_lines = &bubble_line_count( $answer_count, $bubbles_per_line );
! 338: &Apache::lonxml::increment_counter( $bubble_lines, "$part.$id" );
! 339: if ( $target eq 'analyze' ) {
! 340: &Apache::lonhomework::set_bubble_lines();
1.128 foxr 341: }
1.83 albertel 342: return $result;
1.6 albertel 343: }
344:
1.151 raeburn 345: sub getbubblesnum {
1.153 ! foxr 346: my ( $part, $id ) = @_;
1.151 raeburn 347: my $bubbles_per_line;
348: my $default_numbubbles = $default_bubbles_per_line;
1.153 ! foxr 349: if ( ( $env{'form.bubbles_per_row'} =~ /^\d+$/ )
! 350: && ( $env{'form.bubbles_per_row'} > 0 ) )
! 351: {
1.151 raeburn 352: $default_numbubbles = $env{'form.bubbles_per_row'};
353: }
1.153 ! foxr 354: $bubbles_per_line = &Apache::response::get_response_param( $part . "_$id",
! 355: 'numbubbles', $default_numbubbles );
1.151 raeburn 356: return $bubbles_per_line;
357: }
358:
1.6 albertel 359: sub getfoilcounts {
1.83 albertel 360: my @names;
1.153 ! foxr 361: my $truecnt = 0;
! 362: my $falsecnt = 0;
1.83 albertel 363: my $name;
364: if ( $Apache::response::foilgroup{'names'} ) {
1.153 ! foxr 365: @names = @{ $Apache::response::foilgroup{'names'} };
1.6 albertel 366: }
1.83 albertel 367: foreach $name (@names) {
1.153 ! foxr 368: if ( $Apache::response::foilgroup{ $name . '.value' } eq 'true' ) {
! 369: $truecnt++;
! 370: }
! 371: elsif ( $Apache::response::foilgroup{ $name . '.value' } eq 'false' ) {
! 372: $falsecnt++;
! 373: }
1.83 albertel 374: }
1.153 ! foxr 375: return ( $truecnt, $falsecnt );
1.5 albertel 376: }
377:
1.114 albertel 378: sub format_prior_answer {
1.153 ! foxr 379: my ( $mode, $answer, $other_data ) = @_;
1.114 albertel 380: my $foil_data = $other_data->[0];
1.153 ! foxr 381: my %response = &Apache::lonnet::str2hash($answer);
! 382: my ($name) = keys(%response);
! 383: return
! 384: '<span class="LC_prior_radiobutton">'
! 385: . $foil_data->{ $name . '.text' }
! 386: . '</span>';
1.114 albertel 387:
1.112 albertel 388: }
389:
1.15 albertel 390: sub displayallfoils {
1.153 ! foxr 391: my ( $direction, $target ) = @_;
1.83 albertel 392: my $result;
393: &Apache::lonxml::debug("survey style display");
1.106 albertel 394: my @names;
395: if ( $Apache::response::foilgroup{'names'} ) {
1.153 ! foxr 396: @names = @{ $Apache::response::foilgroup{'names'} };
1.106 albertel 397: }
1.120 foxr 398:
1.153 ! foxr 399: my $temp = 0;
! 400: my $i = 0;
! 401: my $id = $Apache::inputtags::response['-1'];
! 402: my $part = $Apache::inputtags::part;
! 403: my ( $lastresponse, $newvariation, $showanswer );
! 404: if (
! 405: (
! 406: (
! 407: $Apache::lonhomework::history{"resource.$part.type"} eq
! 408: 'randomizetry'
! 409: )
! 410: || ( $Apache::lonhomework::type eq 'randomizetry' )
! 411: )
! 412: && ( $Apache::inputtags::status[-1] eq 'CAN_ANSWER' )
! 413: )
! 414: {
! 415: if ( $env{ 'form.' . $part . '.rndseed' } ne
! 416: $Apache::lonhomework::history{"resource.$part.rndseed"} )
! 417: {
1.147 raeburn 418: $newvariation = 1;
419: }
420: }
421: $showanswer = &Apache::response::show_answer();
1.153 ! foxr 422: unless (
! 423: (
! 424: (
! 425: $Apache::lonhomework::history{"resource.$part.type"} eq
! 426: 'anonsurvey'
! 427: )
! 428: || ( $Apache::lonhomework::history{"resource.$part.type"} eq
! 429: 'anonsurveycred' )
! 430: )
! 431: && ( defined( $env{'form.grade_symb'} ) )
! 432: || ( $newvariation && !$showanswer )
! 433: )
! 434: {
! 435: $lastresponse =
! 436: $Apache::lonhomework::history{"resource.$part.$id.submission"};
1.144 raeburn 437: }
1.153 ! foxr 438: if ( $direction eq 'horizontal' ) { $result .= '<table><tr>'; }
! 439: my %lastresponse = &Apache::lonnet::str2hash($lastresponse);
1.147 raeburn 440: if ($showanswer) {
1.153 ! foxr 441: foreach my $name (@names) {
! 442: if ( $Apache::response::foilgroup{ $name . '.value' } ne 'unused' )
! 443: {
! 444: if ( ( $direction eq 'horizontal' ) && ( $target ne 'tex' ) ) {
! 445: $result .= "<td>";
! 446: }
! 447: else {
! 448: if ( $target eq 'tex' ) {
! 449: $result .= '\item \vskip -2mm ';
! 450: }
! 451: else {
! 452: $result .= "<br />";
! 453: }
! 454: }
! 455: if ( defined( $lastresponse{$name} ) ) {
! 456: if ( $target eq 'tex' ) {
! 457: $result .= '}';
! 458: }
! 459: else {
! 460: $result .= '<b>';
! 461: }
! 462: }
! 463: $result .= $Apache::response::foilgroup{ $name . '.text' };
! 464: if ( defined( $lastresponse{$name} ) && ( $target ne 'tex' ) ) {
! 465: $result .= '</b>';
! 466: }
! 467: if ( ( $direction eq 'horizontal' ) && ( $target ne 'tex' ) ) {
! 468: $result .= "</td>";
! 469: }
! 470: }
! 471: }
! 472: }
! 473: else {
! 474: foreach my $name (@names) {
! 475: if ( $Apache::response::foilgroup{ $name . '.value' } ne 'unused' )
! 476: {
! 477: if ( $direction eq 'horizontal' ) {
! 478: $result .= "<td>";
! 479: }
! 480: else {
! 481: if ( $target eq 'tex' ) {
! 482: if ( $env{'form.pdfFormFields'} eq 'yes'
! 483: && $Apache::inputtags::status[-1] eq 'CAN_ANSWER' )
! 484: {
! 485: my $fieldname =
! 486: $env{'request.symb'}
! 487: . '&part_'
! 488: . $Apache::inputtags::part
! 489: . '&radiobuttonresponse'
! 490: . '&HWVAL_'
! 491: . $Apache::inputtags::response['-1'];
! 492: $result .= '\item[{'
! 493: . &Apache::lonxml::print_pdf_radiobutton(
! 494: $fieldname, $temp )
! 495: . '}]'
! 496: . $Apache::response::foilgroup{ $name . '.text' }
! 497: . "\n";
! 498: }
! 499: else {
1.135 onken 500: $result .= '\item \vskip -2mm ';
501: }
1.153 ! foxr 502: }
! 503: else {
! 504: $result .= "<br />";
! 505: }
! 506: }
! 507: if ( $target eq 'tex' ) {
! 508: if ( $env{'form.pdfFormFields'} ne 'yes'
! 509: or $Apache::inputtags::status[-1] ne 'CAN_ANSWER' )
! 510: {
! 511: $result .=
! 512: '$\bigcirc$'
! 513: . $Apache::response::foilgroup{ $name . '.text' }
! 514: . '\\\\'; #' stupid emacs
! 515: }
! 516: $i++;
! 517: }
! 518: else {
! 519: $result .= '<label>';
! 520: $result .= "<input
1.113 albertel 521: onchange=\"javascript:setSubmittedPart('$part');\"
522: type=\"radio\"
523: name=\"HWVAL_$Apache::inputtags::response['-1']\"
1.142 bisitz 524: value=\"$temp\"";
1.147 raeburn 525:
1.153 ! foxr 526: if ( defined( $lastresponse{$name} ) ) {
! 527: $result .= ' checked="checked"';
! 528: }
! 529: $result .= ' />'
! 530: . $Apache::response::foilgroup{ $name . '.text' }
! 531: . '</label>';
! 532: }
! 533: $temp++;
! 534: if ( $target ne 'tex' ) {
! 535: if ( ( $direction eq 'horizontal' )
! 536: && ( $target ne 'tex' ) )
! 537: {
! 538: $result .= "</td>";
! 539: }
! 540: }
! 541: else {
! 542: $result .= '\vskip 0 mm ';
! 543: }
! 544: }
! 545: }
! 546: }
! 547:
! 548: if ( ( $direction eq 'horizontal' ) && ( $target ne 'tex' ) ) {
! 549: $result .= '</tr></table>';
1.45 albertel 550: }
1.83 albertel 551: return $result;
1.15 albertel 552: }
553:
1.28 albertel 554: sub whichfoils {
1.153 ! foxr 555: my ( $max, $randomize ) = @_;
1.28 albertel 556:
1.83 albertel 557: my @truelist;
558: my @falselist;
1.153 ! foxr 559: my @whichfalse = ();
! 560: my ( $truecnt, $falsecnt ) = &getfoilcounts();
! 561: my $count = 0;
! 562:
1.83 albertel 563: # we will add in 1 of the true statements
1.153 ! foxr 564: if ( $max > 0 && ( $falsecnt + 1 ) > $max ) { $count = $max }
! 565: else { $count = $falsecnt + 1; $max = $count; }
! 566: my $answer = int( &Math::Random::random_uniform() * ($count) );
1.83 albertel 567: &Apache::lonxml::debug("Count is $count, $answer is $answer");
568: my @names;
569: if ( $Apache::response::foilgroup{'names'} ) {
1.153 ! foxr 570: @names = @{ $Apache::response::foilgroup{'names'} };
! 571: }
! 572: if ( &Apache::response::showallfoils() ) {
! 573: @whichfalse = @names;
! 574: }
! 575: elsif ( $randomize eq 'no' ) {
! 576: &Apache::lonxml::debug("No randomization");
! 577: my $havetrue = 0;
! 578: foreach my $name (@names) {
! 579: if ( $Apache::response::foilgroup{ $name . '.value' } eq 'true' ) {
! 580: if ( !$havetrue ) {
! 581: push( @whichfalse, $name );
! 582: $havetrue++;
! 583: $answer = $#whichfalse;
! 584: }
! 585: }
! 586: elsif (
! 587: $Apache::response::foilgroup{ $name . '.value' } eq 'false' )
! 588: {
! 589: push( @whichfalse, $name );
! 590: }
! 591: elsif (
! 592: $Apache::response::foilgroup{ $name . '.value' } eq 'unused' )
! 593: {
! 594: }
! 595: else {
! 596: &Apache::lonxml::error(
! 597: &HTML::Entities::encode(
! 598: "No valid value assigned ($Apache::response::foilgroup{$name.'.value'}) for foil $name in <foilgroup>",
! 599: '<>&"'
! 600: )
! 601: );
! 602: }
! 603: }
! 604: if ( ( !$havetrue )
! 605: && ( $Apache::lonhomework::type ne 'survey' )
! 606: && ( $Apache::lonhomework::type ne 'surveycred' )
! 607: && ( $Apache::lonhomework::type ne 'anonsurvey' )
! 608: && ( $Apache::lonhomework::type ne 'anonsurveycred' ) )
! 609: {
! 610: &Apache::lonxml::error(
! 611: &mt('There are no true statements available.') . '<br />' );
! 612: }
1.83 albertel 613: }
1.153 ! foxr 614: else {
! 615: my $current = 0;
! 616: &Apache::lonhomework::showhash(%Apache::response::foilgroup);
! 617: my ( %top, %bottom );
! 618:
! 619: #first find out where everyone wants to be
! 620: foreach my $name (@names) {
! 621: $current++;
! 622: if ( $Apache::response::foilgroup{ $name . '.value' } eq 'true' ) {
! 623: push( @truelist, $name );
! 624: if ( $Apache::response::foilgroup{ $name . '.location' } eq
! 625: 'top' )
! 626: {
! 627: $top{$name} = $current;
! 628: }
! 629: elsif ( $Apache::response::foilgroup{ $name . '.location' } eq
! 630: 'bottom' )
! 631: {
! 632: $bottom{$name} = $current;
! 633: }
! 634: }
! 635: elsif (
! 636: $Apache::response::foilgroup{ $name . '.value' } eq 'false' )
! 637: {
! 638: push( @falselist, $name );
! 639: if ( $Apache::response::foilgroup{ $name . '.location' } eq
! 640: 'top' )
! 641: {
! 642: $top{$name} = $current;
! 643: }
! 644: elsif ( $Apache::response::foilgroup{ $name . '.location' } eq
! 645: 'bottom' )
! 646: {
! 647: $bottom{$name} = $current;
! 648: }
! 649: }
! 650: elsif (
! 651: $Apache::response::foilgroup{ $name . '.value' } eq 'unused' )
! 652: {
! 653: }
! 654: else {
! 655: &Apache::lonxml::error(
! 656: &HTML::Entities::encode(
! 657: "No valid value assigned ($Apache::response::foilgroup{$name.'.value'}) for foil $name in <foilgroup>",
! 658: '<>&"'
! 659: )
! 660: );
! 661: }
! 662: }
! 663:
! 664: #pick a true statement
! 665: my $notrue = 0;
! 666: if ( scalar(@truelist) == 0 ) { $notrue = 1; }
! 667: my $whichtrue =
! 668: int( &Math::Random::random_uniform() * ( $#truelist + 1 ) );
! 669: &Apache::lonxml::debug(
! 670: "Max is $max, From $#truelist elms, picking $whichtrue");
! 671: my ( @toplist, @bottomlist );
! 672: my $topcount = 0;
! 673: my $bottomcount = 0;
! 674:
! 675: # assign everyone to either toplist/bottomlist or whichfalse
! 676: # which false is randomized, toplist bottomlist are in order
! 677: while (( ( $#whichfalse + $topcount + $bottomcount ) < $max - 2 )
! 678: && ( $#falselist > -1 ) )
! 679: {
! 680: &Apache::lonxml::debug("Have $#whichfalse max is $max");
! 681: my $afalse =
! 682: int( &Math::Random::random_uniform() * ( $#falselist + 1 ) );
! 683: &Apache::lonxml::debug("From $#falselist elms, picking $afalse");
! 684: $afalse = splice( @falselist, $afalse, 1 );
! 685: &Apache::lonxml::debug("Picked $afalse");
! 686: &Apache::lonhomework::showhash( ( 'names' => \@names ) );
! 687: &Apache::lonhomework::showhash(%top);
! 688: if ( $top{$afalse} ) {
! 689: $toplist[ $top{$afalse} ] = $afalse;
! 690: $topcount++;
! 691: }
! 692: elsif ( $bottom{$afalse} ) {
! 693: $bottomlist[ $bottom{$afalse} ] = $afalse;
! 694: $bottomcount++;
! 695: }
! 696: else {
! 697: push( @whichfalse, $afalse );
! 698: }
! 699: }
! 700: &Apache::lonxml::debug("Answer wants $answer");
! 701: my $truename = $truelist[$whichtrue];
! 702: my $dosplice = 1;
! 703: if ( ($notrue)
! 704: && ( $Apache::lonhomework::type ne 'survey' )
! 705: && ( $Apache::lonhomework::type ne 'surveycred' )
! 706: && ( $Apache::lonhomework::type ne 'anonsurvey' )
! 707: && ( $Apache::lonhomework::type ne 'anonsurveycred' ) )
! 708: {
! 709: $dosplice = 0;
! 710: &Apache::lonxml::error(
! 711: &mt('There are no true statements available.') . '<br />' );
! 712: }
! 713:
! 714: #insert the true statement, keeping track of where it wants to be
! 715: if ( $Apache::response::foilgroup{ $truename . '.location' } eq 'top'
! 716: && $dosplice )
! 717: {
! 718: $toplist[ $top{$truename} ] = $truename;
! 719: $answer = -1;
! 720: foreach my $top ( reverse(@toplist) ) {
! 721: if ($top) { $answer++; }
! 722: if ( $top eq $truename ) { last; }
! 723: }
! 724: $dosplice = 0;
! 725: }
! 726: elsif (
! 727: $Apache::response::foilgroup{ $truename . '.location' } eq 'bottom'
! 728: && $dosplice )
! 729: {
! 730: $bottomlist[ $bottom{$truename} ] = $truename;
! 731: $answer = -1;
! 732: foreach my $bot (@bottomlist) {
! 733: if ($bot) { $answer++; }
! 734: if ( $bot eq $truename ) { last; }
! 735: }
! 736: $answer += $topcount + $#whichfalse + 1;
! 737: $dosplice = 0;
! 738: }
! 739: else {
! 740: if ( $topcount > 0 || $bottomcount > 0 ) {
1.150 raeburn 741: my $inc = 1;
1.153 ! foxr 742: if ( ( $bottomcount > 0 )
! 743: && ( $Apache::lonhomework::type ne 'exam' ) )
! 744: {
1.150 raeburn 745: $inc = 2;
746: }
1.153 ! foxr 747: $answer = int(
! 748: &Math::Random::random_uniform() * ( $#whichfalse + $inc ) )
! 749: + $topcount;
! 750: }
! 751: }
! 752: &Apache::lonxml::debug("Answer now wants $answer");
! 753:
! 754: #add the top items to the top, bottom items to the bottom
! 755: for ( my $i = 0 ; $i <= $#toplist ; $i++ ) {
! 756: if ( $toplist[$i] ) { unshift( @whichfalse, $toplist[$i] ) }
! 757: }
! 758: for ( my $i = 0 ; $i <= $#bottomlist ; $i++ ) {
! 759: if ( $bottomlist[$i] ) { push( @whichfalse, $bottomlist[$i] ) }
! 760: }
! 761:
! 762: #if the true statement is randomized insert it into the list
! 763: if ($dosplice) {
! 764: splice( @whichfalse, $answer, 0, $truelist[$whichtrue] );
! 765: }
1.49 albertel 766: }
1.83 albertel 767: &Apache::lonxml::debug("Answer is $answer");
1.153 ! foxr 768: return ( $answer, @whichfalse );
1.28 albertel 769: }
770:
771: sub displayfoils {
1.153 ! foxr 772: my ( $target, $answer, $whichfoils, $direction, $bubbles_per_line ) = @_;
1.83 albertel 773: my $result;
1.28 albertel 774:
1.153 ! foxr 775: my $part = $Apache::inputtags::part;
! 776: my $solved = $Apache::lonhomework::history{"resource.$part.solved"};
! 777: if ( ( $target ne 'tex' )
! 778: && &Apache::response::show_answer() )
! 779: {
! 780: if ( $direction eq 'horizontal' ) {
! 781: if ( $target ne 'tex' ) {
! 782: $result .= '<table><tr>';
! 783: }
! 784: }
! 785: foreach my $name ( @{$whichfoils} ) {
! 786: if ( $direction eq 'horizontal' ) {
! 787: if ( $target ne 'tex' ) { $result .= '<td>'; }
! 788: }
! 789: if ( $target ne 'tex' ) {
! 790: $result .= "<br />";
! 791: }
! 792: else {
! 793: $result .= '\item \vskip -2 mm ';
! 794: }
! 795: if ( $Apache::response::foilgroup{ $name . '.value' } eq 'true' ) {
! 796: if ( $target ne 'tex' ) {
! 797: $result .= &mt('Correct:') . '<b>';
! 798: }
! 799: else {
! 800: $result .= &mt('Correct:') . ' \textbf{';
! 801: }
! 802: }
! 803: else {
! 804: $result .= &mt('Incorrect:');
! 805: }
! 806: if ( $target eq 'web' ) { $result .= "<label>"; }
! 807: $result .= $Apache::response::foilgroup{ $name . '.text' };
! 808: if ( $target eq 'web' ) { $result .= "</label>"; }
! 809: if ( $Apache::response::foilgroup{ $name . '.value' } eq 'true' ) {
! 810: if ( $target ne 'tex' ) { $result .= '</b>'; }
! 811: else { $result .= '}'; }
! 812: }
! 813: if ( $direction eq 'horizontal' ) {
! 814: if ( $target ne 'tex' ) { $result .= '</td>'; }
! 815: }
! 816: }
! 817: if ( $direction eq 'horizontal' ) {
! 818: if ( $target ne 'tex' ) {
! 819: $result .= '</tr></table>';
! 820: }
! 821: }
! 822: }
! 823: else {
! 824: my @alphabet = ( 'A' .. 'Z' );
! 825: my $i = 0;
! 826: my $bubble_number = 0;
! 827: my $line = 0;
! 828: my $temp = 0;
! 829: my $id = $Apache::inputtags::response['-1'];
! 830: my $part = $Apache::inputtags::part;
! 831: my ( $lastresponse, $newvariation );
! 832:
! 833: if (
! 834: (
! 835: (
! 836: $Apache::lonhomework::history{"resource.$part.type"} eq
! 837: 'randomizetry'
! 838: )
! 839: || ( $Apache::lonhomework::type eq 'randomizetry' )
! 840: )
! 841: && ( $Apache::inputtags::status[-1] eq 'CAN_ANSWER' )
! 842: )
! 843: {
! 844:
! 845: if ( $env{ 'form.' . $part . '.rndseed' } ne
! 846: $Apache::lonhomework::history{"resource.$part.rndseed"} )
! 847: {
1.147 raeburn 848: $newvariation = 1;
849: }
850: }
851: unless ($newvariation) {
1.153 ! foxr 852: $lastresponse =
! 853: $Apache::lonhomework::history{"resource.$part.$id.submission"};
! 854: }
! 855: my %lastresponse = &Apache::lonnet::str2hash($lastresponse);
! 856: if ( $target ne 'tex' && $direction eq 'horizontal' ) {
! 857: $result .= "<table><tr>";
1.147 raeburn 858: }
1.151 raeburn 859: my $numlines;
1.153 ! foxr 860: if ( ( $target eq 'tex' ) && ( $Apache::lonhomework::type eq 'exam' ) )
! 861: {
! 862: my $numitems = scalar( @{$whichfoils} );
! 863: $numlines = int( $numitems / $bubbles_per_line );
! 864: if ( ( $numitems % $bubbles_per_line ) != 0 ) {
! 865: $numlines++;
1.151 raeburn 866: }
1.153 ! foxr 867: if ( $numlines < 1 ) {
1.151 raeburn 868: $numlines = 1;
869: }
1.153 ! foxr 870: if ( $numlines > 1 ) {
1.151 raeburn 871: my $linetext;
1.153 ! foxr 872: for ( my $i = 0 ; $i < $numlines ; $i++ ) {
! 873: $linetext .= $Apache::lonxml::counter + $i . ', ';
1.151 raeburn 874: }
875: $linetext =~ s/,\s$//;
1.153 ! foxr 876: $result .=
! 877: '\item[\small {\textbf{'
! 878: . $linetext . '}}]'
! 879: . ' {\footnotesize '
! 880: . &mt( '(Bubble once in [_1] lines)', $numlines )
! 881: . '} \hspace*{\fill} \\\\';
! 882: }
! 883: else {
! 884: $result .= '\item[\textbf{' . $Apache::lonxml::counter . '}.]';
! 885: }
! 886: }
! 887: foreach my $name ( @{$whichfoils} ) {
! 888: if ( $target ne 'tex' ) {
! 889: if ( $direction eq 'horizontal' ) {
! 890: $result .= "<td>";
! 891: }
! 892: else {
! 893: $result .= "<br />";
! 894: }
! 895: }
! 896: if ( $target ne 'tex' ) {
! 897: $result .= '<label>';
! 898: $result .= "<input type=\"radio\"
1.113 albertel 899: onchange=\"javascript:setSubmittedPart('$part');\"
900: name=\"HWVAL_$Apache::inputtags::response['-1']\"
1.142 bisitz 901: value=\"$temp\"";
1.153 ! foxr 902: if ( defined( $lastresponse{$name} ) ) {
! 903: $result .= ' checked="checked"';
! 904: }
! 905: $result .= ' />'
! 906: . $Apache::response::foilgroup{ $name . '.text' }
! 907: . "</label>";
! 908: }
! 909: else {
! 910: if ( $Apache::lonhomework::type eq 'exam' ) {
! 911: if ( $bubble_number >= $bubbles_per_line ) {
! 912: $line++;
! 913: $i = 0;
! 914: $bubble_number = 0;
! 915: }
1.151 raeburn 916: my $identifier;
1.153 ! foxr 917: if ( $numlines > 1 ) {
! 918: $identifier = $Apache::lonxml::counter + $line;
! 919: }
! 920: $result .=
! 921: '{\small \textbf{'
! 922: . $identifier
! 923: . $alphabet[$i]
! 924: . '}}$\bigcirc$'
! 925: . $Apache::response::foilgroup{ $name . '.text' }
! 926: . '\\\\'; #' stupid emacs
! 927: $i++;
! 928: $bubble_number++;
! 929: }
! 930: else {
! 931: if ( $env{'form.pdfFormFields'} eq 'yes'
! 932: && $Apache::inputtags::status[-1] eq 'CAN_ANSWER' )
! 933: {
! 934: my $fieldname =
! 935: $env{'request.symb'}
! 936: . '&part_'
! 937: . $Apache::inputtags::part
! 938: . '&radiobuttonresponse'
! 939: . '&HWVAL_'
! 940: . $Apache::inputtags::response['-1'];
! 941: $result .= '\item[{'
! 942: . &Apache::lonxml::print_pdf_radiobutton( $fieldname,
! 943: $temp )
! 944: . '}]'
! 945: . $Apache::response::foilgroup{ $name . '.text' }
! 946: . "\n";
! 947: }
! 948: else {
! 949: $result .= '\vspace*{-2 mm}\item '
! 950: . $Apache::response::foilgroup{ $name . '.text' };
1.151 raeburn 951: }
1.153 ! foxr 952: }
! 953: }
! 954: if ( $target ne 'tex' && $direction eq 'horizontal' ) {
! 955: $result .= "</td>";
! 956: }
! 957: $temp++;
! 958: }
! 959: if ( $target ne 'tex' && $direction eq 'horizontal' ) {
! 960: $result .= "</tr></table>";
! 961: }
! 962: }
! 963: if ( $target ne 'tex' ) {
! 964: if ( $direction ne 'horizontal' ) { $result .= "<br />"; }
1.83 albertel 965: }
1.153 ! foxr 966: else { $result .= '\vskip 0 mm '; }
1.83 albertel 967: return $result;
1.81 albertel 968: }
969:
970: sub displayallanswers {
1.106 albertel 971: my @names;
972: if ( $Apache::response::foilgroup{'names'} ) {
1.153 ! foxr 973: @names = @{ $Apache::response::foilgroup{'names'} };
1.106 albertel 974: }
1.153 ! foxr 975: my $result = &Apache::response::answer_header('radiobuttonresponse');
1.81 albertel 976: foreach my $name (@names) {
1.153 ! foxr 977: $result .=
! 978: &Apache::response::answer_part( 'radiobuttonresponse',
! 979: $Apache::response::foilgroup{ $name . '.value' } );
1.81 albertel 980: }
1.153 ! foxr 981: $result .= &Apache::response::answer_footer('radiobuttonresponse');
1.81 albertel 982: return $result;
1.14 albertel 983: }
984:
1.28 albertel 985: sub displayanswers {
1.153 ! foxr 986: my ( $answer, $whichopt, $bubbles_per_line ) = @_;
1.124 albertel 987: my $result;
988:
1.153 ! foxr 989: if ( $Apache::lonhomework::type eq 'exam' ) {
! 990: my $line = int( $answer / $bubbles_per_line );
! 991: my $correct = ( 'A' .. 'Z' )[ $answer % $bubbles_per_line ];
! 992: $result .=
! 993: &Apache::response::answer_header( 'radiobuttonresponse', $line );
! 994: $result .=
! 995: &Apache::response::answer_part( 'radiobuttonresponse', $correct );
! 996: }
! 997: else {
! 998: $result .= &Apache::response::answer_header('radiobuttonresponse');
! 999: }
! 1000: foreach my $name ( @{$whichopt} ) {
! 1001: $result .=
! 1002: &Apache::response::answer_part( 'radiobuttonresponse',
! 1003: $Apache::response::foilgroup{ $name . '.value' } );
1.105 albertel 1004: }
1.153 ! foxr 1005: $result .= &Apache::response::answer_footer('radiobuttonresponse');
1.83 albertel 1006: return $result;
1.28 albertel 1007: }
1008:
1.14 albertel 1009: sub start_conceptgroup {
1.153 ! foxr 1010: my ( $target, $token, $tagstack, $parstack, $parser, $safeeval, $style ) =
! 1011: @_;
! 1012: $Apache::radiobuttonresponse::conceptgroup = 1;
! 1013: %Apache::response::conceptgroup = ();
1.83 albertel 1014: my $result;
1.153 ! foxr 1015: if ( $target eq 'edit' ) {
! 1016: $result .= &Apache::edit::tag_start( $target, $token );
! 1017: $result .=
! 1018: &Apache::edit::text_arg( 'Concept:', 'concept', $token, '50' )
! 1019: . &Apache::edit::end_row()
! 1020: . &Apache::edit::start_spanning_row();
! 1021: }
! 1022: elsif ( $target eq 'modified' ) {
! 1023: my $constructtag =
! 1024: &Apache::edit::get_new_args( $token, $parstack, $safeeval,
! 1025: 'concept' );
! 1026: if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
1.83 albertel 1027: }
1028: return $result;
1.14 albertel 1029: }
1030:
1031: sub end_conceptgroup {
1.153 ! foxr 1032: my ( $target, $token, $tagstack, $parstack, $parser, $safeeval, $style ) =
! 1033: @_;
! 1034: $Apache::radiobuttonresponse::conceptgroup = 0;
1.83 albertel 1035: my $result;
1.153 ! foxr 1036: if ( $target eq 'web'
! 1037: || $target eq 'grade'
! 1038: || $target eq 'answer'
! 1039: || $target eq 'tex'
! 1040: || $target eq 'analyze' )
! 1041: {
! 1042: &Apache::response::pick_foil_for_concept( $target,
! 1043: [ 'value', 'text', 'location' ],
! 1044: \%Apache::hint::radiobutton, $parstack, $safeeval );
! 1045: }
! 1046: elsif ( $target eq 'edit' ) {
! 1047: $result = &Apache::edit::end_table();
1.83 albertel 1048: }
1049: return $result;
1.26 albertel 1050: }
1051:
1052: sub insert_conceptgroup {
1.153 ! foxr 1053: my $result =
! 1054: "\n\t\t<conceptgroup concept=\"\">"
! 1055: . &insert_foil()
! 1056: . "\n\t\t</conceptgroup>\n";
1.83 albertel 1057: return $result;
1.1 albertel 1058: }
1059:
1060: sub start_foil {
1.153 ! foxr 1061: my ( $target, $token, $tagstack, $parstack, $parser, $safeeval, $style ) =
! 1062: @_;
! 1063: my $result = '';
! 1064: if ( $target eq 'web' || $target eq 'tex' || $target eq 'analyze' ) {
! 1065: &Apache::lonxml::startredirection;
! 1066: if ( $target eq 'analyze' ) {
! 1067: &Apache::response::check_if_computed( $token, $parstack, $safeeval,
! 1068: 'value' );
! 1069: }
! 1070: }
! 1071: elsif ( $target eq 'edit' ) {
! 1072: $result = &Apache::edit::tag_start( $target, $token );
! 1073: $result .= &Apache::edit::text_arg( 'Name:', 'name', $token );
! 1074: $result .= &Apache::edit::select_or_text_arg(
! 1075: 'Correct Option:', 'value',
! 1076: [ 'unused', 'true', 'false' ], $token
! 1077: );
! 1078: my $randomize =
! 1079: &Apache::lonxml::get_param( 'randomize', $parstack, $safeeval, '-3' );
! 1080: if ( $randomize ne 'no' ) {
! 1081: $result .=
! 1082: &Apache::edit::select_arg( 'Location:', 'location',
! 1083: [ 'random', 'top', 'bottom' ], $token );
! 1084: }
! 1085: $result .=
! 1086: &Apache::edit::end_row() . &Apache::edit::start_spanning_row();
! 1087: }
! 1088: elsif ( $target eq 'modified' ) {
! 1089: my $constructtag =
! 1090: &Apache::edit::get_new_args( $token, $parstack, $safeeval, 'value',
! 1091: 'name', 'location' );
! 1092: if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
! 1093: }
1.83 albertel 1094: return $result;
1.1 albertel 1095: }
1096:
1097: sub end_foil {
1.153 ! foxr 1098: my ( $target, $token, $tagstack, $parstack, $parser, $safeeval, $style ) =
! 1099: @_;
! 1100: my $text = '';
! 1101: if ( $target eq 'web' || $target eq 'tex' || $target eq 'analyze' ) {
! 1102: $text = &Apache::lonxml::endredirection;
! 1103: }
! 1104: if ( $target eq 'web'
! 1105: || $target eq 'grade'
! 1106: || $target eq 'answer'
! 1107: || $target eq 'tex'
! 1108: || $target eq 'analyze' )
! 1109: {
! 1110: my $value = &Apache::lonxml::get_param( 'value', $parstack, $safeeval );
! 1111: if ( $value ne 'unused' ) {
! 1112: my $name =
! 1113: &Apache::lonxml::get_param( 'name', $parstack, $safeeval );
! 1114: if ( $name eq "" ) {
! 1115: &Apache::lonxml::warning(
! 1116: &mt(
! 1117: 'Foils without names exist. This can cause problems to malfunction.'
! 1118: )
! 1119: );
! 1120: $name = $Apache::lonxml::curdepth;
! 1121: }
! 1122: if ( defined( $Apache::response::foilnames{$name} ) ) {
! 1123: &Apache::lonxml::error(
! 1124: &mt(
! 1125: 'Foil name [_1] appears more than once. Foil names need to be unique.',
! 1126: '<b><tt>' . $name . '</tt></b>'
! 1127: )
! 1128: );
! 1129: }
! 1130: $Apache::response::foilnames{$name}++;
! 1131: my $location =
! 1132: &Apache::lonxml::get_param( 'location', $parstack, $safeeval );
! 1133: if ( $Apache::radiobuttonresponse::conceptgroup
! 1134: && !&Apache::response::showallfoils() )
! 1135: {
! 1136: push @{ $Apache::response::conceptgroup{'names'} }, $name;
! 1137: $Apache::response::conceptgroup{"$name.value"} = $value;
! 1138: $Apache::response::conceptgroup{"$name.text"} = $text;
! 1139: $Apache::response::conceptgroup{"$name.location"} = $location;
! 1140: }
! 1141: else {
! 1142: push @{ $Apache::response::foilgroup{'names'} }, $name;
! 1143: $Apache::response::foilgroup{"$name.value"} = $value;
! 1144: $Apache::response::foilgroup{"$name.text"} = $text;
! 1145: $Apache::response::foilgroup{"$name.location"} = $location;
! 1146: }
! 1147: }
1.18 albertel 1148: }
1.83 albertel 1149: return '';
1.1 albertel 1150: }
1151:
1.27 albertel 1152: sub insert_foil {
1.83 albertel 1153: return '
1.27 albertel 1154: <foil name="" value="unused">
1155: <startouttext />
1156: <endouttext />
1157: </foil>';
1158: }
1.151 raeburn 1159:
1.1 albertel 1160: 1;
1161: __END__
1.139 jms 1162:
1163:
1164:
1165: =head1 NAME
1166:
1167: Apache::radiobuttonresponse
1168:
1169: =head1 SYNOPSIS
1170:
1171: Handles multiple-choice style responses.
1172:
1173: This is part of the LearningOnline Network with CAPA project
1174: described at http://www.lon-capa.org.
1175:
1176: =head1 SUBROUTINES
1177:
1178: =over
1179:
1180: =item start_radiobuttonresponse()
1181:
1182: =item bubble_line_count()
1183:
1184: =item end_radiobuttonresponse()
1185:
1186: =item start_foilgroup()
1187:
1188: =item storesurvey()
1189:
1190: =item grade_response()
1191:
1192: =item end_foilgroup()
1193:
1194: =item getfoilcounts()
1195:
1196: =item format_prior_answer()
1197:
1198: =item displayallfoils()
1199:
1200: =item &whichfoils($max,$randomize)
1201:
1202: Randomizes the list of foils.
1203: Respects
1204: - each foils desire to be randomized
1205: - the existance of Concept groups of foils (select 1 foil from each)
1206: - and selects a single correct statement from all possilble true statments
1207: - and limits it to a toal of $max foils
1208:
1209: WARNING: this routine uses the random number generator, it should only
1210: be called once per target, otherwise it can cause randomness changes in
1211: homework problems.
1212:
1213: Arguments
1214: $max - maximum number of foils to select (including the true one)
1215: (so a max of 5 is: 1 true, 4 false)
1216:
1217: $randomize - whether to randomize the listing of foils, by default
1218: will randomize, only if randomize is 'no' will it not
1219:
1220: Returns
1221: $answer - location in the array of the correct answer
1222: @foils - array of foil names in to display order
1223:
1224: =item displayfoils()
1225:
1226: =item displayallanswers()
1227:
1228: =item displayanswers()
1229:
1230: =item start_conceptgroup()
1231:
1232: =item end_conceptgroup()
1233:
1234: =item insert_conceptgroup()
1235:
1236: =item start_foil()
1237:
1238: =item end_foil()
1239:
1240: =item insert_foil()
1241:
1242: =back
1243:
1244: =cut
1.1 albertel 1245:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>