[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>®</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;
}