mathsteps-experimental-fork
Version:
Step by step math solutions. Experimental Fork
90 lines (87 loc) • 2.59 kB
JavaScript
import math from '../../config.js';
import clone from './clone.js';
import stepThrough from '../../simplifyExpression/index.js';
import { kemuNormalizeConstantNodes } from '../../simplifyExpression/kemuSimplifyCommonServices.js';
import { printAscii, printLatex } from '../../util/print.js';
const print = printAscii;
const CACHE_TEXT_TO_TEX = {};
const CACHE_TEXT_TO_NODE = {};
const ARRAY_OF_PREPROCESS_FUNCTIONS_BEFORE_PARSE = [];
const ARRAY_OF_PREPROCESS_FUNCTIONS_AFTER_PARSE = [];
const registerPreprocessorBeforeParse = (cb) => {
ARRAY_OF_PREPROCESS_FUNCTIONS_BEFORE_PARSE.push(cb);
};
const registerPreprocessorAfterParse = (cb) => {
ARRAY_OF_PREPROCESS_FUNCTIONS_AFTER_PARSE.push(cb);
};
const _postProcessResultTeX = (resultTeX) => {
return resultTeX.replace(":=", "=");
};
function printAsTeX(node) {
return _postProcessResultTeX(printLatex(node));
}
const _convertTextToTeXInternal = (text) => {
let rv = "";
const tokens = text.split("=");
let sep = "";
tokens.forEach((token) => {
token = token.trim();
if (token !== "") {
rv += sep + printAsTeX(parseText(token));
sep = "=";
}
});
return rv;
};
function convertTextToTeX(text) {
let rv = text;
if (text && text.trim() !== "") {
{
text = text.trim();
rv = CACHE_TEXT_TO_TEX[text];
if (rv == null) {
rv = _convertTextToTeXInternal(text);
CACHE_TEXT_TO_TEX[text] = rv;
}
}
}
return rv;
}
const _parseTextInternal = (text) => {
ARRAY_OF_PREPROCESS_FUNCTIONS_BEFORE_PARSE.forEach((preprocessFct) => {
text = preprocessFct(text);
});
text = text.replaceAll(/\b0[a-z]\b/gi, "0");
let rv = math.parse(text);
rv = kemuNormalizeConstantNodes(rv);
ARRAY_OF_PREPROCESS_FUNCTIONS_AFTER_PARSE.forEach((preprocessFct) => {
rv = preprocessFct(rv);
});
return rv;
};
function parseText(text) {
let rv = null;
{
text = text.trim();
rv = CACHE_TEXT_TO_NODE[text];
if (rv == null) {
rv = _parseTextInternal(text);
CACHE_TEXT_TO_NODE[text] = rv;
}
rv = clone(rv);
}
return rv;
}
const isOkAsSymbolicExpression = (expressionAsText) => {
let rv = false;
if (expressionAsText && expressionAsText.search(/-\s*-/) === -1) {
try {
const expressionNode = parseText(`${expressionAsText}*1`);
const steps = stepThrough.oldApi(expressionNode);
rv = steps.length > 0;
} catch (e) {
}
}
return rv;
};
export { convertTextToTeX, isOkAsSymbolicExpression, parseText, print, printAsTeX, registerPreprocessorAfterParse, registerPreprocessorBeforeParse };