[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