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

www www at source.lon-capa.org
Fri Aug 17 09:08:11 EDT 2012


www		Fri Aug 17 13:08:11 2012 EDT

  Modified files:              
    /loncom/homework	functionplotresponse.pm 
  Log:
  HTML5/JavaScript does not understand underscores in applet IDs
  
  
-------------- next part --------------
Index: loncom/homework/functionplotresponse.pm
diff -u loncom/homework/functionplotresponse.pm:1.97 loncom/homework/functionplotresponse.pm:1.98
--- loncom/homework/functionplotresponse.pm:1.97	Thu Aug 16 23:03:01 2012
+++ loncom/homework/functionplotresponse.pm	Fri Aug 17 13:08:11 2012
@@ -1,7 +1,7 @@
 # LearningOnline Network with CAPA
 # Functionplot responses
 #
-# $Id: functionplotresponse.pm,v 1.97 2012/08/16 23:03:01 www Exp $
+# $Id: functionplotresponse.pm,v 1.98 2012/08/17 13:08:11 www Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -52,6 +52,17 @@
     return 1;
 }
 
+#
+# HTML5 version does not understand "_" in IDs
+#
+sub appid {
+    my ($id)=@_;
+    $id=~s/\_/rid/gs;
+    $id=~s/\W//gs;
+    return $id;
+}
+
+#
 # Routines to start the applet (Java) or the HTML5/JavaScript
 #
 # There can be a number of applets on a page, each called ggbApplet_$id, 
