From 0d4785cf429c029d0a52570ccb5a92f23ae52f31 Mon Sep 17 00:00:00 2001 From: Andreas Walter Date: Mon, 8 Jun 2026 14:33:07 +0200 Subject: [PATCH 1/2] add format attributes `evalSliders` and `evalPIandE` --- src/interpreter.js | 49 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/src/interpreter.js b/src/interpreter.js index 23d5b4a..30c08a4 100644 --- a/src/interpreter.js +++ b/src/interpreter.js @@ -1729,6 +1729,8 @@ JXG.extend(JXG.JessieCode.prototype, /** @lends JXG.JessieCode.prototype */ { format = {}; } format = Type.deepCopy({ + evalSliders: false, + evalPIandE: false, minParentheses: false, constToFixed: false, printable: false @@ -1775,7 +1777,7 @@ JXG.extend(JXG.JessieCode.prototype, /** @lends JXG.JessieCode.prototype */ { } function compile(node, prevOp, position = -1) { - var e, i, c, list, scope, prioParent, prioChild, + var e, i, c, o, list, scope, prioParent, prioChild, ret = ''; if (!node) { @@ -2136,8 +2138,49 @@ JXG.extend(JXG.JessieCode.prototype, /** @lends JXG.JessieCode.prototype */ { case 'node_var': if (js) { ret = that.getvarJS(node.value, false, node.withProps); - } else { - ret = node.value; + break; + } + + ret = node.value; + if (format.evalSliders || format.evalPIandE) { + o = that.execute(that.replaceNames(node, false)); + c = that.execute(that.replaceNames(node, true)); + + if (!( + !Type.exists(o) || + (!format.evalSliders && o.elType === "slider") || + (!format.evalPIandE && (ret === "PI" || ret === "EULER" || Type.isNumber(o))) || + !Type.isNumber(c) + )) { + if ( + format.constToFixed !== false && + Type.isNumber(c) && + !(prevOp === "op_exp" && position === 1) // exponents will not be formatted + ) { + c = parseFloat(c); + if (Type.isNumber(format.constToFixed)) { + c = Type.toFixed(c, format.constToFixed); + } else if (Type.isFunction(format.constToFixed)) { + c = format.constToFixed(c); + } else { + c = node.value; + } + } + if (format.minParentheses && parseFloat(c) < 0 && prevOp !== "op_execfun" && position !== 0) { + ret = "(" + c + ")"; + } else { + ret = c; + } + } + } + + if (format.printable) { + if (ret === "PI") { + ret = "π"; + } + if (ret === "EULER") { + ret = "e"; + } } break; From 0ad4a8077c78b01253a563df577adcded98f941c Mon Sep 17 00:00:00 2001 From: Andreas Walter Date: Thu, 11 Jun 2026 11:20:09 +0200 Subject: [PATCH 2/2] improve case `format.printable === true` --- src/interpreter.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/interpreter.js b/src/interpreter.js index 30c08a4..9acfe9c 100644 --- a/src/interpreter.js +++ b/src/interpreter.js @@ -2101,19 +2101,26 @@ JXG.extend(JXG.JessieCode.prototype, /** @lends JXG.JessieCode.prototype */ { if (js) { ret = '$jc$.pow(' + compile(node.children[0], "op_exp", 0) + ', ' + compile(node.children[1], "op_exp", 1) + ')'; } else if (!format.minParentheses) { - ret = '(' + compile(node.children[0], "op_exp", 0) + '^' + compile(node.children[1], "op_exp", 1) + ')'; + ret = '(' + + compile(node.children[0], "op_exp", 0) + + '^' + compile(node.children[1], "op_exp", 1) + + ')'; } else { prioParent = prio(node); e = compile(node.children[0], "op_exp", 0); prioChild = prio(node.children[0]); - ret = (prioParent >= prioChild) ? "(" + e + ")" : e; + ret = (prioParent >= prioChild) + ? "(" + e + ")" + : e; ret += '^'; e = compile(node.children[1], "op_exp", 1); prioChild = prio(node.children[1]); - ret += (prioParent > prioChild) ? "(" + e + ")" : e; + ret += (prioParent > prioChild && !(format.printable && e[0] === '{' && e[e.length - 1] === '}')) + ? "(" + e + ")" + : e; } break; case 'op_neg':