UNPKG

react-native-mathjax-html-to-svg

Version:

React Native component to display mathematics in html using MathJax. Uses [MathJax](https://github.com/mathjax/)

210 lines (209 loc) 9.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.NEW_OPS = exports.AmsMethods = void 0; var ParseUtil_js_1 = require("../ParseUtil.js"); var NodeUtil_js_1 = require("../NodeUtil.js"); var TexConstants_js_1 = require("../TexConstants.js"); var TexParser_js_1 = require("../TexParser.js"); var TexError_js_1 = require("../TexError.js"); var Symbol_js_1 = require("../Symbol.js"); var BaseMethods_js_1 = require("../base/BaseMethods.js"); var MmlNode_js_1 = require("../../../core/MmlTree/MmlNode.js"); exports.AmsMethods = {}; exports.AmsMethods.AmsEqnArray = function (parser, begin, numbered, taggable, align, spacing, style) { var args = parser.GetBrackets('\\begin{' + begin.getName() + '}'); var array = BaseMethods_js_1.default.EqnArray(parser, begin, numbered, taggable, align, spacing, style); return ParseUtil_js_1.default.setArrayAlign(array, args); }; exports.AmsMethods.AlignAt = function (parser, begin, numbered, taggable) { var name = begin.getName(); var n, valign, align = '', spacing = []; if (!taggable) { valign = parser.GetBrackets('\\begin{' + name + '}'); } n = parser.GetArgument('\\begin{' + name + '}'); if (n.match(/[^0-9]/)) { throw new TexError_js_1.default('PositiveIntegerArg', 'Argument to %1 must me a positive integer', '\\begin{' + name + '}'); } var count = parseInt(n, 10); while (count > 0) { align += 'rl'; spacing.push('0em 0em'); count--; } var spaceStr = spacing.join(' '); if (taggable) { return exports.AmsMethods.EqnArray(parser, begin, numbered, taggable, align, spaceStr); } var array = exports.AmsMethods.EqnArray(parser, begin, numbered, taggable, align, spaceStr); return ParseUtil_js_1.default.setArrayAlign(array, valign); }; exports.AmsMethods.Multline = function (parser, begin, numbered) { parser.Push(begin); ParseUtil_js_1.default.checkEqnEnv(parser); var item = parser.itemFactory.create('multline', numbered, parser.stack); item.arraydef = { displaystyle: true, rowspacing: '.5em', columnwidth: '100%', width: parser.options['multlineWidth'], side: parser.options['tagSide'], minlabelspacing: parser.options['tagIndent'] }; return item; }; exports.NEW_OPS = 'ams-declare-ops'; exports.AmsMethods.HandleDeclareOp = function (parser, name) { var limits = (parser.GetStar() ? '' : '\\nolimits\\SkipLimits'); var cs = ParseUtil_js_1.default.trimSpaces(parser.GetArgument(name)); if (cs.charAt(0) === '\\') { cs = cs.substr(1); } var op = parser.GetArgument(name); if (!op.match(/\\text/)) { op = op.replace(/\*/g, '\\text{*}').replace(/-/g, '\\text{-}'); } parser.configuration.handlers.retrieve(exports.NEW_OPS). add(cs, new Symbol_js_1.Macro(cs, exports.AmsMethods.Macro, ['\\mathop{\\rm ' + op + '}' + limits])); }; exports.AmsMethods.HandleOperatorName = function (parser, name) { var limits = (parser.GetStar() ? '' : '\\nolimits\\SkipLimits'); var op = ParseUtil_js_1.default.trimSpaces(parser.GetArgument(name)); if (!op.match(/\\text/)) { op = op.replace(/\*/g, '\\text{*}').replace(/-/g, '\\text{-}'); } parser.string = '\\mathop{\\rm ' + op + '}' + limits + ' ' + parser.string.slice(parser.i); parser.i = 0; }; exports.AmsMethods.SkipLimits = function (parser, _name) { var c = parser.GetNext(), i = parser.i; if (c === '\\' && ++parser.i && parser.GetCS() !== 'limits') { parser.i = i; } }; exports.AmsMethods.MultiIntegral = function (parser, name, integral) { var next = parser.GetNext(); if (next === '\\') { var i = parser.i; next = parser.GetArgument(name); parser.i = i; if (next === '\\limits') { if (name === '\\idotsint') { integral = '\\!\\!\\mathop{\\,\\,' + integral + '}'; } else { integral = '\\!\\!\\!\\mathop{\\,\\,\\,' + integral + '}'; } } } parser.string = integral + ' ' + parser.string.slice(parser.i); parser.i = 0; }; exports.AmsMethods.xArrow = function (parser, name, chr, l, r) { var def = { width: '+' + ParseUtil_js_1.default.Em((l + r) / 18), lspace: ParseUtil_js_1.default.Em(l / 18) }; var bot = parser.GetBrackets(name); var first = parser.ParseArg(name); var arrow = parser.create('token', 'mo', { stretchy: true, texClass: MmlNode_js_1.TEXCLASS.REL }, String.fromCodePoint(chr)); var mml = parser.create('node', 'munderover', [arrow]); var mpadded = parser.create('node', 'mpadded', [first], def); NodeUtil_js_1.default.setAttribute(mpadded, 'voffset', '.15em'); NodeUtil_js_1.default.setChild(mml, mml.over, mpadded); if (bot) { var bottom = new TexParser_js_1.default(bot, parser.stack.env, parser.configuration).mml(); mpadded = parser.create('node', 'mpadded', [bottom], def); NodeUtil_js_1.default.setAttribute(mpadded, 'voffset', '-.24em'); NodeUtil_js_1.default.setChild(mml, mml.under, mpadded); } NodeUtil_js_1.default.setProperty(mml, 'subsupOK', true); parser.Push(mml); }; exports.AmsMethods.HandleShove = function (parser, _name, shove) { var top = parser.stack.Top(); if (top.kind !== 'multline') { throw new TexError_js_1.default('CommandOnlyAllowedInEnv', '%1 only allowed in %2 environment', parser.currentCS, 'multline'); } if (top.Size()) { throw new TexError_js_1.default('CommandAtTheBeginingOfLine', '%1 must come at the beginning of the line', parser.currentCS); } top.setProperty('shove', shove); }; exports.AmsMethods.CFrac = function (parser, name) { var lr = ParseUtil_js_1.default.trimSpaces(parser.GetBrackets(name, '')); var num = parser.GetArgument(name); var den = parser.GetArgument(name); var lrMap = { l: TexConstants_js_1.TexConstant.Align.LEFT, r: TexConstants_js_1.TexConstant.Align.RIGHT, '': '' }; var numNode = new TexParser_js_1.default('\\strut\\textstyle{' + num + '}', parser.stack.env, parser.configuration).mml(); var denNode = new TexParser_js_1.default('\\strut\\textstyle{' + den + '}', parser.stack.env, parser.configuration).mml(); var frac = parser.create('node', 'mfrac', [numNode, denNode]); lr = lrMap[lr]; if (lr == null) { throw new TexError_js_1.default('IllegalAlign', 'Illegal alignment specified in %1', parser.currentCS); } if (lr) { NodeUtil_js_1.default.setProperties(frac, { numalign: lr, denomalign: lr }); } parser.Push(frac); }; exports.AmsMethods.Genfrac = function (parser, name, left, right, thick, style) { if (left == null) { left = parser.GetDelimiterArg(name); } if (right == null) { right = parser.GetDelimiterArg(name); } if (thick == null) { thick = parser.GetArgument(name); } if (style == null) { style = ParseUtil_js_1.default.trimSpaces(parser.GetArgument(name)); } var num = parser.ParseArg(name); var den = parser.ParseArg(name); var frac = parser.create('node', 'mfrac', [num, den]); if (thick !== '') { NodeUtil_js_1.default.setAttribute(frac, 'linethickness', thick); } if (left || right) { NodeUtil_js_1.default.setProperty(frac, 'withDelims', true); frac = ParseUtil_js_1.default.fixedFence(parser.configuration, left, frac, right); } if (style !== '') { var styleDigit = parseInt(style, 10); var styleAlpha = ['D', 'T', 'S', 'SS'][styleDigit]; if (styleAlpha == null) { throw new TexError_js_1.default('BadMathStyleFor', 'Bad math style for %1', parser.currentCS); } frac = parser.create('node', 'mstyle', [frac]); if (styleAlpha === 'D') { NodeUtil_js_1.default.setProperties(frac, { displaystyle: true, scriptlevel: 0 }); } else { NodeUtil_js_1.default.setProperties(frac, { displaystyle: false, scriptlevel: styleDigit - 1 }); } } parser.Push(frac); }; exports.AmsMethods.HandleTag = function (parser, name) { if (!parser.tags.currentTag.taggable && parser.tags.env) { throw new TexError_js_1.default('CommandNotAllowedInEnv', '%1 not allowed in %2 environment', parser.currentCS, parser.tags.env); } if (parser.tags.currentTag.tag) { throw new TexError_js_1.default('MultipleCommand', 'Multiple %1', parser.currentCS); } var star = parser.GetStar(); var tagId = ParseUtil_js_1.default.trimSpaces(parser.GetArgument(name)); parser.tags.tag(tagId, star); }; exports.AmsMethods.HandleNoTag = BaseMethods_js_1.default.HandleNoTag; exports.AmsMethods.HandleRef = BaseMethods_js_1.default.HandleRef; exports.AmsMethods.Macro = BaseMethods_js_1.default.Macro; exports.AmsMethods.Accent = BaseMethods_js_1.default.Accent; exports.AmsMethods.Tilde = BaseMethods_js_1.default.Tilde; exports.AmsMethods.Array = BaseMethods_js_1.default.Array; exports.AmsMethods.Spacer = BaseMethods_js_1.default.Spacer; exports.AmsMethods.NamedOp = BaseMethods_js_1.default.NamedOp; exports.AmsMethods.EqnArray = BaseMethods_js_1.default.EqnArray;