[LON-CAPA-cvs] cvs: loncom /homework chemresponse.pm

albertel lon-capa-cvs@mail.lon-capa.org
Mon, 05 May 2003 20:43:46 -0000


albertel		Mon May  5 16:43:46 2003 EDT

  Modified files:              
    /loncom/homework	chemresponse.pm 
  Log:
  - <reactionresponse> currently non operational, looking for comments about method 
  
  
Index: loncom/homework/chemresponse.pm
diff -u loncom/homework/chemresponse.pm:1.3 loncom/homework/chemresponse.pm:1.4
--- loncom/homework/chemresponse.pm:1.3	Mon May  5 15:27:08 2003
+++ loncom/homework/chemresponse.pm	Mon May  5 16:43:46 2003
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # chemical equation style response
 #
-# $Id: chemresponse.pm,v 1.3 2003/05/05 19:27:08 albertel Exp $
+# $Id: chemresponse.pm,v 1.4 2003/05/05 20:43:46 albertel Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -32,7 +32,7 @@
 use Apache::lonnet;
 
 BEGIN {
-    &Apache::lonxml::register('Apache::chemresponse',('chemresponse','chemstructure'));
+    &Apache::lonxml::register('Apache::chemresponse',('chemresponse','chemstructure','reactionresponse'));
 }
 
 sub seperate_jme_window {
@@ -211,6 +211,214 @@
     if ($target eq "edit") {
 	$result.= &Apache::edit::tag_end($target,$token,'');
     }
+    return $result;
+}
+
+sub reaction_javascript {
+    my $result=<<REACTIONJAVASCRIPT;
+    <SCRIPT language="JavaScript">
+
+var level;
+var reactants;
+var products;
+
+
+function parse_reaction(string) {
+  var reaction_array = string.split('->');
+  var i;
+  reactants = new Array(0);
+  products = new Array(0);
+
+  if (reaction_array.length > 0)
+    reactants = reaction_array[0].split(' +');
+  if (reaction_array.length > 1)
+    products = reaction_array[1].split(' +');
+}
+
+function to_capa(string) {
+  var reaction = "";
+  var i;
+
+  parse_reaction(string);
+
+  for (i = 0; i < reactants.length; i++)
+    reactants[i] = capa_component(reactants[i]);
+  for (i = 0; i < products.length; i++)
+    products[i] = capa_component(products[i]);
+
+  reactants.sort();
+  products.sort();
+
+  for (i = 0; i < reactants.length-1; i++) {
+    reaction += reactants[i];
+    reaction += " + ";
+  }
+  if (i < reactants.length)
+    reaction += reactants[i];
+  if (products.length > 0) {
+    reaction += " -> ";
+    for (i = 0; i < products.length-1; i++) {
+      reaction += products[i];
+      reaction += " + ";
+    }
+    if (i < products.length)
+      reaction += products[i];
+  }
+
+  return reaction;
+}
+
+function capa_component(string) {
+  var reactant = "";
+  var i = 0;
+  level = 0;
+
+  for (;string.substring(i,i+1) == ' ';i++)
+    ;
+  for (;isDigit(string.substring(i,i+1));i++)
+    reactant += string.substring(i,i+1);
+  for (;i < string.length;i++)
+    reactant +=  capa_char(string.substring(i,i+1));
+
+  return reactant;
+}
+
+function capa_char(chr) {
+  if (level == 0) { // baseline
+    if (chr == '^')
+      level = 1;
+    if (chr == ' ')
+      return "";
+    return chr;
+  }
+  if (level == 1) { // superscript
+    if (isDigit(chr))
+      return chr;
+    level = 0;
+    return chr;
+  }
+}
+
+function to_html(string) {
+  var reaction = "";
+  var i;
+
+  parse_reaction(string);
+  for (i = 0; i < reactants.length-1; i++) {
+    reaction += html_component(reactants[i]);
+    reaction += " + ";
+  }
+  if (i < reactants.length)
+    reaction += html_component(reactants[i]);
+
+  if (products.length > 0) {
+    reaction += " <font face=symbol>&reg;</font> ";
+    for (i = 0; i < products.length-1; i++) {
+      reaction += html_component(products[i]);
+      reaction += " + ";
+    }
+    if (i < products.length)
+      reaction += html_component(products[i]);
+  }
+
+  return reaction;
+}
+
+function html_component(string) {
+  var reactant = "";
+  var i = 0;
+  level = 0;
+
+  for (;string.substring(i,i+1) == ' ';i++)
+    ;
+  for (;isDigit(string.substring(i,i+1));i++)
+    reactant += string.substring(i,i+1);
+  for (;i < string.length;i++)
+    reactant +=  html_char(string.substring(i,i+1));
+
+  return reactant;
+}
+
+function html_char(chr) {
+  if (level == 0) { // baseline
+    if (isDigit(chr))
+      return chr.sub();
+    if (chr == '^') {
+      level = 1;
+      return "";
+    }
+    if (chr == '+') // baseline or superscript
+      return "?";
+    if (chr == ' ')
+      return "";
+    return chr;
+  }
+  if (level == 1) { // superscript
+    if (isDigit(chr))
+      return chr.sup();
+    if (chr == '+' || chr == '-') {
+      level = 0;
+      return chr.sup();
+    }
+    if (chr == ' ') {
+      level = 0;
+      return "";
+    }
+    level = 0;
+    return chr;
+  }
+}
+
+function isDigit(string) {
+  if (string >= '0' && string <='9')
+    return 1;
+  else
+    return 0;
+}
+
+function openHelpWindow() {
+  window.open("reaction_help.html","","scrollbars=yes,resizable=yes,width=550,height=600")
+}
+
+function submitReaction() {
+  reaction = to_capa(document.form.text.value);
+  if (reaction == "") {
+    alert("Nothing to submit");
+  }
+  else {
+    name = "INPUT" + ((problem < 10) ? "0" : "") + problem;
+    i = 0;
+    while (parent.opener.document.CAPA.elements[i].name != name)
+      i++;
+    parent.opener.document.CAPA.elements[i].value = reaction;
+    parent.opener.document.CAPA.submit();
+  }
+}
+</SCRIPT>
+REACTIONJAVASCRIPT
+    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 'web') {
+	$result.=&reaction_javascript();
+#	$result.='<iframe name="REACTION_'.$id.'" width="200" height="100" src="/adm/jme/reaction_viewer.html"></iframe>';
+	$result.='<input type="button" value="Check" onClick = "javascript:newWindow=open(\'\',\'new_W\',\'width=500,height=200,scrollbars=1\');newWindow.document.open(\'text/html\',\'replace\');newWindow.document.writeln(\'<center><br />\'+to_html(document.lonhomework.HWVAL_'.$id.'.value)+\'</center><input type="button" value="  Close  " onClick = "parent.window.close()" />\');newWindow.document.close()" />'
+    } elsif ($target eq "edit") {
+    }
+    return $result;
+}
+
+sub end_reactionresponse {
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
+    my $result;
+    if ($target eq "edit") {
+	$result.= &Apache::edit::tag_end($target,$token,'');
+    }
+    &Apache::response::end_response;
     return $result;
 }