![]() ![]() | ![]() |
Replaced Edit Answer button by pencil icon.
1: # The LearningOnline Network with CAPA 2: # chemical equation style response 3: # 4: # $Id: chemresponse.pm,v 1.80 2008/09/05 20:23:57 riegler Exp $ 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 21: # along with LON-CAPA; if not, write to the Free Software 22: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 23: # 24: # /home/httpd/html/adm/gpl.txt 25: # 26: # http://www.lon-capa.org/ 27: # 28: # 29: package Apache::chemresponse; 30: use strict; 31: use Apache::lonxml; 32: use Apache::lonnet; 33: use Apache::lonlocal; 34: use lib '/home/httpd/lib/perl/'; 35: use LONCAPA; 36: 37: 38: BEGIN { 39: &Apache::lonxml::register('Apache::chemresponse',('organicresponse','organicstructure','reactionresponse','chem')); 40: } 41: 42: sub chem_standard_order { 43: my ($reaction) = @_; 44: my ($re,$pr) = split(/->|<=>/,$reaction); 45: my @reactants = split(/\s\+/,$re); 46: my @products = split(/\s\+/,$pr); 47: foreach my $substance (@reactants,@products) { 48: $substance =~ s/(\^\d*)\s+/$1_/g; # protect superscript space 49: $substance =~ s/\s*//g; # strip whitespace 50: $substance =~ s/_/ /g; # restore superscript space 51: } 52: @reactants = sort @reactants; 53: @products = sort @products; 54: my $standard = ''; 55: foreach my $substance (@reactants) { 56: $standard .= $substance; 57: $standard .= ' + '; 58: } 59: $standard =~ s/ \+ $//; # get rid of trailing plus sign 60: $standard .= ' -> '; 61: foreach my $substance (@products) { 62: $standard .= $substance; 63: $standard .= ' + '; 64: } 65: $standard =~ s/ \+ $//; # get rid of trailing plus sign 66: return $standard; 67: } 68: 69: sub separate_jme_window { 70: my ($smile_input,$jme_input,$molecule,$options,$shown_text)=@_; 71: my $smilesection; 72: if (defined($smile_input)) { 73: $smilesection=<<SMILESECTION; 74: smiles = document.applets.JME.smiles(); 75: opener.document.lonhomework.$smile_input.value = smiles; 76: SMILESECTION 77: } 78: my $jmesection; 79: if (defined($jme_input)) { 80: $jmesection=<<JMESECTION; 81: jmeFile = document.applets.JME.jmeFile(); 82: opener.document.lonhomework.$jme_input.value = jmeFile; 83: JMESECTION 84: } 85: 86: if ($molecule) { $molecule='<param name="jme" value="'.$molecule.'" />'; } 87: my $insert_answer; 88: if ($shown_text eq '') { 89: $insert_answer= 90: '<input type="button" name="submit" value="Insert Answer" onclick="javascript:submitSmiles();" />'; 91: } 92: 93: my $js = <<CHEMJS; 94: <script type="text/javascript"> 95: function submitSmiles() { 96: jmeFile = document.applets.JME.jmeFile(); 97: if (jmeFile == "") { 98: alert("Nothing to submit"); 99: } else { 100: $jmesection 101: $smilesection 102: window.close(); 103: } 104: } 105: function openHelpWindow() { 106: window.open("/adm/jme/jme_help.html","","scrollbars=yes,resizable=yes,width=500,height=600"); 107: } 108: function substituent(r) {document.applets.JME.setSubstituent(r);} 109: </script> 110: CHEMJS 111: 112: my $start_page = 113: &Apache::loncommon::start_page('Molecule Editor',undef, 114: {'only_body' => 1, 115: 'js_ready' => 1, 116: 'bgcolor' => '#FFFFFF',}); 117: my $end_page = 118: &Apache::loncommon::end_page({'js_ready' => 1,}); 119: 120: my $body=<<CHEMPAGE; 121: $js 122: <center> 123: <form> 124: <table width="440"><tr> 125: <td></td> 126: <td align="right"> 127: <select onchange="javascript:substituent(options[selectedIndex].text)"> 128: <option>Select substituent</option> 129: <option>-C(=O)OH</option> 130: <option>-C(=O)OMe</option> 131: <option>-OC(=O)Me</option> 132: <option>-CMe3</option> 133: <option>-CF3</option> 134: <option>-CCl3</option> 135: <option>-NO2</option> 136: <option>-SO2-NH2</option> 137: <option>-NH-SO2-Me</option> 138: <option>-NMe2</option> 139: <option>-C#N</option> 140: <option>-C#C-Me</option> 141: <option>-C#CH</option> 142: </select> 143: </td></tr> 144: </table> 145: <applet code="JME.class" name="JME" archive="/adm/jme/JME.jar" width="440" height="390" mayscript> 146: You have to enable Java and JavaScript on your machine. 147: $molecule 148: <param name="options" value="$options" /> 149: </applet><br /> 150: <font face="arial,helvetica,sans-serif" size="-1"><a href="http://www.molinspiration.com/jme/index.html">JME Editor</a> courtesy of Peter Ertl, Novartis</font> 151: <br /> 152: $insert_answer 153: <br /> 154: <input type="button" value=" Close " onclick = "javascript:window.close()" /> 155: 156: <input type="button" value=" Help " onclick = "javascript:openHelpWindow()" /> 157: </form> 158: </center> 159: CHEMPAGE 160: 161: $body=&Apache::loncommon::js_ready($body); 162: my $nothing=&Apache::lonhtmlcommon::javascript_nothing(); 163: my $docopen=&Apache::lonhtmlcommon::javascript_docopen(); 164: my $display=&mt('Draw Molecule'); 165: if (defined($shown_text)) { $display=&mt($shown_text); } 166: my $iconpath=$Apache::lonnet::perlvar{'lonIconsURL'}; 167: my $function = 168: 'LONCAPA_draw_molecule_'.&Apache::lonhtmlcommon::get_uniq_name(); 169: my $result=<<CHEMINPUT; 170: <script type="text/javascript"> 171: function $function() { 172: editor=window.open($nothing,'jmeedit','width=500,height=500,menubar=no,scrollbars=no,resizable=yes'); 173: editor.$docopen; 174: editor.document.write('$start_page $body $end_page'); 175: editor.document.close(); 176: editor.focus(); 177: } 178: </script> 179: <a href="javascript:$function();void(0);"><img class="stift" src='$iconpath/stift.gif' alt='$display' title='$display' /></a> 180: CHEMINPUT 181: return $result; 182: } 183: sub jme_img { 184: my ($jme,$smile,$width,$options)=@_; 185: my $id=&Apache::loncommon::get_cgi_id(); 186: my $result='<img alt="'.$smile.'" src="/cgi-bin/convertjme.pl?'.$id.'"'; 187: if ($options =~ /border/) { $result.= ' border="1"'; } 188: $result.=' />'; 189: &Apache::lonnet::appenv({'cgi.'.$id.'.JME' => 190: &escape($jme), 191: 'cgi.'.$id.'.PNG' => 1, 192: 'cgi.'.$id.'.WIDTH' => $width}); 193: return $result; 194: } 195: 196: sub start_organicresponse { 197: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; 198: my $result; 199: my $partid = $Apache::inputtags::part; 200: my $id = &Apache::response::start_response($parstack,$safeeval); 201: if ($target eq 'meta') { 202: $result=&Apache::response::meta_package_write('organicresponse'); 203: } elsif ($target eq 'web') { 204: my $jmeanswer=&Apache::lonxml::get_param('jmeanswer',$parstack, 205: $safeeval); 206: if ( &Apache::response::show_answer() && $jmeanswer ne '') { 207: my $options=&Apache::lonxml::get_param('options',$parstack, 208: $safeeval); 209: my $width=&Apache::lonxml::get_param('width',$parstack, 210: $safeeval); 211: my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack, 212: $safeeval); 213: $result.=&jme_img($jmeanswer,$answers[0],$width,$options); 214: } else { 215: my $molecule; 216: if (defined($Apache::lonhomework::history{"resource.$partid.$id.molecule"})) { 217: $molecule=$Apache::lonhomework::history{"resource.$partid.$id.molecule"}; 218: } else { 219: $molecule=&Apache::lonxml::get_param('molecule',$parstack, 220: $safeeval); 221: } 222: my $options=&Apache::lonxml::get_param('options',$parstack, 223: $safeeval); 224: my $shown_text; 225: if (&Apache::response::show_answer()) { 226: $shown_text="Show Your Last Answer"; 227: } 228: #stift $result=&separate_jme_window("HWVAL_$id","MOLECULE_$id",$molecule, 229: # $options,$shown_text); 230: $result.= '<input type="hidden" name="MOLECULE_'.$id.'" value="" />'; 231: } 232: } elsif ($target eq 'edit') { 233: $result .=&Apache::edit::tag_start($target,$token); 234: my $options=&Apache::lonxml::get_param('options',$parstack, 235: $safeeval); 236: if ($options !~ /multipart/) { $options.=',multipart'; } 237: $result .='<nobr>'. 238: &Apache::edit::text_arg('Starting Molecule:','molecule', 239: $token,40); 240: my $molecule=&Apache::lonxml::get_param('molecule',$parstack, 241: $safeeval); 242: $result .=&separate_jme_window(undef, 243: &Apache::edit::html_element_name('molecule'), 244: $molecule,$options); 245: $result .='</nobr><br /><nobr>'; 246: $result .=&Apache::edit::text_arg('Correct Answer:','answer', 247: $token,40); 248: $result .='</nobr><br /><nobr>'; 249: $result .=&Apache::edit::text_arg('JME string of the answer (automatically updated when using the Draw Molecule button):', 250: 'jmeanswer',$token); 251: my $jmeanswer=&Apache::lonxml::get_param('jmeanswer',$parstack, 252: $safeeval); 253: $result .=&separate_jme_window( 254: &Apache::edit::html_element_name('answer'), 255: &Apache::edit::html_element_name('jmeanswer'), 256: $jmeanswer,$options); 257: $result .='</nobr><br />'; 258: $result .=&Apache::edit::checked_arg('Options:','options', 259: [ ['autoez','Auto E,Z stereochemistry'], 260: ['multipart','Multipart Structures'], 261: ['nostereo','No stereochemistry'], 262: ['reaction','Is a reaction'], 263: ['number','Able to number atoms'] ], 264: ,$token); 265: $result .=&Apache::edit::text_arg('Width of correct answer image:', 266: 'width',$token,10); 267: $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row(); 268: } elsif ($target eq 'modified') { 269: my $constructtag=&Apache::edit::get_new_args($token,$parstack, 270: $safeeval,'molecule', 271: 'answer','jmeanswer', 272: 'options','width'); 273: if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } 274: } 275: 276: return $result; 277: } 278: 279: sub end_organicresponse { 280: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; 281: my $result; 282: 283: my $partid = $Apache::inputtags::part; 284: my $id = $Apache::inputtags::response['-1']; 285: 286: if ($target eq 'grade' 287: && &Apache::response::submitted() 288: && $Apache::lonhomework::type eq 'exam') { 289: 290: &Apache::response::scored_response($partid,$id); 291: 292: } elsif ($target eq 'grade' 293: && &Apache::response::submitted() 294: && $Apache::lonhomework::type ne 'exam') { 295: 296: &Apache::response::setup_params($$tagstack[-1],$safeeval); 297: my $response = &Apache::response::getresponse(); 298: if ( $response =~ /[^\s]/) { 299: my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval); 300: my %previous = &Apache::response::check_for_previous($response,$partid,$id); 301: $Apache::lonhomework::results{"resource.$partid.$id.submission"}=$response; 302: my $ad; 303: foreach my $answer (@answers) { 304: &Apache::lonxml::debug("submitted a $response for $answer<br \>\n"); 305: if ($response eq $answer) { 306: $ad='EXACT_ANS'; 307: last; 308: } else { 309: $ad='INCORRECT'; 310: } 311: } 312: if ($ad && $Apache::lonhomework::type eq 'survey') { 313: $ad='SUBMITTED'; 314: } 315: &Apache::response::handle_previous(\%previous,$ad); 316: $Apache::lonhomework::results{"resource.$partid.$id.awarddetail"}=$ad; 317: $Apache::lonhomework::results{"resource.$partid.$id.molecule"}=$env{"form.MOLECULE_$id"}; 318: } 319: } elsif ($target eq "edit") { 320: $result.= &Apache::edit::tag_end($target,$token,''); 321: } elsif ($target eq 'answer') { 322: my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack, 323: $safeeval); 324: $result.=&Apache::response::answer_header('organicresponse'); 325: foreach my $answer (@answers) { 326: $result.=&Apache::response::answer_part('organicresponse',$answer); 327: } 328: $result.=&Apache::response::answer_footer('organicresponse'); 329: } 330: if ($target eq 'web') { 331: &Apache::response::setup_prior_tries_hash(\&format_prior_answer_organic, 332: ['molecule']) 333: } 334: 335: if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || 336: $target eq 'tex' || $target eq 'analyze') { 337: &Apache::lonxml::increment_counter(&Apache::response::repetition(), 338: "$partid.$id"); # part.response 339: if ($target eq 'analyze') { 340: $Apache::lonhomework::analyze{"$partid.$id.type"} = 'organicresponse'; 341: &Apache::lonhomework::set_bubble_lines(); 342: } 343: } 344: if (($target eq 'web' ) && ($Apache::lonhomework::type ne 'exam') && ($Apache::inputtags::status['-1'] eq 'CAN_ANSWER')){ 345: my $options=&Apache::lonxml::get_param('options',$parstack, 346: $safeeval); 347: my $shown_text; 348: if (&Apache::response::show_answer()) { 349: $shown_text="Show Your Last Answer"; 350: } 351: my $molecule; 352: if (defined($Apache::lonhomework::history{"resource.$partid.$id.molecule"})) { 353: $molecule=$Apache::lonhomework::history{"resource.$partid.$id.molecule"}; 354: } else { 355: $molecule=&Apache::lonxml::get_param('molecule',$parstack, 356: $safeeval); 357: } 358: $result.=&separate_jme_window("HWVAL_$id","MOLECULE_$id",$molecule, 359: $options,$shown_text); 360: } 361: &Apache::response::end_response(); 362: return $result; 363: } 364: 365: sub format_prior_answer_organic { 366: my ($mode,$answer,$other_data) = @_; 367: my $result=&mt('Smile representation: "[_1]"','<tt>'.$answer.'</tt>'); 368: my $jme=$other_data->[0]; 369: $result.=&jme_img($jme,$answer,400); 370: return $result; 371: } 372: 373: sub start_organicstructure { 374: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; 375: my $result; 376: if ($target eq 'web') { 377: my $width=&Apache::lonxml::get_param('width',$parstack,$safeeval); 378: my $molecule=&Apache::lonxml::get_param('molecule',$parstack,$safeeval); 379: my $options=&Apache::lonxml::get_param('options',$parstack,$safeeval); 380: my $id=&Apache::loncommon::get_cgi_id(); 381: $result="<img src='/cgi-bin/convertjme.pl?$id'"; 382: if ($options =~ /border/) { $result.= ' border="1"'; } 383: $result.=' />'; 384: &Apache::lonnet::appenv( 385: {'cgi.'.$id.'.JME' => &escape($molecule), 386: 'cgi.'.$id.'.PNG' => 1, 387: 'cgi.'.$id.'.WIDTH' => $width}); 388: } elsif ($target eq 'tex') { 389: my $texwidth=&Apache::lonxml::get_param('texwidth',$parstack,$safeeval,undef,1); 390: my $webwidth=&Apache::lonxml::get_param('width', $parstack, $safeeval); 391: my $webheight=&Apache::lonxml::get_param('height', $parstack, $safeeval); 392: if (!$webheight) { $webheight = $webwidth; } 393: if (!$texwidth) { $texwidth='90'; } 394: $result = "%DYNAMICIMAGE:$webwidth:$webheight:$texwidth\n"; 395: my $molecule=&Apache::lonxml::get_param('molecule',$parstack,$safeeval); 396: my $options=&Apache::lonxml::get_param('options',$parstack,$safeeval); 397: my $filename = $env{'user.name'}.'_'.$env{'user.domain'}. 398: '_'.time.'_'.$$.int(rand(1000)).'_organicstructure'; 399: my $id=$filename; 400: &Apache::lonnet::appenv( 401: {'cgi.'.$id.'.JME' => &escape($molecule), 402: 'cgi.'.$id.'.PS' => 1, 403: 'cgi.'.$id.'.WIDTH' => $texwidth}); 404: $id=&escape($id); 405: &Apache::lonxml::register_ssi("/cgi-bin/convertjme.pl?$id"); 406: if ($options =~ /border/) { $result.= '\fbox{'; } 407: $result .= '\graphicspath{{/home/httpd/perl/tmp/}}\includegraphics[width='.$texwidth.' mm]{'.$filename.'.eps}'; 408: if ($options =~ /border/) { $result.= '} '; } 409: } elsif ($target eq 'edit') { 410: $result .=&Apache::edit::tag_start($target,$token); 411: $result .=&Apache::edit::text_arg('Width (pixels):','width',$token,5); 412: $result .=&Apache::edit::text_arg('TeXwidth (mm):','texwidth',$token,5); 413: $result .='<nobr>'; 414: $result .=&Apache::edit::text_arg('Molecule:','molecule',$token,40); 415: my $molecule=&Apache::lonxml::get_param('molecule',$parstack, 416: $safeeval); 417: my $options=&Apache::lonxml::get_param('options',$parstack, 418: $safeeval); 419: if ($options !~ /reaction/) { 420: $options.= ',multipart,number'; 421: } 422: 423: $result .=&separate_jme_window(undef, 424: &Apache::edit::html_element_name('molecule'), 425: $molecule,$options); 426: $result.="</nobr><br />"; 427: $result .=&Apache::edit::checked_arg('Options:','options', 428: [ ['reaction','Is a reaction'], 429: ['border','Draw a border'] ], 430: $token); 431: $result .=&Apache::edit::end_row(); 432: } elsif ($target eq 'modified') { 433: my $constructtag=&Apache::edit::get_new_args($token,$parstack, 434: $safeeval,'molecule', 435: 'width','texwidth', 436: 'options'); 437: if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } 438: } 439: return $result; 440: } 441: 442: sub end_organicstructure { 443: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; 444: my $result; 445: if ($target eq "edit") { 446: $result.= &Apache::edit::tag_end($target,$token,''); 447: } 448: return $result; 449: } 450: 451: sub edit_reaction_button { 452: my ($id,$field,$reaction)=@_; 453: my $id_es=&escape($id); 454: my $field_es=&escape($field); 455: my $reaction_es=&escape($reaction); 456: my $docopen=&Apache::lonhtmlcommon::javascript_docopen(); 457: my $iconpath=$Apache::lonnet::perlvar{'lonIconsURL'}; 458: my $display=&mt('Edit Answer'); 459: my $start_page = 460: &Apache::loncommon::start_page('LON-CAPA Reaction Editor',undef, 461: {'frameset' => 1, 462: 'js_ready' => 1, 463: 'add_entries' => { 464: 'rows' => "30%,*", 465: 'border' => "0",}},); 466: my $end_page = 467: &Apache::loncommon::end_page({'frameset' => 1, 468: 'js_ready' => 1}); 469: my $result=<<EDITREACTION; 470: <script type="text/javascript"> 471: // <!-- 472: function create_reaction_window_${id}_${field} () { 473: editor=window.open('','','width=500,height=270,scrollbars=no,resizable=yes'); 474: editor.$docopen; 475: editor.document.writeln('$start_page <frame src="/res/adm/pages/reactionresponse/reaction_viewer.html?inhibitmenu=yes" name="viewer" scrolling="no" /> <frame src="/res/adm/pages/reactionresponse/reaction_editor.html?inhibitmenu=yes&reaction=$reaction_es&id=$id_es&field=$field_es" name="editor" scrolling="no" /> $end_page'); 476: editor.document.close(); 477: } 478: // --> 479: </script> 480: <a href="javascript:create_reaction_window_${id}_${field}();void(0);"><img class="stift" src='$iconpath/stift.gif' alt='$display' title='$display' /></a> 481: EDITREACTION 482: return $result; 483: } 484: 485: sub start_reactionresponse { 486: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; 487: my $result; 488: my $id = &Apache::response::start_response($parstack,$safeeval); 489: if ($target eq 'meta') { 490: $result=&Apache::response::meta_package_write('reactionresponse'); 491: } elsif ($target eq 'web') { 492: my $partid = $Apache::inputtags::part; 493: my $id = $Apache::inputtags::response['-1']; 494: my $reaction=$Apache::lonhomework::history{"resource.$partid.$id.submission"}; 495: if ($reaction eq '') { $reaction=&Apache::lonxml::get_param('initial',$parstack,$safeeval); } 496: if ( &Apache::response::show_answer() ) { 497: my $ans=&Apache::lonxml::get_param('answer',$parstack,$safeeval); 498: if (!$Apache::lonxml::default_homework_loaded) { 499: &Apache::lonxml::default_homework_load($safeeval); 500: } 501: @Apache::scripttag::parser_env = @_; 502: $Apache::inputtags::answertxt{$id}=[&Apache::run::run("return &chemparse(q\0$ans\0);",$safeeval)]; 503: } 504: } elsif ($target eq "edit") { 505: $result .=&Apache::edit::tag_start($target,$token); 506: my $answer=&Apache::lonxml::get_param('answer',$parstack, 507: $safeeval); 508: $result .='<nobr>'. 509: &Apache::edit::text_arg('Answer:','answer',$token,40); 510: my $initial=&Apache::lonxml::get_param('initial',$parstack,$safeeval); 511: $result.='<nobr>'. 512: &Apache::edit::text_arg('Initial Reaction:','initial',$token,40); 513: 514: $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row(); 515: } elsif ($target eq 'modified') { 516: my $constructtag=&Apache::edit::get_new_args($token,$parstack, 517: $safeeval,'answer', 518: 'initial'); 519: if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } 520: } 521: return $result; 522: } 523: 524: sub end_reactionresponse { 525: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; 526: my $result; 527: 528: my $partid = $Apache::inputtags::part; 529: my $id = $Apache::inputtags::response['-1']; 530: 531: if ($target eq 'grade' 532: && &Apache::response::submitted() 533: && $Apache::lonhomework::type eq 'exam') { 534: 535: &Apache::response::scored_response($partid,$id); 536: 537: } elsif ($target eq 'grade' 538: && &Apache::response::submitted() 539: && $Apache::lonhomework::type ne 'exam') { 540: 541: &Apache::response::setup_params($$tagstack[-1],$safeeval); 542: my $response = &Apache::response::getresponse(); 543: if ( $response =~ /[^\s]/) { 544: my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval); 545: my %previous = &Apache::response::check_for_previous($response,$partid,$id); 546: $Apache::lonhomework::results{"resource.$partid.$id.submission"}=$response; 547: my $ad; 548: foreach my $answer (@answers) { 549: &Apache::lonxml::debug("submitted a $response for $answer<br \>\n"); 550: if (&chem_standard_order($response) eq 551: &chem_standard_order($answer)) { 552: $ad='EXACT_ANS'; 553: } else { 554: $ad='INCORRECT'; 555: } 556: } 557: if ($ad && $Apache::lonhomework::type eq 'survey') { 558: $ad='SUBMITTED'; 559: } 560: &Apache::response::handle_previous(\%previous,$ad); 561: $Apache::lonhomework::results{"resource.$partid.$id.awarddetail"}=$ad; 562: } 563: } elsif ($target eq "edit") { 564: $result.= &Apache::edit::tag_end($target,$token,''); 565: } elsif ($target eq 'answer') { 566: my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack, 567: $safeeval); 568: $result.=&Apache::response::answer_header('reactionresponse'); 569: foreach my $answer (@answers) { 570: $result.=&Apache::response::answer_part('reactionresponse', 571: $answer); 572: } 573: $result.=&Apache::response::answer_footer('reactionresponse'); 574: } 575: if ($target eq 'web') { 576: &Apache::response::setup_prior_tries_hash(\&format_prior_response_reaction); 577: } 578: 579: if ($target eq 'grade' || $target eq 'web' || $target eq 'answer' || 580: $target eq 'tex' || $target eq 'analyze') { 581: &Apache::lonxml::increment_counter(&Apache::response::repetition(), "$partid.$id"); 582: if ($target eq 'analyze') { 583: $Apache::lonhomework::analyze{"$partid.$id.type"} = 'reactionresponse'; 584: &Apache::lonhomework::set_bubble_lines(); 585: } 586: } 587: my $status=$Apache::inputtags::status['-1']; 588: if (($target eq 'web') && ($Apache::lonhomework::type ne 'exam') && ($status eq 'CAN_ANSWER')) { 589: my $partid = $Apache::inputtags::part; 590: my $id = $Apache::inputtags::response['-1']; 591: my $reaction=$Apache::lonhomework::history{"resource.$partid.$id.submission"}; 592: $result.=&edit_reaction_button($id,"HWVAL_$id",$reaction); 593: 594: } 595: &Apache::response::end_response(); 596: return $result; 597: } 598: 599: sub format_prior_response_reaction { 600: my ($mode,$answer) =@_; 601: return '<span class="LC_prior_reaction">'. 602: &HTML::Entities::encode($answer,'"<>&').'</span>'; 603: } 604: 605: sub start_chem { 606: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_; 607: my $result = ''; 608: my $inside = &Apache::lonxml::get_all_text_unbalanced("/chem",$parser); 609: if ($target eq 'tex' || $target eq 'web') { 610: $inside=&Apache::run::evaluate($inside,$safeeval,$$parstack[-1]); 611: if (!$Apache::lonxml::default_homework_loaded) { 612: &Apache::lonxml::default_homework_load($safeeval); 613: } 614: @Apache::scripttag::parser_env = @_; 615: $result=&Apache::run::run("return &chemparse(q\0$inside\0);",$safeeval); 616: } 617: return $result; 618: } 619: 620: sub end_chem { 621: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_; 622: my $result = ''; 623: return $result; 624: } 625: 626: 1; 627: __END__