JavaScript replace mismatch ggb6/ggb5

hawe shared this problem 2 years ago
Not a Problem

Want to read a matrix X to JavaScript have to change Syntax

GGB5 Syntax replaces all search strings (should replace one instance)

GGB5 do not accept GGB6 Syntax

to write javascript matrix back to evalCommand GGB6 cannot handle .toSource method

see Topic


var A = ggbApplet.getValueString("X");
A = A.replace("X =","");
ggbApplet.evalCommand(A);
ggbApplet.evalCommand("Delete(X)");
// GGB6
A = A.replace(/}/g,"]");
A = A.replace(/{/g,"[");
// GGB 5
A = A.replace("}","]");
A = A.replace("{","[");

https://www.geogebra.org/m/uzdeH9Bf

Best Answer
photo

to read a string in JS from GGB 5.0 you must use xx=""+ggbApplet.xxxxxx as workaround for a bug

in GGB 6.0 it seams its works without ""+

But if you want be compatible 5.0 / 6.0 then use with ""+

==================

toSource() is a non standard command and is not suported in chrome (but in firefox)

use JSON.stringify(<obj>) this works in chrome, firefox, GGB 6.0 and GGB 5.0

.

the attachment works in 5.0 and 6.0, chrome and firefox

Comments (7)

photo
1

to read a string in JS from GGB 5.0 you must use xx=""+ggbApplet.xxxxxx as workaround for a bug

in GGB 6.0 it seams its works without ""+

But if you want be compatible 5.0 / 6.0 then use with ""+

==================

toSource() is a non standard command and is not suported in chrome (but in firefox)

use JSON.stringify(<obj>) this works in chrome, firefox, GGB 6.0 and GGB 5.0

.

the attachment works in 5.0 and 6.0, chrome and firefox

photo
1

I update the post above

photo
1

Danke Dir - das hilft sehr.

Das muss einem doch gesagt werden ;-)....

Durch das rein/raus (weil ich jeden Schritt anzeige und wieder einlese) kommt es zu erheblichen Rundungsfehlern. Hast Du eine Idee, wie ich die in den Griff kriege?

Die API hat wohl keinen Zugriff auf die Rundungseinstellung - jedenfalls hab ich nix gefunden? Bzw. werden nicht schlau aus void setRounding(string round).

b278fbb74ee3a4abbf30674e9ee519cf

photo
photo
1

Bezüglich runden:

Das bezieht sich nicht auf JS (das hat immer die maximal möglichen Stellen (?)) sondern auf die Darstellung in der Algerbra-View respektive in der Grafik und (unglücklicherweise auch) die Eingabezeile.

Aber auch für den Befehl getValueString() (verwandt mit F3 in Eingabezeile) und vermutlich noch weitere.

Die einfachste Variante besteht darin, dass Du im Menü/Optionen/Roundig den Wert auf 15 Nachkommastellen setzt und anschliessend die Schaltfläche mehrmals klickst.

Oder aber die 15 Nachkommastellen im JS wie folgt erzwingen:


ggbApplet.setRounding("15d")
A = ""+ggbApplet.getValueString("X");
ggbApplet.setRounding("2d")
"15d" bedeutet 15 Nachkommastellen (mehr gibt es nicht)

Alternativ könnte man das Zurücksetzen auf die üblichen 2 Nachkommastellen weglassen. Damit wären die Zischenschritte mit genaueren Werten ersichtlich. Später müsste der Benutzer die Anzahl Nachkommastellen im Menü/Einstellungen/Runden manuell auf den gewünschten Wert zurückstellen.

Mit recht hohem Aufwand könnte man (vermutlich) die vom Benutzer gewählte Rundungseinstellung abfragen (mit regex im GGB-XML) und den gefundenen Wert in der dritten Befehlszeile einsetzen.

==================================================

Bezüglich Dokumentation:

Nebst dem extrem kompakten Manual gibt es noch die Tutorials und dieses Forum. Und für mich als wichtigste Auskunftsqelle GGB selbst. Ich erprobe vermutete Verhaltensweisen (aber auch Bugs) in Befehlen, Scripts oder JS in kurzen, sehr spezifischen Wegwerf-Applets aus. Zb für den Befehl setRounding() habe ich das Applet im Anhang geschrieben und damit rumgepröbelt.

photo
1

Ahh, ja und nochmals Danke für die Mitwirkung. Das Debugging mach ich mit Google Sheets ;-) und arbeite nur die GGB spezifischen Elemente ein. Gibt es außer alert noch was hier?

Ich setz halt d15 zu Beginn und d3 nach dem Durchlauf, das beseitigt erstmal die erkennbaren Probleme. Ich bevorzuge das im Script zu tun, weil bevor ich dem geneigten Anwender das auseinandersetze...

Das ist dabei rausgekommen

https://geogebra.org/m/fP8cnZbb

Vielleicht liest Birigt mit und arbeitet das Example.setRounding in die Doku ein - würde helfen...

photo
1

Sehr schöne Anwendung.

---------------------------

Zu alert():

Für das Debuging ist mir in GGB nichts weiteres bekannt. Allenfalls noch "void debug(String string)", das ich nicht verwende.

photo
photo
1

bezügich List2JS02.ggb (oben) hat mich Roman Chijner in diesem Thread auf einen Fehler aumerksam gemacht.

Sehr kleine Werte werden in JS ungefragt in floating-point dargestellt. Die Syntax für floating-point unterscheidet sich zwischen JS und GGB. JS verwendet das kleine "e" und ggb verwendet das grosse "E". Dies ist in der neuen Version 03 berücksichtigt.

Ebenfalls ergänzt ist die Erweiterung auf 15 Nachkommastellen sowie eine Unpässlichkeit von GGB5.0 im Befehl getValueString().

© 2020 International GeoGebra Institute