UNPKG

mathsteps-experimental-fork

Version:

Step by step math solutions. Experimental Fork

90 lines (87 loc) 2.59 kB
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 };