--- loncom/homework/chemresponse.pm 2003/05/05 19:27:08 1.3
+++ loncom/homework/chemresponse.pm 2003/05/05 21:14:10 1.5
@@ -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.5 2003/05/05 21:14:10 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -32,7 +32,7 @@ use Apache::lonxml;
use Apache::lonnet;
BEGIN {
- &Apache::lonxml::register('Apache::chemresponse',('chemresponse','chemstructure'));
+ &Apache::lonxml::register('Apache::chemresponse',('chemresponse','chemstructure','reactionresponse'));
}
sub seperate_jme_window {
@@ -214,5 +214,219 @@ sub end_chemstructure {
return $result;
}
+sub reaction_javascript {
+ my $rightarrow;
+ if ($ENV{'browser.unicode'}) {
+ $rightarrow=" → "
+ } else {
+ $rightarrow=" ® ";
+ }
+ my $result=<
+
+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 += " $rightarrow ";
+ 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();
+ }
+}
+
+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.='';
+ $result.=''
+ } 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;
+}
+
1;
__END__