Files
DiceCloud/app/imports/api/creature/computation/evaluateCalculation.js
2020-04-23 14:26:05 +02:00

32 lines
858 B
JavaScript

import computedValueOfVariableName from '/imports/api/creature/computation/computedValueOfVariableName.js'
import * as math from 'mathjs';
export default function evaluateCalculation(string, memo){
if (!string) return string;
// Parse the string using mathjs
let calc;
try {
calc = math.parse(string);
} catch (e) {
console.error(e);
return string;
}
// Replace all symbols with known values
let substitutedCalc = calc.transform(node => {
if (node.isSymbolNode) {
let val = computedValueOfVariableName(node.name, memo);
if (val === null) return node;
return new math.ConstantNode(val);
}
else {
return node;
}
});
// Evaluate the expression to a number or return with substitutions
try {
return substitutedCalc.eval();
} catch (e){
return substitutedCalc.toString();
}
}