Files
DiceCloud/app/imports/api/creature/computation/evaluateCalculation.js

32 lines
1.0 KiB
JavaScript

import bareSymbolSubtitutor from '/imports/api/creature/computation/utility/bareSymbolSubtitutor.js';
import computeStat from '/imports/api/creature/computation/computeStat.js';
import math from '/imports/math.js';
export default function evaluateCalculation(string, memo){
if (!string) return string;
// Parse the string using mathjs
let calc;
try {
calc = math.parse(string);
} catch (e) {
return string;
}
// Ensure all symbol nodes are defined and coputed
calc.traverse(node => {
if (node.isSymbolNode){
let stat = memo.statsByVariableName[node.name];
if (stat && !stat.computationDetails.computed){
computeStat(stat, memo);
}
}
});
// Ensure any bare symbols are value accessors instead
let substitutedCalc = calc.transform(bareSymbolSubtitutor(memo.statsByVariableName));
// Evaluate the expression to a number or return with substitutions
try {
return substitutedCalc.evaluate(memo.statsByVariableName);
} catch (e){
return substitutedCalc.toString();
}
}