# The LearningOnline Network with CAPA # chemical equation style response # # $Id: chemresponse.pm,v 1.18 2003/10/17 22:26:38 albertel Exp $ # # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). # # LON-CAPA is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # LON-CAPA is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with LON-CAPA; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # /home/httpd/html/adm/gpl.txt # # http://www.lon-capa.org/ # # package Apache::chemresponse; use strict; use Apache::lonxml; use Apache::lonnet; BEGIN { &Apache::lonxml::register('Apache::chemresponse',('organicresponse','organicstructure','reactionresponse')); } sub seperate_jme_window { my ($smile_input,$jme_input,$molecule,$options)=@_; my $smilesection; if (defined($smile_input)) { $smilesection=<'; } my $body=< Molecule Editor
You have to enable Java and JavaScript on your machine. $molecule
JME Editor courtesy of Peter Ertl, Novartis

  
CHEMPAGE $body=&HTML::Entities::encode($body); $body=~s/\n/ /g; my $result=< CHEMINPUT return $result; } sub start_organicresponse { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; my $partid = $Apache::inputtags::part; my $id = &Apache::response::start_response($parstack,$safeeval); if ($target eq 'meta') { } elsif ($target eq 'web') { my $molecule; if (defined($Apache::lonhomework::history{"resource.$partid.$id.molecule"})) { $molecule=$Apache::lonhomework::history{"resource.$partid.$id.molecule"}; } else { $molecule=&Apache::lonxml::get_param('molecule',$parstack, $safeeval); } my $options=&Apache::lonxml::get_param('options',$parstack, $safeeval); $result=&seperate_jme_window("HWVAL_$id","MOLECULE_$id",$molecule,$options); $result.= ''; } elsif ($target eq 'edit') { $result .=&Apache::edit::tag_start($target,$token); my $options=&Apache::lonxml::get_param('options',$parstack, $safeeval); if ($options !~ /multipart/) { $options.=',multipart'; } $result .=''. &Apache::edit::text_arg('Starting Molecule:','molecule', $token,40); my $molecule=&Apache::lonxml::get_param('molecule',$parstack, $safeeval); $result .=&seperate_jme_window(undef, &Apache::edit::html_element_name('molecule'), $molecule,$options); $result .='
'; $result .=&Apache::edit::text_arg('Correct Answer:','answer', $token,40); $result .=&Apache::edit::hidden_arg('jmeanswer',$token); my $jmeanswer=&Apache::lonxml::get_param('jmeanswer',$parstack, $safeeval); $result .=&seperate_jme_window( &Apache::edit::html_element_name('answer'), &Apache::edit::html_element_name('jmeanswer'), $jmeanswer,$options); $result .='
'; $result .=&Apache::edit::checked_arg('Options:','options', [ ['autoez','Auto E,Z sterochemistry'], ['multipart','Multipart Structures'], ['nostereo','No stereochemistry'], ['reaction','Is a reaction'], ['number','Able to number atoms'] ], ,$token); $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row(); } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args($token,$parstack, $safeeval,'molecule', 'answer','jmeanswer', 'options'); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } } return $result; } sub end_organicresponse { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; if ($target eq 'grade' && defined($ENV{'form.submitted'})) { &Apache::response::setup_params($$tagstack[-1]); my $response = &Apache::response::getresponse(); if ( $response =~ /[^\s]/) { my $partid = $Apache::inputtags::part; my $id = $Apache::inputtags::response['-1']; my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval); my %previous = &Apache::response::check_for_previous($response,$partid,$id); $Apache::lonhomework::results{"resource.$partid.$id.submission"}=$response; my $ad; foreach my $answer (@answers) { &Apache::lonxml::debug("submitted a $response for $answer
\n"); if ($response eq $answer) { $ad='EXACT_ANS'; last; } else { $ad='INCORRECT'; } } &Apache::response::handle_previous(\%previous,$ad); $Apache::lonhomework::results{"resource.$partid.$id.awarddetail"}=$ad; $Apache::lonhomework::results{"resource.$partid.$id.molecule"}=$ENV{"form.MOLECULE_$id"}; } } elsif ($target eq "edit") { $result.= &Apache::edit::tag_end($target,$token,''); } elsif ($target eq 'answer') { my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack, $safeeval); $result.=&Apache::response::answer_header('organicresponse'); foreach my $answer (@answers) { $result.=&Apache::response::answer_part('organicresponse',$answer); } $result.=&Apache::response::answer_footer('organicresponse'); } &Apache::response::end_response; return $result; } sub start_organicstructure { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; if ($target eq 'web') { my $width=&Apache::lonxml::get_param('width',$parstack,$safeeval); my $molecule=&Apache::lonxml::get_param('molecule',$parstack,$safeeval); my $options=&Apache::lonxml::get_param('options',$parstack,$safeeval); my $id=time.'_'.int(rand(1000)); $result=""; &Apache::lonnet::appenv( 'cgi.'.$id.'.JME' => &Apache::lonnet::escape($molecule), 'cgi.'.$id.'.PNG' => 1, 'cgi.'.$id.'.WIDTH' => $width ); } elsif ($target eq 'tex') { my $texwidth=&Apache::lonxml::get_param('texwidth',$parstack,$safeeval,1); if (!$texwidth) { $texwidth='90'; } my $molecule=&Apache::lonxml::get_param('molecule',$parstack,$safeeval); my $options=&Apache::lonxml::get_param('options',$parstack,$safeeval); my $filename = $ENV{'user.name'}.'_'.$ENV{'user.domain'}. '_'.time.'_'.$$.int(rand(1000)).'_organicstructure'; my $id=$filename; &Apache::lonnet::appenv( 'cgi.'.$id.'.JME' => &Apache::lonnet::escape($molecule), 'cgi.'.$id.'.PS' => 1, 'cgi.'.$id.'.WIDTH' => $texwidth ); $id=&Apache::lonnet::escape($id); &Apache::lonxml::register_ssi("/cgi-bin/convertjme.pl?$id"); $result = '\graphicspath{{/home/httpd/perl/tmp/}}\includegraphics[width='.$texwidth.' mm]{'.$filename.'.eps}'; } elsif ($target eq 'edit') { $result .=&Apache::edit::tag_start($target,$token); $result .=&Apache::edit::text_arg('Width:','width',$token,5); $result .=&Apache::edit::text_arg('Height:','height',$token,5); $result .=&Apache::edit::text_arg('TeXwidth:','texwidth',$token,5); $result .=''; $result .=&Apache::edit::text_arg('Molecule:','molecule',$token,40); my $molecule=&Apache::lonxml::get_param('molecule',$parstack, $safeeval); my $options=&Apache::lonxml::get_param('options',$parstack, $safeeval); if ($options !~ /reaction/) { $options.= ',multipart,number'; } $result .=&seperate_jme_window(undef, &Apache::edit::html_element_name('molecule'), $molecule,$options); $result.="
"; $result .=&Apache::edit::checked_arg('Options:','options', [ ['reaction','Is a reaction'], ['border','Draw a border'] ], $token); $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row(); } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args($token,$parstack, $safeeval,'molecule', 'width','height', 'texwidth','options'); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } } return $result; } sub end_organicstructure { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; if ($target eq "edit") { $result.= &Apache::edit::tag_end($target,$token,''); } return $result; } sub edit_reaction_button { my ($id,$field,$reaction)=@_; my $id_es=&Apache::lonnet::escape($id); my $field_es=&Apache::lonnet::escape($field); my $reaction_es=&Apache::lonnet::escape($reaction); my $result=< function create_reaction_window_${id}_${field} () { editor=window.open('','','width=500,height=270,scrollbars=no,resizable=yes'); editor.document.open('text/html','replace'); editor.document.writeln(' LON-CAPA Reaction Editor '); } EDITREACTION return $result; } sub start_reactionresponse { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; my $id = &Apache::response::start_response($parstack,$safeeval); if ($target eq 'meta') { } elsif ($target eq 'web') { my $partid = $Apache::inputtags::part; my $id = $Apache::inputtags::response['-1']; my $reaction=$Apache::lonhomework::history{"resource.$partid.$id.submission"}; $result.=&edit_reaction_button($id,"HWVAL_$id",$reaction); } elsif ($target eq "edit") { $result .=&Apache::edit::tag_start($target,$token); my $answer=&Apache::lonxml::get_param('answer',$parstack, $safeeval); $result .=''. &Apache::edit::text_arg('Answer:','answer',$token,40); $result .=&edit_reaction_button($id,&Apache::edit::html_element_name('answer'),$answer).''; $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row(); } elsif ($target eq 'modified') { my $constructtag=&Apache::edit::get_new_args($token,$parstack, $safeeval,'answer'); if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); } } return $result; } sub end_reactionresponse { my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_; my $result; if ($target eq 'grade' && defined($ENV{'form.submitted'})) { &Apache::response::setup_params($$tagstack[-1]); my $response = &Apache::response::getresponse(); if ( $response =~ /[^\s]/) { my $partid = $Apache::inputtags::part; my $id = $Apache::inputtags::response['-1']; my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack,$safeeval); my %previous = &Apache::response::check_for_previous($response,$partid,$id); $Apache::lonhomework::results{"resource.$partid.$id.submission"}=$response; my $ad; foreach my $answer (@answers) { &Apache::lonxml::debug("submitted a $response for $answer
\n"); if ($response eq $answer) { $ad='EXACT_ANS'; } else { $ad='INCORRECT'; } } &Apache::response::handle_previous(\%previous,$ad); $Apache::lonhomework::results{"resource.$partid.$id.awarddetail"}=$ad; } } elsif ($target eq "edit") { $result.= &Apache::edit::tag_end($target,$token,''); } elsif ($target eq 'answer') { my (@answers)=&Apache::lonxml::get_param_var('answer',$parstack, $safeeval); $result.=&Apache::response::answer_header('reactionresponse'); foreach my $answer (@answers) { $result.=&Apache::response::answer_part('reactionresponse', $answer); } $result.=&Apache::response::answer_footer('reactionresponse'); } &Apache::response::end_response; return $result; } 1; __END__