![]() ![]() | ![]() |
- eliminating options that don't make sense
1: # The LearningOnline Network with CAPA 2: # chemical equation style response 3: # 4: # $Id: chemresponse.pm,v 1.18 2003/10/17 22:26:38 albertel 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: 34: BEGIN { 35: &Apache::lonxml::register('Apache::chemresponse',('organicresponse','organicstructure','reactionresponse')); 36: } 37: 38: sub seperate_jme_window { 39: my ($smile_input,$jme_input,$molecule,$options)=@_; 40: my $smilesection; 41: if (defined($smile_input)) { 42: $smilesection=<<SMILESECTION; 43: opener.document.lonhomework.$smile_input.value = smiles; 44: SMILESECTION 45: } 46: my $jmesection; 47: if (defined($jme_input)) { 48: $jmesection=<<JMESECTION; 49: jmeFile = document.applets.JME.jmeFile(); 50: opener.document.lonhomework.$jme_input.value = jmeFile; 51: JMESECTION 52: } 53: 54: if ($molecule) { $molecule='<param name="jme" value="'.$molecule.'" />'; } 55: my $body=<<CHEMPAGE; 56: <html> 57: <head> 58: <title>Molecule Editor</title> 59: <script language="JavaScript"> 60: function submitSmiles() { 61: smiles = document.applets.JME.smiles(); 62: if (smiles == "") { 63: alert("Nothing to submit"); 64: } else { 65: $smilesection 66: $jmesection 67: window.close(); 68: } 69: } 70: function openHelpWindow() { 71: window.open("/adm/jme/jme_help.html","","scrollbars=yes,resizable=yes,width=500,height=600"); 72: } 73: </script> 74: </head> 75: <body bgcolor="#ffffff"> 76: <center> 77: <applet code="JME.class" name="JME" archive="/adm/jme/JME.jar" width="97%" height="78%"> 78: You have to enable Java and JavaScript on your machine. 79: $molecule 80: <param name="options" value="$options" /> 81: </applet><br /> 82: <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> 83: <form> 84: <input type="button" name="submit" value="Insert Answer" onClick = "submitSmiles();" /> 85: <br /> 86: <input type="button" value=" Close " onClick = "window.close()" /> 87: 88: <input type="button" value=" Help " onClick = "openHelpWindow()" /> 89: </form> 90: </center> 91: </body> 92: </html> 93: CHEMPAGE 94: $body=&HTML::Entities::encode($body); 95: $body=~s/\n/ /g; 96: my $result=<<CHEMINPUT; 97: <input type="button" value="Draw Molecule" onClick="javascript:editor=window.open('','','width=500,height=500,scrollbars=no,resizable=yes');editor.document.open('text/html','replace');editor.document.writeln('$body')" /> 98: CHEMINPUT 99: return $result; 100: } 101: 102: sub start_organicresponse { 103: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; 104: my $result; 105: my $partid = $Apache::inputtags::part; 106: my $id = &Apache::response::start_response($parstack,$safeeval); 107: if ($target eq 'meta') { 108: } elsif ($target eq 'web') { 109: my $molecule; 110: if (defined($Apache::lonhomework::history{"resource.$partid.$id.molecule"})) { 111: $molecule=$Apache::lonhomework::history{"resource.$partid.$id.molecule"}; 112: } else { 113: $molecule=&Apache::lonxml::get_param('molecule',$parstack, 114: $safeeval); 115: } 116: my $options=&Apache::lonxml::get_param('options',$parstack, 117: $safeeval); 118: $result=&seperate_jme_window("HWVAL_$id","MOLECULE_$id",$molecule,$options); 119: $result.= '<input type="hidden" name="MOLECULE_'.$id.'" value="" />'; 120: } elsif ($target eq 'edit') { 121: $result .=&Apache::edit::tag_start($target,$token); 122: my $options=&Apache::lonxml::get_param('options',$parstack, 123: $safeeval); 124: if ($options !~ /multipart/) { $options.=',multipart'; } 125: $result .='<nobr>'. 126: &Apache::edit::text_arg('Starting Molecule:','molecule', 127: $token,40); 128: my $molecule=&Apache::lonxml::get_param('molecule',$parstack, 129: $safeeval); 130: $result .=&seperate_jme_window(undef, 131: &Apache::edit::html_element_name('molecule'), 132: $molecule,$options); 133: $result .='</nobr><br /><nobr>'; 134: $result .=&Apache::edit::text_arg('Correct Answer:','answer', 135: $token,40); 136: $result .=&Apache::edit::hidden_arg('jmeanswer',$token); 137: my $jmeanswer=&Apache::lonxml::get_param('jmeanswer',$parstack, 138: $safeeval); 139: $result .=&seperate_jme_window( 140: &Apache::edit::html_element_name('answer'), 141: &Apache::edit::html_element_name('jmeanswer'), 142: $jmeanswer,$options); 143: $result .='</nobr><br />'; 144: $result .=&Apache::edit::checked_arg('Options:','options', 145: [ ['autoez','Auto E,Z sterochemistry'], 146: ['multipart','Multipart Structures'], 147: ['nostereo','No stereochemistry'], 148: ['reaction','Is a reaction'], 149: ['number','Able to number atoms'] ], 150: ,$token); 151: $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row(); 152: } elsif ($target eq 'modified') { 153: my $constructtag=&Apache::edit::get_new_args($token,$parstack, 154: $safeeval,'molecule', 155: 'answer','jmeanswer', 156: 'options'); 157: if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } 158: } 159: return $result; 160: } 161: 162: sub end_organicresponse { 163: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; 164: my $result; 165: if ($target eq 'grade' && defined($ENV{'form.submitted'})) { 166: &Apache::response::setup_params($$tagstack[-1]); 167: my $response = &Apache::response::getresponse(); 168: if ( $response =~ /[^\s]/) { 169: my $partid = $Apache::inputtags::part; 170: my $id = $Apache::inputtags::response['-1']; 171: my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval); 172: my %previous = &Apache::response::check_for_previous($response,$partid,$id); 173: $Apache::lonhomework::results{"resource.$partid.$id.submission"}=$response; 174: my $ad; 175: foreach my $answer (@answers) { 176: &Apache::lonxml::debug("submitted a $response for $answer<br \>\n"); 177: if ($response eq $answer) { 178: $ad='EXACT_ANS'; 179: last; 180: } else { 181: $ad='INCORRECT'; 182: } 183: } 184: &Apache::response::handle_previous(\%previous,$ad); 185: $Apache::lonhomework::results{"resource.$partid.$id.awarddetail"}=$ad; 186: $Apache::lonhomework::results{"resource.$partid.$id.molecule"}=$ENV{"form.MOLECULE_$id"}; 187: } 188: } elsif ($target eq "edit") { 189: $result.= &Apache::edit::tag_end($target,$token,''); 190: } elsif ($target eq 'answer') { 191: my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack, 192: $safeeval); 193: $result.=&Apache::response::answer_header('organicresponse'); 194: foreach my $answer (@answers) { 195: $result.=&Apache::response::answer_part('organicresponse',$answer); 196: } 197: $result.=&Apache::response::answer_footer('organicresponse'); 198: } 199: &Apache::response::end_response; 200: return $result; 201: } 202: 203: sub start_organicstructure { 204: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; 205: my $result; 206: if ($target eq 'web') { 207: my $width=&Apache::lonxml::get_param('width',$parstack,$safeeval); 208: my $molecule=&Apache::lonxml::get_param('molecule',$parstack,$safeeval); 209: my $options=&Apache::lonxml::get_param('options',$parstack,$safeeval); 210: my $id=time.'_'.int(rand(1000)); 211: $result="<img src='/cgi-bin/convertjme.pl?$id' />"; 212: &Apache::lonnet::appenv( 213: 'cgi.'.$id.'.JME' => &Apache::lonnet::escape($molecule), 214: 'cgi.'.$id.'.PNG' => 1, 215: 'cgi.'.$id.'.WIDTH' => $width ); 216: } elsif ($target eq 'tex') { 217: my $texwidth=&Apache::lonxml::get_param('texwidth',$parstack,$safeeval,1); 218: if (!$texwidth) { $texwidth='90'; } 219: my $molecule=&Apache::lonxml::get_param('molecule',$parstack,$safeeval); 220: my $options=&Apache::lonxml::get_param('options',$parstack,$safeeval); 221: my $filename = $ENV{'user.name'}.'_'.$ENV{'user.domain'}. 222: '_'.time.'_'.$$.int(rand(1000)).'_organicstructure'; 223: my $id=$filename; 224: &Apache::lonnet::appenv( 225: 'cgi.'.$id.'.JME' => &Apache::lonnet::escape($molecule), 226: 'cgi.'.$id.'.PS' => 1, 227: 'cgi.'.$id.'.WIDTH' => $texwidth ); 228: $id=&Apache::lonnet::escape($id); 229: &Apache::lonxml::register_ssi("/cgi-bin/convertjme.pl?$id"); 230: $result = '\graphicspath{{/home/httpd/perl/tmp/}}\includegraphics[width='.$texwidth.' mm]{'.$filename.'.eps}'; 231: } elsif ($target eq 'edit') { 232: $result .=&Apache::edit::tag_start($target,$token); 233: $result .=&Apache::edit::text_arg('Width:','width',$token,5); 234: $result .=&Apache::edit::text_arg('Height:','height',$token,5); 235: $result .=&Apache::edit::text_arg('TeXwidth:','texwidth',$token,5); 236: $result .='<nobr>'; 237: $result .=&Apache::edit::text_arg('Molecule:','molecule',$token,40); 238: my $molecule=&Apache::lonxml::get_param('molecule',$parstack, 239: $safeeval); 240: my $options=&Apache::lonxml::get_param('options',$parstack, 241: $safeeval); 242: if ($options !~ /reaction/) { 243: $options.= ',multipart,number'; 244: } 245: 246: $result .=&seperate_jme_window(undef, 247: &Apache::edit::html_element_name('molecule'), 248: $molecule,$options); 249: $result.="</nobr><br />"; 250: $result .=&Apache::edit::checked_arg('Options:','options', 251: [ ['reaction','Is a reaction'], 252: ['border','Draw a border'] ], 253: $token); 254: $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row(); 255: } elsif ($target eq 'modified') { 256: my $constructtag=&Apache::edit::get_new_args($token,$parstack, 257: $safeeval,'molecule', 258: 'width','height', 259: 'texwidth','options'); 260: if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } 261: } 262: return $result; 263: } 264: 265: sub end_organicstructure { 266: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; 267: my $result; 268: if ($target eq "edit") { 269: $result.= &Apache::edit::tag_end($target,$token,''); 270: } 271: return $result; 272: } 273: 274: sub edit_reaction_button { 275: my ($id,$field,$reaction)=@_; 276: my $id_es=&Apache::lonnet::escape($id); 277: my $field_es=&Apache::lonnet::escape($field); 278: my $reaction_es=&Apache::lonnet::escape($reaction); 279: my $result=<<EDITREACTION; 280: <script type="text/javascript"> 281: function create_reaction_window_${id}_${field} () { 282: editor=window.open('','','width=500,height=270,scrollbars=no,resizable=yes'); 283: editor.document.open('text/html','replace'); 284: editor.document.writeln('<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"><html> <head><title>LON-CAPA Reaction Editor</title></head><frameset rows="30%,*" border="0"> <frame src="/res/adm/pages/reactionresponse/reaction_viewer.html" name="viewer" scrolling="no" /> <frame src="/res/adm/pages/reactionresponse/reaction_editor.html?reaction=$reaction_es&id=$id_es&field=$field_es" name="editor" scrolling="no" /> </frameset> </html>'); 285: } 286: </script> 287: <input type='button' value='Edit Reaction' onClick="javascript:create_reaction_window_${id}_${field}();void(0);" /> 288: EDITREACTION 289: return $result; 290: } 291: 292: sub start_reactionresponse { 293: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; 294: my $result; 295: my $id = &Apache::response::start_response($parstack,$safeeval); 296: if ($target eq 'meta') { 297: } elsif ($target eq 'web') { 298: my $partid = $Apache::inputtags::part; 299: my $id = $Apache::inputtags::response['-1']; 300: my $reaction=$Apache::lonhomework::history{"resource.$partid.$id.submission"}; 301: $result.=&edit_reaction_button($id,"HWVAL_$id",$reaction); 302: } elsif ($target eq "edit") { 303: $result .=&Apache::edit::tag_start($target,$token); 304: my $answer=&Apache::lonxml::get_param('answer',$parstack, 305: $safeeval); 306: $result .='<nobr>'. 307: &Apache::edit::text_arg('Answer:','answer',$token,40); 308: $result .=&edit_reaction_button($id,&Apache::edit::html_element_name('answer'),$answer).'</nobr>'; 309: 310: $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row(); 311: } elsif ($target eq 'modified') { 312: my $constructtag=&Apache::edit::get_new_args($token,$parstack, 313: $safeeval,'answer'); 314: if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } 315: } 316: return $result; 317: } 318: 319: sub end_reactionresponse { 320: my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; 321: my $result; 322: if ($target eq 'grade' && defined($ENV{'form.submitted'})) { 323: &Apache::response::setup_params($$tagstack[-1]); 324: my $response = &Apache::response::getresponse(); 325: if ( $response =~ /[^\s]/) { 326: my $partid = $Apache::inputtags::part; 327: my $id = $Apache::inputtags::response['-1']; 328: my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval); 329: my %previous = &Apache::response::check_for_previous($response,$partid,$id); 330: $Apache::lonhomework::results{"resource.$partid.$id.submission"}=$response; 331: my $ad; 332: foreach my $answer (@answers) { 333: &Apache::lonxml::debug("submitted a $response for $answer<br \>\n"); 334: if ($response eq $answer) { 335: $ad='EXACT_ANS'; 336: } else { 337: $ad='INCORRECT'; 338: } 339: } 340: &Apache::response::handle_previous(\%previous,$ad); 341: $Apache::lonhomework::results{"resource.$partid.$id.awarddetail"}=$ad; 342: } 343: } elsif ($target eq "edit") { 344: $result.= &Apache::edit::tag_end($target,$token,''); 345: } elsif ($target eq 'answer') { 346: my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack, 347: $safeeval); 348: $result.=&Apache::response::answer_header('reactionresponse'); 349: foreach my $answer (@answers) { 350: $result.=&Apache::response::answer_part('reactionresponse', 351: $answer); 352: } 353: $result.=&Apache::response::answer_footer('reactionresponse'); 354: } 355: &Apache::response::end_response; 356: return $result; 357: } 358: 359: 1; 360: __END__