UNPKG

mathpix-markdown-it

Version:

Mathpix-markdown-it is an open source implementation of the mathpix-markdown spec written in Typescript. It relies on the following open source libraries: MathJax v3 (to render math with SVGs), markdown-it (for standard Markdown parsing)

397 lines 19.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SerializedAsciiVisitor = void 0; var tslib_1 = require("tslib"); var MmlVisitor_js_1 = require("mathjax-full/js/core/MmlTree/MmlVisitor.js"); var handlers_1 = require("./handlers"); var common_1 = require("./common"); var helperA_1 = require("./helperA"); var SerializedAsciiVisitor = /** @class */ (function (_super) { tslib_1.__extends(SerializedAsciiVisitor, _super); function SerializedAsciiVisitor(options) { var _this = _super.call(this) || this; _this.options = null; /** Apply inherited attribute to all children */ _this.setChildInheritedAttribute = function (node, attrName) { var e_1, _a; try { var inherited = node.attributes.getAllInherited(); if (!inherited.hasOwnProperty(attrName) || !node.childNodes || !node.childNodes.length) { return; } try { for (var _b = tslib_1.__values(node.childNodes), _c = _b.next(); !_c.done; _c = _b.next()) { var child = _c.value; if (child.attributes) { child.attributes.setInherited(attrName, inherited[attrName]); } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } } catch (e) { console.log("[MMD]=>error=>", e); } }; _this.options = options; return _this; } SerializedAsciiVisitor.prototype.visitTree = function (node) { return this.visitNode(node, ''); }; SerializedAsciiVisitor.prototype.visitNode = function (node) { var args = []; for (var _i = 1; _i < arguments.length; _i++) { args[_i - 1] = arguments[_i]; } this.setChildInheritedAttribute(node, 'toTsv'); this.setChildInheritedAttribute(node, 'toCsv'); this.setChildInheritedAttribute(node, 'toMd'); this.setChildInheritedAttribute(node, 'flattenSup'); /** return super.visitNode(node, ...args); */ var handler = this.nodeHandlers.get(node.kind) || this.visitDefault; return handler.call.apply(handler, tslib_1.__spreadArray([this, node], tslib_1.__read(args), false)); }; SerializedAsciiVisitor.prototype.visitTextNode = function (node, space) { var res = { ascii: '', ascii_tsv: '', ascii_csv: '', ascii_md: '' }; try { res = (0, common_1.AddToAsciiData)(res, [node.getText()]); return res; } catch (e) { console.error('mml => visitTextNode =>', e); return res; } }; SerializedAsciiVisitor.prototype.visitXMLNode = function (node, space) { var res = { ascii: '', ascii_tsv: '', ascii_csv: '', ascii_md: '' }; try { res = (0, common_1.AddToAsciiData)(res, [space + node.getSerializedXML()]); return res; } catch (e) { console.error('mml => visitXMLNode =>', e); return res; } }; SerializedAsciiVisitor.prototype.needsGrouping = function (element) { try { if (element.parent && (element.parent.kind === 'math' || element.parent.kind === 'mstyle' || element.parent.kind === 'mtable' || element.parent.kind === 'mtr' || element.parent.kind === 'mtd' || element.parent.kind === 'menclose')) { return false; } if (this.options.extraBrackets) { if (element.parent.parent && (element.parent.parent.kind === 'msup' || element.parent.parent.kind === 'msub' || element.parent.parent.kind === 'msubsup' || element.parent.parent.kind === 'mover' || element.parent.parent.kind === 'munder' || element.parent.parent.kind === 'munderover')) { return false; } } if (element.parent.kind === 'TeXAtom' && element.parent.parent.kind === 'inferredMrow') { return false; } if (element.childNodes && element.childNodes.length === 1) { if (element.childNodes[0].childNodes && element.childNodes[0].childNodes.length === 1) { return false; } } if (element.properties && element.properties.open === '(' && element.properties.close === ')') { return false; } var firstChild = element.childNodes[0]; if (element.childNodes.length == 1 && firstChild.kind == 'mtext') { return false; } return true; } catch (e) { return false; } }; SerializedAsciiVisitor.prototype.needsGroupingStyle = function (element) { try { if (element.childNodes.length < 2) { return null; } var firstChild = element.childNodes[0]; var firstAtr = this.getAttributes(firstChild); if (!firstAtr || !firstAtr.mathvariant || !firstAtr.hasOwnProperty('mathvariant')) { return null; } for (var i = 1; i < element.childNodes.length; i++) { var atr = this.getAttributes(element.childNodes[i]); if (!atr || atr.mathvariant !== firstAtr.mathvariant) { return null; } } return firstAtr; } catch (e) { return null; } }; SerializedAsciiVisitor.prototype.visitInferredMrowNode = function (node, space) { var _this = this; var _a, _b; var res = { ascii: '', ascii_tsv: '', ascii_csv: '', ascii_md: '' }; try { var iclose = node.childNodes.findIndex(function (child) { return child.kind === 'menclose'; }); var hasFunc = node.childNodes.find(function (child) { return (child.kind === 'msub'); }); if (iclose > -1) { var mclose = node.childNodes[iclose]; var atr = this.getAttributes(mclose); var isFrame = mclose.attributes.get('isFrame'); if (((_b = (_a = mclose.childNodes[0]) === null || _a === void 0 ? void 0 : _a.childNodes[0]) === null || _b === void 0 ? void 0 : _b.kind) === 'mtable') { isFrame = true; } var atrDef = this.getAttributesDefaults(mclose); /** \longdiv */ if ((!atr.notation && atrDef.notation === "longdiv") || atr.notation.toString().indexOf("longdiv") !== -1) { if (iclose === 0) { var data = this.visitNode(mclose, ''); res = (0, common_1.AddToAsciiData)(res, [ "((".concat(data.ascii, ")/())"), "((".concat(data.ascii_tsv, ")/())"), "((".concat(data.ascii_csv, ")/())"), "((".concat(data.ascii_md, ")/())"), ]); } else { var mnList = []; var i = 1; while (iclose - i >= 0) { var child = node.childNodes[iclose - i]; mnList.unshift(child); i++; } if (iclose - mnList.length > 0) { for (var i_1 = 0; i_1 < iclose - mnList.length; i_1++) { var data = this.visitNode(node.childNodes[i_1], space); res = (0, common_1.AddToAsciiData)(res, [ data.ascii, data.ascii_tsv, data.ascii_csv, data.ascii_md ]); } } var dataDivisor = this.visitNode(mclose, ''); res = (0, common_1.AddToAsciiData)(res, ["(("]); res = (0, common_1.AddToAsciiData)(res, [dataDivisor.ascii, dataDivisor.ascii_tsv, dataDivisor.ascii_csv, dataDivisor.ascii_md]); res = (0, common_1.AddToAsciiData)(res, [")/("]); mnList.forEach(function (item) { var dataDividend = _this.visitNode(item, ''); res = (0, common_1.AddToAsciiData)(res, [dataDividend.ascii, dataDividend.ascii_tsv, dataDividend.ascii_csv, dataDividend.ascii_md]); }); res = (0, common_1.AddToAsciiData)(res, ["))"]); if (iclose < node.childNodes.length - 1) { for (var i_2 = iclose + 1; i_2 < node.childNodes.length; i_2++) { var data = this.visitNode(node.childNodes[i_2], space); res = (0, common_1.AddToAsciiData)(res, [data.ascii, data.ascii_tsv, data.ascii_csv, data.ascii_md]); } } } return res; } /** \lcm */ if (!isFrame && ((!atr.notation && atrDef.notation === "bottom") || atr.notation.toString().indexOf("bottom") !== -1)) { if (iclose === 0) { var data = this.visitNode(mclose, ''); res = (0, common_1.AddToAsciiData)(res, ['(()/(']); res = (0, common_1.AddToAsciiData)(res, [data.ascii, data.ascii_tsv, data.ascii_csv, data.ascii_md]); res = (0, common_1.AddToAsciiData)(res, ['))']); } else { var mnList = []; var i = 1; while (iclose - i >= 0) { var child = node.childNodes[iclose - i]; mnList.unshift(child); i++; } if (iclose - mnList.length > 0) { for (var i_3 = 0; i_3 < iclose - mnList.length; i_3++) { var data_1 = this.visitNode(node.childNodes[i_3], space); res = (0, common_1.AddToAsciiData)(res, [data_1.ascii, data_1.ascii_tsv, data_1.ascii_csv, data_1.ascii_md]); } } res = (0, common_1.AddToAsciiData)(res, ['((']); mnList.forEach(function (item) { var data = _this.visitNode(item, ''); res = (0, common_1.AddToAsciiData)(res, [data.ascii, data.ascii_tsv, data.ascii_csv, data.ascii_md]); }); res = (0, common_1.AddToAsciiData)(res, [')/(']); var data = this.visitNode(mclose, ''); res = (0, common_1.AddToAsciiData)(res, [data.ascii, data.ascii_tsv, data.ascii_csv, data.ascii_md]); res = (0, common_1.AddToAsciiData)(res, ['))']); if (iclose < node.childNodes.length - 1) { for (var i_4 = iclose + 1; i_4 < node.childNodes.length; i_4++) { var data_2 = this.visitNode(node.childNodes[i_4], space); res = (0, common_1.AddToAsciiData)(res, [data_2.ascii, data_2.ascii_tsv, data_2.ascii_csv, data_2.ascii_md]); } } } return res; } } var addParens = this.needsGrouping(node); var group = addParens ? this.needsGroupingStyle(node) : null; //TeXAtom var needBranch = node.parent && node.parent.kind === 'TeXAtom' && node.parent.Parent && node.parent.Parent.kind === 'mtd' && node.childNodes.length > 1; res = (0, common_1.AddToAsciiData)(res, [needBranch && hasFunc ? '{:' : '']); if (addParens && !group) { res = (0, common_1.AddToAsciiData)(res, ['(']); } var beforeAscii = ''; var childBefore = null; var parenthesisOpen = false; for (var j = 0; j < node.childNodes.length; j++) { var child = node.childNodes[j]; var data = this.visitNode(child, space); if (parenthesisOpen) { var text = (0, common_1.getFunctionNameFromAscii)(data.ascii, child); if (!text || helperA_1.regExpIsFunction.test(text)) { res = (0, common_1.AddToAsciiData)(res, [')']); parenthesisOpen = false; } } if ((child === null || child === void 0 ? void 0 : child.kind) === "mfrac" && (beforeAscii === null || beforeAscii === void 0 ? void 0 : beforeAscii.trim())) { var isFunction = childBefore.attributes.get('isFunction'); if (isFunction || helperA_1.regExpIsFunction.test(beforeAscii.trim()) || ((childBefore === null || childBefore === void 0 ? void 0 : childBefore.kind) === 'mo' && (childBefore === null || childBefore === void 0 ? void 0 : childBefore.texClass) === -1)) { res = (0, common_1.AddToAsciiData)(res, ['(']); parenthesisOpen = true; } } res = (0, common_1.AddToAsciiData)(res, [data.ascii, data.ascii_tsv, data.ascii_csv, data.ascii_md]); beforeAscii = res.ascii; childBefore = child; } if (parenthesisOpen) { res = (0, common_1.AddToAsciiData)(res, [')']); } if (addParens && !group) { res = (0, common_1.AddToAsciiData)(res, [')']); } res = (0, common_1.AddToAsciiData)(res, [needBranch && hasFunc ? ':}' : '']); return res; } catch (e) { return res; } }; SerializedAsciiVisitor.prototype.visitTeXAtomNode = function (node, space) { var _a, _b, _c, _d; var res = { ascii: '', ascii_tsv: '', ascii_csv: '', ascii_md: '', }; try { var children = this.childNodeMml(node, space + ' ', '\n'); if ((0, handlers_1.needFirstSpaceBeforeTeXAtom)(node)) { res = (0, common_1.AddToAsciiData)(res, [' ']); } res = (0, common_1.AddToAsciiData)(res, [ ((_a = children.ascii) === null || _a === void 0 ? void 0 : _a.match(/\S/)) ? children.ascii : '', ((_b = children.ascii_tsv) === null || _b === void 0 ? void 0 : _b.match(/\S/)) ? children.ascii_tsv : '', ((_c = children.ascii_csv) === null || _c === void 0 ? void 0 : _c.match(/\S/)) ? children.ascii_csv : '', ((_d = children.ascii_md) === null || _d === void 0 ? void 0 : _d.match(/\S/)) ? children.ascii_md : '', ]); if ((0, handlers_1.needLastSpaceAfterTeXAtom)(node)) { res = (0, common_1.AddToAsciiData)(res, [' ']); } return res; } catch (e) { console.error('mml => visitTeXAtomNode =>', e); return res; } }; SerializedAsciiVisitor.prototype.visitAnnotationNode = function (node, space) { var res = { ascii: '', ascii_tsv: '', ascii_csv: '', ascii_md: '', }; try { var data = this.childNodeMml(node, '', ''); res = (0, common_1.AddToAsciiData)(res, [ space + '<annotation' + this.getAttributes(node) + '>' + data.ascii + '</annotation>', space + '<annotation' + this.getAttributes(node) + '>' + data.ascii_tsv + '</annotation>', space + '<annotation' + this.getAttributes(node) + '>' + data.ascii_csv + '</annotation>', space + '<annotation' + this.getAttributes(node) + '>' + data.ascii_md + '</annotation>', ]); return res; } catch (e) { console.error('mml => visitAnnotationNode =>', e); return res; } }; SerializedAsciiVisitor.prototype.visitDefault = function (node, space) { return this.childNodeMml(node, ' ', ''); }; SerializedAsciiVisitor.prototype.childNodeMml = function (node, space, nl) { var handleCh = handlers_1.handle.bind(this); var res = { ascii: '', ascii_tsv: '', ascii_csv: '', ascii_md: '' }; try { if (node.kind === 'mover' && node.childNodes.length > 1 && node.childNodes[0].kind === 'TeXAtom' && node.childNodes[1].kind === 'TeXAtom') { var firstChild = node.childNodes[0]; firstChild.properties.needBrackets = true; var dataFirstChild = handleCh(firstChild, this); var dataChildNodes = handleCh(node.childNodes[1], this); res = (0, common_1.AddToAsciiData)(res, [dataFirstChild.ascii, dataFirstChild.ascii_tsv, dataFirstChild.ascii_csv, dataFirstChild.ascii_md]); res = (0, common_1.AddToAsciiData)(res, ['^']); res = (0, common_1.AddToAsciiData)(res, ['(']); res = (0, common_1.AddToAsciiData)(res, [dataChildNodes.ascii, dataChildNodes.ascii_tsv, dataChildNodes.ascii_csv, dataChildNodes.ascii_md]); res = (0, common_1.AddToAsciiData)(res, [')']); } else { var data = handleCh(node, this); res = (0, common_1.AddToAsciiData)(res, [data.ascii, data.ascii_tsv, data.ascii_csv, data.ascii_md]); } return res; } catch (e) { return res; } }; SerializedAsciiVisitor.prototype.getAttributes = function (node) { return node.attributes.getAllAttributes(); }; SerializedAsciiVisitor.prototype.getAttributesDefaults = function (node) { return node.attributes.getAllDefaults(); }; return SerializedAsciiVisitor; }(MmlVisitor_js_1.MmlVisitor)); exports.SerializedAsciiVisitor = SerializedAsciiVisitor; //# sourceMappingURL=index.js.map