Diff for /loncom/homework/chemresponse.pm between versions 1.19 and 1.41

version 1.19, 2003/10/18 07:24:35 version 1.41, 2004/09/29 15:17:56
Line 35  BEGIN { Line 35  BEGIN {
     &Apache::lonxml::register('Apache::chemresponse',('organicresponse','organicstructure','reactionresponse'));      &Apache::lonxml::register('Apache::chemresponse',('organicresponse','organicstructure','reactionresponse'));
 }  }
   
 sub seperate_jme_window {  sub chem_standard_order {
       my ($reaction) = @_;
       my ($re,$pr) = split(/->|<=>/,$reaction);
       my @reactants = split(/\s\+/,$re);
       my @products =  split(/\s\+/,$pr);
       foreach my $substance (@reactants,@products) {
    $substance =~ s/(\^\d*)\s+/$1_/g;         # protect superscript space
    $substance =~ s/\s*//g;                   # strip whitespace
    $substance =~ s/_/ /g;                    # restore superscript space
       }
       @reactants = sort @reactants;
       @products = sort @products;
       my $standard = '';
       foreach my $substance (@reactants) {
    $standard .= $substance;
    $standard .= ' + ';
       }
       $standard =~ s/ \+ $//;              # get rid of trailing plus sign
       $standard .= ' -> ';
       foreach my $substance (@products) {
    $standard .= $substance;
    $standard .= ' + ';
       }
       $standard =~ s/ \+ $//;              # get rid of trailing plus sign
       return $standard;
   }
   
   sub separate_jme_window {
     my ($smile_input,$jme_input,$molecule,$options)=@_;      my ($smile_input,$jme_input,$molecule,$options)=@_;
     my $smilesection;      my $smilesection;
     if (defined($smile_input)) {      if (defined($smile_input)) {
  $smilesection=<<SMILESECTION;   $smilesection=<<SMILESECTION;
           smiles = document.applets.JME.smiles();
  opener.document.lonhomework.$smile_input.value = smiles;   opener.document.lonhomework.$smile_input.value = smiles;
 SMILESECTION  SMILESECTION
     }      }
Line 58  JMESECTION Line 86  JMESECTION
 <title>Molecule Editor</title>  <title>Molecule Editor</title>
 <script language="JavaScript">  <script language="JavaScript">
 function submitSmiles() {  function submitSmiles() {
     smiles = document.applets.JME.smiles();      jmeFile = document.applets.JME.jmeFile();
     if (smiles == "") {      if (jmeFile == "") {
  alert("Nothing to submit");   alert("Nothing to submit");
     } else {      } else {
         $smilesection  
         $jmesection          $jmesection
           $smilesection
  window.close();   window.close();
     }      }
 }  }
Line 74  function openHelpWindow() { Line 102  function openHelpWindow() {
 </head>  </head>
 <body bgcolor="#ffffff">  <body bgcolor="#ffffff">
 <center>  <center>
 <applet code="JME.class" name="JME" archive="/adm/jme/JME.jar" width="97%" height="78%">  <applet code="JME.class" name="JME" archive="/adm/jme/JME.jar" width="440" height="390">
 You have to enable Java and JavaScript on your machine.  You have to enable Java and JavaScript on your machine.
 $molecule  $molecule
 <param name="options" value="$options" />  <param name="options" value="$options" />
Line 91  $molecule Line 119  $molecule
 </body>  </body>
 </html>  </html>
 CHEMPAGE  CHEMPAGE
     $body=&HTML::Entities::encode($body);      $body=&HTML::Entities::encode($body,'<>&"');
     $body=~s/\n/ /g;      $body=~s/\n/ /g;
       my $docopen=&Apache::lonhtmlcommon::javascript_docopen();
     my $result=<<CHEMINPUT;      my $result=<<CHEMINPUT;
 <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')" />  <input type="button" value="Draw Molecule" onClick="javascript:editor=window.open('','','width=500,height=500,scrollbars=no,resizable=yes');editor.$docopen;editor.document.writeln('$body')" />
 CHEMINPUT  CHEMINPUT
     return $result;      return $result;
 }  }
Line 105  sub start_organicresponse { Line 134  sub start_organicresponse {
     my $partid = $Apache::inputtags::part;      my $partid = $Apache::inputtags::part;
     my $id = &Apache::response::start_response($parstack,$safeeval);      my $id = &Apache::response::start_response($parstack,$safeeval);
     if ($target eq 'meta') {      if ($target eq 'meta') {
    $result=&Apache::response::meta_package_write('organicresponse');
     } elsif ($target eq 'web') {      } elsif ($target eq 'web') {
  my $molecule;   my $molecule;
  if (defined($Apache::lonhomework::history{"resource.$partid.$id.molecule"})) {   if (defined($Apache::lonhomework::history{"resource.$partid.$id.molecule"})) {
Line 115  sub start_organicresponse { Line 145  sub start_organicresponse {
  }   }
  my $options=&Apache::lonxml::get_param('options',$parstack,   my $options=&Apache::lonxml::get_param('options',$parstack,
        $safeeval);         $safeeval);
  $result=&seperate_jme_window("HWVAL_$id","MOLECULE_$id",$molecule,$options);   $result=&separate_jme_window("HWVAL_$id","MOLECULE_$id",$molecule,$options);
  $result.= '<input type="hidden" name="MOLECULE_'.$id.'" value="" />';   $result.= '<input type="hidden" name="MOLECULE_'.$id.'" value="" />';
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result .=&Apache::edit::tag_start($target,$token);   $result .=&Apache::edit::tag_start($target,$token);
Line 127  sub start_organicresponse { Line 157  sub start_organicresponse {
     $token,40);      $token,40);
  my $molecule=&Apache::lonxml::get_param('molecule',$parstack,   my $molecule=&Apache::lonxml::get_param('molecule',$parstack,
  $safeeval);   $safeeval);
  $result .=&seperate_jme_window(undef,   $result .=&separate_jme_window(undef,
       &Apache::edit::html_element_name('molecule'),        &Apache::edit::html_element_name('molecule'),
       $molecule,$options);        $molecule,$options);
  $result .='</nobr><br /><nobr>';   $result .='</nobr><br /><nobr>';
Line 136  sub start_organicresponse { Line 166  sub start_organicresponse {
  $result .=&Apache::edit::hidden_arg('jmeanswer',$token);   $result .=&Apache::edit::hidden_arg('jmeanswer',$token);
  my $jmeanswer=&Apache::lonxml::get_param('jmeanswer',$parstack,   my $jmeanswer=&Apache::lonxml::get_param('jmeanswer',$parstack,
  $safeeval);   $safeeval);
  $result .=&seperate_jme_window(   $result .=&separate_jme_window(
                       &Apache::edit::html_element_name('answer'),                        &Apache::edit::html_element_name('answer'),
                       &Apache::edit::html_element_name('jmeanswer'),                        &Apache::edit::html_element_name('jmeanswer'),
       $jmeanswer,$options);        $jmeanswer,$options);
  $result .='</nobr><br />';   $result .='</nobr><br />';
  $result .=&Apache::edit::checked_arg('Options:','options',   $result .=&Apache::edit::checked_arg('Options:','options',
     [ ['autoez','Auto E,Z sterochemistry'],      [ ['autoez','Auto E,Z stereochemistry'],
       ['multipart','Multipart Structures'],        ['multipart','Multipart Structures'],
       ['nostereo','No stereochemistry'],        ['nostereo','No stereochemistry'],
       ['reaction','Is a reaction'],        ['reaction','Is a reaction'],
Line 163  sub end_organicresponse { Line 193  sub end_organicresponse {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;      my $result;
     if ($target eq 'grade' && defined($ENV{'form.submitted'})) {      if ($target eq 'grade' && defined($ENV{'form.submitted'})) {
  &Apache::response::setup_params($$tagstack[-1]);   &Apache::response::setup_params($$tagstack[-1],$safeeval);
  my $response = &Apache::response::getresponse();   my $response = &Apache::response::getresponse();
  if ( $response =~ /[^\s]/) {   if ( $response =~ /[^\s]/) {
     my $partid = $Apache::inputtags::part;      my $partid = $Apache::inputtags::part;
Line 207  sub start_organicstructure { Line 237  sub start_organicstructure {
  my $width=&Apache::lonxml::get_param('width',$parstack,$safeeval);   my $width=&Apache::lonxml::get_param('width',$parstack,$safeeval);
  my $molecule=&Apache::lonxml::get_param('molecule',$parstack,$safeeval);   my $molecule=&Apache::lonxml::get_param('molecule',$parstack,$safeeval);
  my $options=&Apache::lonxml::get_param('options',$parstack,$safeeval);   my $options=&Apache::lonxml::get_param('options',$parstack,$safeeval);
  my $id=time.'_'.int(rand(1000));   my $id=&Apache::loncommon::get_cgi_id();
  $result="<img src='/cgi-bin/convertjme.pl?$id'";   $result="<img src='/cgi-bin/convertjme.pl?$id'";
  if ($options =~ /border/) { $result.= ' border="1"'; }   if ($options =~ /border/) { $result.= ' border="1"'; }
  $result.=' />';   $result.=' />';
Line 216  sub start_organicstructure { Line 246  sub start_organicstructure {
     'cgi.'.$id.'.PNG' => 1,      'cgi.'.$id.'.PNG' => 1,
     'cgi.'.$id.'.WIDTH' => $width );      'cgi.'.$id.'.WIDTH' => $width );
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  my $texwidth=&Apache::lonxml::get_param('texwidth',$parstack,$safeeval,1);   my $texwidth=&Apache::lonxml::get_param('texwidth',$parstack,$safeeval,undef,1);
  if (!$texwidth) { $texwidth='90'; }   if (!$texwidth) { $texwidth='90'; }
  my $molecule=&Apache::lonxml::get_param('molecule',$parstack,$safeeval);   my $molecule=&Apache::lonxml::get_param('molecule',$parstack,$safeeval);
  my $options=&Apache::lonxml::get_param('options',$parstack,$safeeval);   my $options=&Apache::lonxml::get_param('options',$parstack,$safeeval);
Line 229  sub start_organicstructure { Line 259  sub start_organicstructure {
      'cgi.'.$id.'.WIDTH' => $texwidth );       'cgi.'.$id.'.WIDTH' => $texwidth );
  $id=&Apache::lonnet::escape($id);   $id=&Apache::lonnet::escape($id);
  &Apache::lonxml::register_ssi("/cgi-bin/convertjme.pl?$id");   &Apache::lonxml::register_ssi("/cgi-bin/convertjme.pl?$id");
  $result = '\graphicspath{{/home/httpd/perl/tmp/}}\includegraphics[width='.$texwidth.' mm]{'.$filename.'.eps}';   if ($options =~ /border/) { $result.= '\fbox{'; }
    $result .= '\graphicspath{{/home/httpd/perl/tmp/}}\includegraphics[width='.$texwidth.' mm]{'.$filename.'.eps}';
    if ($options =~ /border/) { $result.= '} '; }
     } elsif ($target eq 'edit') {      } elsif ($target eq 'edit') {
  $result .=&Apache::edit::tag_start($target,$token);   $result .=&Apache::edit::tag_start($target,$token);
  $result .=&Apache::edit::text_arg('Width:','width',$token,5);   $result .=&Apache::edit::text_arg('Width (pixels):','width',$token,5);
  $result .=&Apache::edit::text_arg('Height:','height',$token,5);   $result .=&Apache::edit::text_arg('TeXwidth (mm):','texwidth',$token,5);
  $result .=&Apache::edit::text_arg('TeXwidth:','texwidth',$token,5);  
  $result .='<nobr>';   $result .='<nobr>';
  $result .=&Apache::edit::text_arg('Molecule:','molecule',$token,40);   $result .=&Apache::edit::text_arg('Molecule:','molecule',$token,40);
  my $molecule=&Apache::lonxml::get_param('molecule',$parstack,   my $molecule=&Apache::lonxml::get_param('molecule',$parstack,
Line 245  sub start_organicstructure { Line 276  sub start_organicstructure {
     $options.= ',multipart,number';      $options.= ',multipart,number';
  }   }
         
  $result .=&seperate_jme_window(undef,   $result .=&separate_jme_window(undef,
  &Apache::edit::html_element_name('molecule'),   &Apache::edit::html_element_name('molecule'),
        $molecule,$options);         $molecule,$options);
  $result.="</nobr><br />";   $result.="</nobr><br />";
Line 253  sub start_organicstructure { Line 284  sub start_organicstructure {
      [ ['reaction','Is a reaction'],       [ ['reaction','Is a reaction'],
        ['border','Draw a border'] ],         ['border','Draw a border'] ],
      $token);       $token);
  $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();   $result .=&Apache::edit::end_row();
     } elsif ($target eq 'modified') {      } elsif ($target eq 'modified') {
  my $constructtag=&Apache::edit::get_new_args($token,$parstack,   my $constructtag=&Apache::edit::get_new_args($token,$parstack,
      $safeeval,'molecule',       $safeeval,'molecule',
      'width','height',       'width','texwidth',
      'texwidth','options');       'options');
  if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }   if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
     }      }
     return $result;      return $result;
Line 278  sub edit_reaction_button { Line 309  sub edit_reaction_button {
     my $id_es=&Apache::lonnet::escape($id);      my $id_es=&Apache::lonnet::escape($id);
     my $field_es=&Apache::lonnet::escape($field);      my $field_es=&Apache::lonnet::escape($field);
     my $reaction_es=&Apache::lonnet::escape($reaction);      my $reaction_es=&Apache::lonnet::escape($reaction);
       my $docopen=&Apache::lonhtmlcommon::javascript_docopen();
     my $result=<<EDITREACTION;      my $result=<<EDITREACTION;
 <script type="text/javascript">  <script type="text/javascript">
     function create_reaction_window_${id}_${field} () {      function create_reaction_window_${id}_${field} () {
  editor=window.open('','','width=500,height=270,scrollbars=no,resizable=yes');   editor=window.open('','','width=500,height=270,scrollbars=no,resizable=yes');
  editor.document.open('text/html','replace');   editor.$docopen;
  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>');   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?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" /> </frameset> </html>');
     }      }
 </script>  </script>
 <input type='button' value='Edit Reaction' onClick="javascript:create_reaction_window_${id}_${field}();void(0);" />  <input type='button' value='Edit Answer' onClick="javascript:create_reaction_window_${id}_${field}();void(0);" />
 EDITREACTION  EDITREACTION
     return $result;      return $result;
 }  }
Line 296  sub start_reactionresponse { Line 328  sub start_reactionresponse {
     my $result;      my $result;
     my $id = &Apache::response::start_response($parstack,$safeeval);      my $id = &Apache::response::start_response($parstack,$safeeval);
     if ($target eq 'meta') {      if ($target eq 'meta') {
    $result=&Apache::response::meta_package_write('reactionresponse');
     } elsif ($target eq 'web') {      } elsif ($target eq 'web') {
  my $partid = $Apache::inputtags::part;   my $partid = $Apache::inputtags::part;
  my $id = $Apache::inputtags::response['-1'];   my $id = $Apache::inputtags::response['-1'];
  my $reaction=$Apache::lonhomework::history{"resource.$partid.$id.submission"};   my $reaction=$Apache::lonhomework::history{"resource.$partid.$id.submission"};
  $result.=&edit_reaction_button($id,"HWVAL_$id",$reaction);   if ($reaction eq '') {  $reaction=&Apache::lonxml::get_param('initial',$parstack,$safeeval); }
    my $status=$Apache::inputtags::status['-1'];
    if ($status eq 'CAN_ANSWER') {
       $result.=&edit_reaction_button($id,"HWVAL_$id",$reaction);
    }
    if (  &Apache::response::show_answer() ) {
       my $ans=&Apache::lonxml::get_param('answer',$parstack,$safeeval);
       $ans=~s/(\\|\')/\\$1/g;
       $Apache::inputtags::answertxt{$id}=&Apache::run::run("return &chemparse('$ans');",$safeeval);
    }
     } elsif ($target eq "edit") {      } elsif ($target eq "edit") {
  $result .=&Apache::edit::tag_start($target,$token);   $result .=&Apache::edit::tag_start($target,$token);
  my $answer=&Apache::lonxml::get_param('answer',$parstack,   my $answer=&Apache::lonxml::get_param('answer',$parstack,
Line 308  sub start_reactionresponse { Line 350  sub start_reactionresponse {
  $result .='<nobr>'.   $result .='<nobr>'.
     &Apache::edit::text_arg('Answer:','answer',$token,40);      &Apache::edit::text_arg('Answer:','answer',$token,40);
  $result .=&edit_reaction_button($id,&Apache::edit::html_element_name('answer'),$answer).'</nobr>';   $result .=&edit_reaction_button($id,&Apache::edit::html_element_name('answer'),$answer).'</nobr>';
    my $initial=&Apache::lonxml::get_param('initial',$parstack,$safeeval);
    $result.='<nobr>'.
       &Apache::edit::text_arg('Initial Reation:','initial',$token,40);
    $result .=&edit_reaction_button($id,&Apache::edit::html_element_name('initial'),$initial).'</nobr>';
   
  $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();   $result .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
     }  elsif ($target eq 'modified') {      }  elsif ($target eq 'modified') {
  my $constructtag=&Apache::edit::get_new_args($token,$parstack,   my $constructtag=&Apache::edit::get_new_args($token,$parstack,
      $safeeval,'answer');       $safeeval,'answer',
        'initial');
  if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }   if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
     }      }
     return $result;      return $result;
Line 322  sub end_reactionresponse { Line 369  sub end_reactionresponse {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result;      my $result;
     if ($target eq 'grade' && defined($ENV{'form.submitted'})) {      if ($target eq 'grade' && defined($ENV{'form.submitted'})) {
  &Apache::response::setup_params($$tagstack[-1]);   &Apache::response::setup_params($$tagstack[-1],$safeeval);
  my $response = &Apache::response::getresponse();   my $response = &Apache::response::getresponse();
  if ( $response =~ /[^\s]/) {   if ( $response =~ /[^\s]/) {
     my $partid = $Apache::inputtags::part;      my $partid = $Apache::inputtags::part;
Line 333  sub end_reactionresponse { Line 380  sub end_reactionresponse {
     my $ad;      my $ad;
     foreach my $answer (@answers) {      foreach my $answer (@answers) {
  &Apache::lonxml::debug("submitted a $response for $answer<br \>\n");   &Apache::lonxml::debug("submitted a $response for $answer<br \>\n");
  if ($response eq $answer) {   if (&chem_standard_order($response) eq 
       &chem_standard_order($answer)) {
     $ad='EXACT_ANS';      $ad='EXACT_ANS';
  } else {   } else {
     $ad='INCORRECT';      $ad='INCORRECT';

Removed from v.1.19  
changed lines
  Added in v.1.41


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