quiz-interactions
Version:
A React UI component Library for quiz interaction types.
84 lines (66 loc) • 2.86 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.formulaSyntaxError = exports.variablesFromItemBody = void 0;
var _uniq = _interopRequireDefault(require("lodash/uniq"));
var _util = require("../components/formula/common/util");
var _formatMessage = _interopRequireDefault(require("@instructure/quiz-i18n/lib/format-message"));
var variablesFromItemBody = function variablesFromItemBody(itemBody) {
var body = itemBody || '';
var matches = body.match(/`[A-Za-z]+`/g) || [];
var matchesWithoutBackticks = matches.map(function (match) {
return match.replace(/`/g, '');
});
return (0, _uniq.default)(matchesWithoutBackticks).sort();
};
exports.variablesFromItemBody = variablesFromItemBody;
var formulaSyntaxError = function formulaSyntaxError(variables, formula) {
var substitutions = {};
variables.forEach(function (varName) {
return substitutions[varName] = 0;
}); // eslint-disable-line no-return-assign
try {
// TODO: This will fail if nothing has called components/formula/Edit/util/loadMathJs() yet.
// we should either change this function signature to return a promise and do
// loadMathjs().then(mathjs => mathjs.eval...) or make sure it is always preloaded by
// the time we get here.,
var math = _util.mathjsLoadingWrapper.mathjs; // we replace function e() with the constant e
// and function pi() with the constant pi
// this is to match legacy canvas quizzes behavior which accepted both e/pi and e()/pi()
var node = math.parse(formula);
var transformed = node.transform(function (node, path, parent) {
if (node.isFunctionNode && node.fn.isSymbolNode && node.fn.name === 'e') {
return new math.expression.node.ConstantNode(Math.E);
} else if (node.isFunctionNode && node.fn.isSymbolNode && node.fn.name === 'pi') {
return new math.expression.node.ConstantNode(Math.PI);
} else {
return node;
}
});
var compiled = transformed.compile();
compiled.eval(substitutions);
} catch (e) {
var message = e.message;
var match = message.match(/Undefined symbol ([A-Za-z]+)/);
if (match) {
return (0, _formatMessage.default)('Undefined symbol {symbol}', {
symbol: match[1]
});
}
match = message.match(/Unexpected end of expression/);
if (match) {
return (0, _formatMessage.default)('Unexpected end of expression');
}
match = message.match(/Unexpected operator ([^\s]+)/);
if (match) {
return (0, _formatMessage.default)('Unexpected operator {operator}', {
operator: match[1]
});
}
return (0, _formatMessage.default)('Invalid formula');
}
return null;
};
exports.formulaSyntaxError = formulaSyntaxError;