@@ -88,12 +99,13 @@
 
 sub java_geogebra_startcode {
     my ($id,$width,$height)=@_;
+    my $appid=&appid($id);
     $width=int(1.*$width);
     $height=int(1.*$height);
     unless ($width) { $width=700; }
     unless ($height) { $height=400; }
     return (<<ENDSTARTCODE);
-<applet name="ggbApplet_$id" code="geogebra.GeoGebraApplet" archive="geogebra.jar"
+<applet name="ggbApplet$appid" code="geogebra.GeoGebraApplet" archive="geogebra.jar"
          codebase="/adm/geogebra/"  width="$width" height="$height" MAYSCRIPT>
        <param name="java_arguments" value="-Xmx512m -Djnlp.packEnabled=true"/>
 ENDSTARTCODE
@@ -111,6 +123,7 @@
 
 sub html5_geogebra_startcode {
     my ($id,$width,$height)=@_;
+    my $appid=&appid($id);
     $width=int(1.*$width);
     $height=int(1.*$height);
     unless ($width) { $width=700; }
@@ -118,7 +131,7 @@
     my $code=&geogebra_internal_program();
     return (<<ENDSTARTCODE);
 <article class="geogebraweb" data-param-enableLabelDrags="false" data-param-enableShiftDragZoom="false" 
-data-param-width="$width" data-param-height="$height" data-param-id="ggbApplet_$id" 
+data-param-width="$width" data-param-height="$height" data-param-id="ggbApplet$appid" 
 data-param-ggbbase64="$code"></article>
 ENDSTARTCODE
 }
@@ -136,6 +149,7 @@
 #
 sub java_geogebra_default_parameters {
    my ($id)=@_;
+   my $appid=&appid($id);
    return(<<ENDDEFAULTPARAMETERS);
         <param name="image" value="/adm/lonIcons/lonanim.gif"  />
         <param name="boxborder" value="false"  />
@@ -156,7 +170,7 @@
         <param name="enableShiftDragZoom" value="false" />
         <param name="allowRescaling" value="false" />
         <param name="enableLabelDrags" value="false" />
-        <param name="ggbOnInitParam" value="applet_$id" />
+        <param name="ggbOnInitParam" value="ggbApplet$appid" />
 ENDDEFAULTPARAMETERS
 }
 
@@ -171,7 +185,7 @@
    if ($#Apache::functionplotresponse::callscripts>=0) {
       my $script='';
       foreach my $id (@Apache::functionplotresponse::callscripts) {
-          $script.="if (param=='applet_$id') { loaded_$id=true; }\n";
+          $script.="if (param=='ggbApplet".&appid($id)."') { loaded_$id=true; }\n";
       }
       $script.="if (".join(' && ',map { "loaded_$_" } (@Apache::functionplotresponse::callscripts)).
                ") { setTimeout('ggbInitAll()',200) }";
@@ -206,12 +220,13 @@
 #
 sub update_script {
     my ($id)=@_;
+    my $appid=&appid($id);
     return (<<ENDUPDATESCRIPT);
 <script type="text/javascript">
 // <![CDATA[
 function updatePointCoordinates_$id(coordinateName) {
-            var x = document.ggbApplet_$id.getXcoord(coordinateName);
-            var y = document.ggbApplet_$id.getYcoord(coordinateName);
+            var x = document.ggbApplet$appid.getXcoord(coordinateName);
+            var y = document.ggbApplet$appid.getYcoord(coordinateName);
             document.lonhomework.elements["HWVAL_$id\_" + coordinateName + "_x"].value = x;
             document.lonhomework.elements["HWVAL_$id\_" + coordinateName + "_y"].value = y;
         }
@@ -226,7 +241,8 @@
 
 sub update_register {
    my ($id,$variable)=@_;
-   return "document.ggbApplet_$id.registerObjectUpdateListener('$variable','updatePointCoordinates_$id');\n";
+   my $appid=&appid($id);
+   return "document.ggbApplet$appid.registerObjectUpdateListener('$variable','updatePointCoordinates_$id');\n";
 }
 
 #
@@ -234,6 +250,7 @@
 #
 sub set_point_coordinate {
    my ($id,$variable,$x,$y,$fixed)=@_;
+   my $appid=&appid($id);
    my $mult=($fixed?'a*':'');
 # Get rid of wild exponents, make sure it's a number
    $x=1.*$x;
@@ -244,9 +261,9 @@
    $y=~s/[e|E]/\*10\^/;
    $y=~s/\+//;
    return (<<ENDSETVARIABLE);
-document.ggbApplet_$id.evalCommand("a=1");
-document.ggbApplet_$id.evalCommand("$variable=$mult($x,$y)");
-document.ggbApplet_$id.setLabelVisible("$variable",false);
+document.ggbApplet$appid.evalCommand("a=1");
+document.ggbApplet$appid.evalCommand("$variable=$mult($x,$y)");
+document.ggbApplet$appid.setLabelVisible("$variable",false);
 ENDSETVARIABLE
 }
 
@@ -255,6 +272,7 @@
 #
 sub set_slope_coordinate {
    my ($id,$variable,$xrel,$yrel,$xmin,$xmax,$ymin,$ymax,$pointname,$fixed)=@_;
+   my $appid=&appid($id);
    my $xvariable=$variable.'x';
    my $yvariable=$variable.'y';
    my $domain=$xmax-$xmin;
@@ -263,15 +281,15 @@
    my $yinterval=$range/200.;
    my $mult=($fixed?'a*':'');
    return (<<ENDSETSVARIABLE);
-document.ggbApplet_$id.evalCommand("a=1");
-document.ggbApplet_$id.evalCommand("$xvariable=Slider[$xinterval,$domain,$xinterval]");
-document.ggbApplet_$id.setVisible("$xvariable", false);
-document.ggbApplet_$id.evalCommand("$xvariable=$xrel");
-document.ggbApplet_$id.evalCommand("$yvariable=Slider[-$range,$range,$yinterval]");
-document.ggbApplet_$id.setVisible("$yvariable", false);
-document.ggbApplet_$id.evalCommand("$yvariable=$yrel");
-document.ggbApplet_$id.evalCommand("$variable=$mult($xvariable+x($pointname),$yvariable+y($pointname))");
-document.ggbApplet_$id.setLabelVisible("$variable", false);
+document.ggbApplet$appid.evalCommand("a=1");
+document.ggbApplet$appid.evalCommand("$xvariable=Slider[$xinterval,$domain,$xinterval]");
+document.ggbApplet$appid.setVisible("$xvariable", false);
+document.ggbApplet$appid.evalCommand("$xvariable=$xrel");
+document.ggbApplet$appid.evalCommand("$yvariable=Slider[-$range,$range,$yinterval]");
+document.ggbApplet$appid.setVisible("$yvariable", false);
+document.ggbApplet$appid.evalCommand("$yvariable=$yrel");
+document.ggbApplet$appid.evalCommand("$variable=$mult($xvariable+x($pointname),$yvariable+y($pointname))");
+document.ggbApplet$appid.setLabelVisible("$variable", false);
 ENDSETSVARIABLE
 }
 
@@ -367,46 +385,48 @@
 
 sub axes_script {
     my ($id,$xmin,$xmax,$ymin,$ymax,$xvisible,$yvisible,$gvisible)=@_;
+    my $appid=&appid($id);
     return (<<ENDAXESSCRIPT);
             // changes (xmin, xmax, ymin, ymax)
-            document.ggbApplet_$id.setCoordSystem($xmin,$xmax,$ymin,$ymax);
+            document.ggbApplet$appid.setCoordSystem($xmin,$xmax,$ymin,$ymax);
 
             // makes the (x,y) axis (in)visible
-            document.ggbApplet_$id.setAxesVisible($xvisible,$yvisible);
+            document.ggbApplet$appid.setAxesVisible($xvisible,$yvisible);
             // makes the grid (in)visible
-            document.ggbApplet_$id.setGridVisible($gvisible);
+            document.ggbApplet$appid.setGridVisible($gvisible);
 ENDAXESSCRIPT
 }
 
 sub axes_label {
     my ($id,$xmin,$xmax,$ymin,$ymax,$xlabel,$ylabel)=@_;
+    my $appid=&appid($id);
     unless ($xlabel || $ylabel) { return ''; }
-    my $return='document.ggbApplet_'.$id.'.evalCommand("topRight=Corner[3]");';
+    my $return='document.ggbApplet'.$appid.'.evalCommand("topRight=Corner[3]");';
     if ($xlabel) {
       if (($ymin<0) && ($ymax>0)) {
        $return.=(<<ENDXAXISLABELSCRIPT);
-document.ggbApplet_$id.evalCommand("Xlabel=(x(topRight)-AxisStepX[],AxisStepY[]/6)");
-document.ggbApplet_$id.setVisible("Xlabel",false);
-document.ggbApplet_$id.evalCommand("Text[\\"$xlabel\\", Xlabel]");
+document.ggbApplet$appid.evalCommand("Xlabel=(x(topRight)-AxisStepX[],AxisStepY[]/6)");
+document.ggbApplet$appid.setVisible("Xlabel",false);
+document.ggbApplet$appid.evalCommand("Text[\\"$xlabel\\", Xlabel]");
 ENDXAXISLABELSCRIPT
       } else {
        $return.=(<<ENDXOFFAXISLABEL);
-document.ggbApplet_$id.evalCommand("LowerRight=Corner[2]");
-document.ggbApplet_$id.evalCommand("Text[\\"$xlabel\\", (x(LowerRight) - AxisStepX[], y(LowerRight) + AxisStepY[] / 2)]");
+document.ggbApplet$appid.evalCommand("LowerRight=Corner[2]");
+document.ggbApplet$appid.evalCommand("Text[\\"$xlabel\\", (x(LowerRight) - AxisStepX[], y(LowerRight) + AxisStepY[] / 2)]");
 ENDXOFFAXISLABEL
       }
     }
     if ($ylabel) {
       if (($xmin<0) && ($xmax>0)) {
        $return.=(<<ENDYAXISLABELSCRIPT);
-document.ggbApplet_$id.evalCommand("Ylabel=(AxisStepX[]/6,y(topRight)-AxisStepY[]/3)");
-document.ggbApplet_$id.setVisible("Ylabel",false);
-document.ggbApplet_$id.evalCommand("Text[\\"$ylabel\\", Ylabel]");
+document.ggbApplet$appid.evalCommand("Ylabel=(AxisStepX[]/6,y(topRight)-AxisStepY[]/3)");
+document.ggbApplet$appid.setVisible("Ylabel",false);
+document.ggbApplet$appid.evalCommand("Text[\\"$ylabel\\", Ylabel]");
 ENDYAXISLABELSCRIPT
       } else {
        $return.=(<<ENDYOFFAXISLABEL);
-document.ggbApplet_$id.evalCommand("UpperLeft=Corner[4]");
-document.ggbApplet_$id.evalCommand("Text[\\"$ylabel\\", (x(UpperLeft) + AxisStepX[] / 5, y(UpperLeft) - AxisStepY[] / 1.8)]");
+document.ggbApplet$appid.evalCommand("UpperLeft=Corner[4]");
+document.ggbApplet$appid.evalCommand("Text[\\"$ylabel\\", (x(UpperLeft) + AxisStepX[] / 5, y(UpperLeft) - AxisStepY[] / 1.8)]");
 ENDYOFFAXISLABEL
       }
     }
@@ -419,6 +439,7 @@
 
 sub plot_script {
    my ($id,$function,$fixed,$label,$color,$xmin,$xmax,$thickness)=@_;
+   my $appid=&appid($id);
    $label=~s/\W//g;
    if (($label) && ($label!~/^[A-Za-z]/)) {
       $label='C'.$label;
@@ -440,12 +461,12 @@
       $bc=hex($bh);
    }
    if ($fixed) {
-      return "document.ggbApplet_$id.evalCommand('$label=Function[$function,$xmin,$xmax]');\n".
-             ($visible?'':"document.ggbApplet_$id.setLabelVisible('$label', false);\n").
-             ($color?"document.ggbApplet_$id.setColor('$label',$rc,$gc,$bc);\n":'').
-             ($thickness?"document.ggbApplet_$id.setLineThickness('$label',$thickness);\n":'');
+      return "document.ggbApplet$appid.evalCommand('$label=Function[$function,$xmin,$xmax]');\n".
+             ($visible?'':"document.ggbApplet$appid.setLabelVisible('$label', false);\n").
+             ($color?"document.ggbApplet$appid.setColor('$label',$rc,$gc,$bc);\n":'').
+             ($thickness?"document.ggbApplet$appid.setLineThickness('$label',$thickness);\n":'');
    } else {
-       return "document.ggbApplet_$id.evalCommand('y=$function');\n";
+       return "document.ggbApplet$appid.evalCommand('y=$function');\n";
    }
 }
 
@@ -455,17 +476,18 @@
 
 sub plotobject_script {
    my ($id,$label,$x,$y)=@_;
+   my $appid=&appid($id);
    unless ($label) {
       $Apache::functionplotresponse::counter++;
       $label='O'.$Apache::functionplotresponse::counter;
    }
    &generate_input_field($id,$label,$x,$y);
-   return "document.ggbApplet_$id.evalCommand('a=1');\n".
-          "document.ggbApplet_$id.setVisible('a', false);\n".
-          "document.ggbApplet_$id.setLabelVisible('a', false);\n".
-          "document.ggbApplet_$id.evalCommand('$label=a*($x,$y)');\n".
-          "document.ggbApplet_$id.setVisible('$label', true);\n".
-          "document.ggbApplet_$id.setLabelVisible('$label', true);\n";
+   return "document.ggbApplet$appid.evalCommand('a=1');\n".
+          "document.ggbApplet$appid.setVisible('a', false);\n".
+          "document.ggbApplet$appid.setLabelVisible('a', false);\n".
+          "document.ggbApplet$appid.evalCommand('$label=a*($x,$y)');\n".
+          "document.ggbApplet$appid.setVisible('$label', true);\n".
+          "document.ggbApplet$appid.setLabelVisible('$label', true);\n";
 }
 
 #
@@ -474,6 +496,7 @@
 
 sub plotvector_script {
    my ($id,$label,$xs,$ys,$xe,$ye,$xmin,$xmax,$fixed)=@_;
+   my $appid=&appid($id);
    unless ($label) {
       $Apache::functionplotresponse::counter++;
       $label='V'.$Apache::functionplotresponse::counter;
@@ -487,13 +510,13 @@
        &new_point_coordinate($id,$startlabel,$xs,$ys,$fixed).
        &new_point_coordinate($id,$endlabel,$xe,$ye,$fixed).
        (<<ENDVECTOR);
-document.ggbApplet_$id.evalCommand("$label=Vector[$startlabel,$endlabel]");
-document.ggbApplet_$id.setLabelVisible("$label",true);
-document.ggbApplet_$id.setLineThickness("$label",8);
-document.ggbApplet_$id.evalCommand("$pointlabel=($pointx,y($startlabel))");
-document.ggbApplet_$id.evalCommand("$anglelabel=Angle[$pointlabel,$startlabel,$endlabel]");
-document.ggbApplet_$id.setLabelVisible("$anglelabel",true);
-document.ggbApplet_$id.setLabelStyle("$anglelabel",VALUE=2);
+document.ggbApplet$appid.evalCommand("$label=Vector[$startlabel,$endlabel]");
+document.ggbApplet$appid.setLabelVisible("$label",true);
+document.ggbApplet$appid.setLineThickness("$label",8);
+document.ggbApplet$appid.evalCommand("$pointlabel=($pointx,y($startlabel))");
+document.ggbApplet$appid.evalCommand("$anglelabel=Angle[$pointlabel,$startlabel,$endlabel]");
+document.ggbApplet$appid.setLabelVisible("$anglelabel",true);
+document.ggbApplet$appid.setLabelStyle("$anglelabel",VALUE=2);
 ENDVECTOR
 }
 
@@ -504,22 +527,23 @@
 
 sub answer_spline_script {
    my ($id, at points)=@_;
+   my $appid=&appid($id);
    my $order=int(($#points+1)/4);
    if ($order<2) { $order=2; }
    if ($order>8) { $order=8; }
    $Apache::functionplotresponse::counter++;
    my $label='CSpline'.$Apache::functionplotresponse::counter;
-   my $output='document.ggbApplet_'.$id.'.evalCommand("'.$label.'=Spline'.$order.'[';
+   my $output='document.ggbApplet'.$appid.'.evalCommand("'.$label.'=Spline'.$order.'[';
    for (my $i=0;$i<=$#points;$i+=4) {
       $output.="($points[$i],$points[$i+1]),($points[$i+2],$points[$i+3]),";
    }
    $output=~s/\,$//;
    $output.=']");'."\n";
    for (my $i=2; $i<2*$order; $i+=2) {
-       $output.='document.ggbApplet_'.$id.'.setColor("'.$label.'_'.($i>=10?'{':'').$i.($i>=10?'}':'').'",0,170,0);'."\n";
+       $output.='document.ggbApplet'.$appid.'.setColor("'.$label.'_'.($i>=10?'{':'').$i.($i>=10?'}':'').'",0,170,0);'."\n";
    }
    for (my $i=1; $i<2*$order; $i+=2) {
-       $output.='document.ggbApplet_'.$id.'.setVisible("'.$label.'_'.($i>=10?'{':'').$i.($i>=10?'}':'').'",false);'."\n";
+       $output.='document.ggbApplet'.$appid.'.setVisible("'.$label.'_'.($i>=10?'{':'').$i.($i>=10?'}':'').'",false);'."\n";
    }
 
    return $output;
@@ -531,6 +555,7 @@
 
 sub generate_spline {
    my ($id,$label,$xmin,$xmax,$ymin,$ymax,$fixed)=@_;
+   my $appid=&appid($id);
    my $result='';
    my $order=$Apache::functionplotresponse::splineorder{$label};
    my $x=$Apache::functionplotresponse::splineinitx{$label};
@@ -547,7 +572,7 @@
        $x+=$sx/(2.*($order-1));
        push(@coords,$label.'S'.$i);
    }
-   $result.='document.ggbApplet_'.$id.'.evalCommand("Spline'.$order.'['.join(',', at coords).']");'."\n";
+   $result.='document.ggbApplet'.$appid.'.evalCommand("Spline'.$order.'['.join(',', at coords).']");'."\n";
    return $result;
 }
 
@@ -666,6 +691,7 @@
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
     my $result='';
     my $internalid = $Apache::inputtags::part.'_'.$Apache::inputtags::response[-1];
+    my $internalappid=&appid($internalid);
     my $tailx=&Apache::lonxml::get_param('tailx',$parstack,$safeeval);
     my $taily=&Apache::lonxml::get_param('taily',$parstack,$safeeval);
     my $showvalue=&Apache::lonxml::get_param('showvalue',$parstack,$safeeval);
@@ -694,25 +720,25 @@
                 my $vectorx=$thisvector.'X';
                 my $vectory=$thisvector.'Y';
                 $result.=(<<ENDADDVEC);
-document.ggbApplet_$internalid.evalCommand("$vectorx=x($thisvector)");
-document.ggbApplet_$internalid.evalCommand("$vectory=y($thisvector)");
-document.ggbApplet_$internalid.evalCommand("Include$thisvector$label=Checkbox[]");
+document.ggbApplet$internalappid.evalCommand("$vectorx=x($thisvector)");
+document.ggbApplet$internalappid.evalCommand("$vectory=y($thisvector)");
+document.ggbApplet$internalappid.evalCommand("Include$thisvector$label=Checkbox[]");
 ENDADDVEC
                 push(@sumx,"If[Include$thisvector$label,$vectorx,0]");
                 push(@sumy,"If[Include$thisvector$label,$vectory,0]");
             }
-            $result.="document.ggbApplet_$internalid.evalCommand(".'"'."xTot$label=".join('+', at sumx).'");'."\n";
-            $result.="document.ggbApplet_$internalid.evalCommand(".'"'."yTot$label=".join('+', at sumy).'");'."\n";
+            $result.="document.ggbApplet$internalappid.evalCommand(".'"'."xTot$label=".join('+', at sumx).'");'."\n";
+            $result.="document.ggbApplet$internalappid.evalCommand(".'"'."yTot$label=".join('+', at sumy).'");'."\n";
             my $show=0;
             if ($showvalue=~/yes/i) {
                 $show=1;
             }
             $result.=(<<ENDMAKEVECTOR);
-document.ggbApplet_$internalid.evalCommand("$label=Vector[($tailx,$taily),($tailx+xTot$label,$taily+yTot$label)]");
-document.ggbApplet_$internalid.setLabelVisible("$label",true);
-document.ggbApplet_$internalid.setLineThickness("$label",8);
-document.ggbApplet_$internalid.setColor("$label",255,0,0);
-document.ggbApplet_$internalid.setLabelStyle("$label",VALUE=$show);
+document.ggbApplet$internalappid.evalCommand("$label=Vector[($tailx,$taily),($tailx+xTot$label,$taily+yTot$label)]");
+document.ggbApplet$internalappid.setLabelVisible("$label",true);
+document.ggbApplet$internalappid.setLineThickness("$label",8);
+document.ggbApplet$internalappid.setColor("$label",255,0,0);
+document.ggbApplet$internalappid.setLabelStyle("$label",VALUE=$show);
 ENDMAKEVECTOR
         }
     } elsif ($target eq 'edit') {


More information about the LON-CAPA-cvs mailing list