UNPKG

shikiml

Version:

Markup mathematical formulae by ASCII-art

1,240 lines (1,169 loc) 231 kB
/** * shikiml * * Copyright (c) 2017 Yuichiro MORIGUCHI * * This software is released under the MIT License. * http://opensource.org/licenses/mit-license.php **/ (function(S) { var gl = Function("return this")(); var defaultOptions = { greekBytes: 2, mathBytes: 2, debuglog: function() {}, iteration: 100000, className: "shiki", scriptType: "text/x-shiki", useAtAsRoundD: true, useQuantumBracket: true, useVerticalBarAsDifference: true, useUnicodeSigmaAsSum: true, useUnicodePiAsProduct: false, usePlanckConstant: true }; function extend(base, extension) { var i, res = {}; for(i in base) { if(base.hasOwnProperty(i)) { res[i] = base[i]; } } for(i in extension) { if(extension.hasOwnProperty(i)) { res[i] = extension[i]; } } return res; } function shiki(input, option) { var me, OUTSIDEX, OUTSIDEY, OUTSIDEXY, twoBytesStr = '', TWOBYTES, opt, printableREStr, printableRE, decorateBold, BITMASK = 1048576; opt = extend(defaultOptions, option); if(opt.greekBytes === 2) { twoBytesStr += '\u0391-\u03A9\u03b1-\u03c1\u03c3-\u03c9'; } if(opt.mathBytes === 2) { twoBytesStr += '\u00ac\u00b1\u00d7\u00f7' + '\u2020\u2021\u2026' + '\u2200\u2202\u2203\u2205\u2207-\u2209\u220b\u2212\u2213\u221d-\u2220\u2225-\u222c\u222e' + '\u2234\u2235\u223d\u2243\u2245\u2248\u2252\u2260-\u2262\u2266\u2267\u226a\u226b\u2276\u2277' + '\u2282-\u2287\u228a\u228b\u2295-\u2297\u22a5\u22bf\u22da\u22db\u2605\u2606' + '\u29bf\uff01-\uff60\uffe0-\uffe6'; } decorateBold = function(x) { return new BoldMathJax(x) }; twoBytesStr += '\u2e80-\u2eff\u3000-\u30ff\u3300-\u4dbf\u4e00-\u9fff\uac00-\ud7af\uf900-\ufaff\ufe30-\ufe4f'; TWOBYTES = new RegExp('[' + twoBytesStr + ']'); printableREStr = '\x21-\x7e\xa1-\xac\xae-\u0377\u037a-\u037e\u0384-\u038a\u038c\u038e-\u03a1\u03a3-\u0527' + '\u0531-\u0556\u0559-\u055f\u0561-\u0587\u0589-\u058a\u0591-\u05c7\u05d0-\u05ea\u05f0-\u05f4\u0606-\u061b' + '\u061e-\u06dc\u06de-\u070d\u0710-\u074a\u074d-\u07b1\u07c0-\u07fa\u0800-\u082d\u0830-\u083e\u0840-\u085b' + '\u085e\u0900-\u0977\u0979-\u097f\u0981-\u0983\u0985-\u098c\u098f-\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2' + '\u09b6-\u09b9\u09bc-\u09c4\u09c7-\u09c8\u09cb-\u09ce\u09d7\u09dc-\u09dd\u09df-\u09e3\u09e6-\u09fb\u0a01-\u0a03' + '\u0a05-\u0a0a\u0a0f-\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32-\u0a33\u0a35-\u0a36\u0a38-\u0a39\u0a3c\u0a3e-\u0a42' + '\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91' + '\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2-\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3' + '\u0ae6-\u0aef\u0af1\u0b01-\u0b03\u0b05-\u0b0c\u0b0f-\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32-\u0b33\u0b35-\u0b39' + '\u0b3c-\u0b44\u0b47-\u0b48\u0b4b-\u0b4d\u0b56-\u0b57\u0b5c-\u0b5d\u0b5f-\u0b63\u0b66-\u0b77\u0b82-\u0b83' + '\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99-\u0b9a\u0b9c\u0b9e-\u0b9f\u0ba3-\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9' + '\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bfa\u0c01-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10' + '\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c58-\u0c59' + '\u0c60-\u0c63\u0c66-\u0c6f\u0c78-\u0c7f\u0c82-\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3' + '\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5-\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1-\u0cf2' + '\u0d02-\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d57\u0d60-\u0d63' + '\u0d66-\u0d75\u0d79-\u0d7f\u0d82-\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca' + '\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2-\u0df4\u0e01-\u0e3a\u0e3f-\u0e5b\u0e81-\u0e82\u0e84\u0e87-\u0e88\u0e8a' + '\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa-\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4' + '\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edd\u0f00-\u0f47\u0f49-\u0f6c\u0f71-\u0f97\u0f99-\u0fbc\u0fbe-\u0fcc' + '\u0fce-\u0fda\u1000-\u10c5\u10d0-\u10fc\u1100-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288' + '\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315' + '\u1318-\u135a\u135d-\u137c\u1380-\u1399\u13a0-\u13f4\u1400-\u167f\u1681-\u169c\u16a0-\u16f0\u1700-\u170c' + '\u170e-\u1714\u1720-\u1736\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772-\u1773\u1780-\u17b3\u17b6-\u17dd' + '\u17e0-\u17e9\u17f0-\u17f9\u1800-\u180d\u1810-\u1819\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191c' + '\u1920-\u192b\u1930-\u193b\u1940\u1944-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19da\u19de-\u1a1b' + '\u1a1e-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa0-\u1aad\u1b00-\u1b4b\u1b50-\u1b7c\u1b80-\u1baa' + '\u1bae-\u1bb9\u1bc0-\u1bf3\u1bfc-\u1c37\u1c3b-\u1c49\u1c4d-\u1c7f\u1cd0-\u1cf2\u1d00-\u1de6\u1dfc-\u1f15' + '\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fc4' + '\u1fc6-\u1fd3\u1fd6-\u1fdb\u1fdd-\u1fef\u1ff2-\u1ff4\u1ff6-\u1ffe\u2010-\u2027\u2030-\u205e\u2070-\u2071' + '\u2074-\u208e\u2090-\u209c\u20a0-\u20b9\u20d0-\u20f0\u2100-\u2189\u2190-\u23f3\u2400-\u2426\u2440-\u244a' + '\u2460-\u26ff\u2701-\u27ca\u27cc\u27ce-\u2b4c\u2b50-\u2b59\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2cf1\u2cf9-\u2d25' + '\u2d30-\u2d65\u2d6f-\u2d70\u2d7f-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6' + '\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2e31\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb' + '\u3001-\u303f\u3041-\u3096\u3099-\u30ff\u3105-\u312d\u3131-\u318e\u3190-\u31ba\u31c0-\u31e3\u31f0-\u321e' + '\u3220-\u32fe\u3300-\u4db5\u4dc0-\u9fcb\ua000-\ua48c\ua490-\ua4c6\ua4d0-\ua62b\ua640-\ua673\ua67c-\ua697' + '\ua6a0-\ua6f7\ua700-\ua78e\ua790-\ua791\ua7a0-\ua7a9\ua7fa-\ua82b\ua830-\ua839\ua840-\ua877\ua880-\ua8c4' + '\ua8ce-\ua8d9\ua8e0-\ua8fb\ua900-\ua953\ua95f-\ua97c\ua980-\ua9cd\ua9cf-\ua9d9\ua9de-\ua9df\uaa00-\uaa36' + '\uaa40-\uaa4d\uaa50-\uaa59\uaa5c-\uaa7b\uaa80-\uaac2\uaadb-\uaadf\uab01-\uab06\uab09-\uab0e\uab11-\uab16' + '\uab20-\uab26\uab28-\uab2e\uabc0-\uabed\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa2d' + '\ufa30-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44' + '\ufb46-\ufbc1\ufbd3-\ufd3f\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfd\ufe00-\ufe19\ufe20-\ufe26\ufe30-\ufe52' + '\ufe54-\ufe66\ufe68-\ufe6b\ufe70-\ufe74\ufe76-\ufefc\uff01-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7' + '\uffda-\uffdc\uffe0-\uffe6\uffe8-\uffee\ufffc-\ufffd'; printableRE = new RegExp('[\n' + printableREStr + ']'); var mathChars = { 'Α': '\\Alpha', 'α': '\\alpha', 'Β': '\\Beta', 'β': '\\beta', 'Γ': '\\Gamma', 'γ': '\\gamma', 'Δ': '\\Delta', 'δ': '\\delta', 'Ε': '\\Epsilon', 'ε': '\\epsilon', 'Ζ': '\\Zeta', 'ζ': '\\zeta', 'Η': '\\Eta', 'η': '\\eta', 'Θ': '\\Theta', 'θ': '\\theta', 'Ι': '\\Iota', 'ι': '\\iota', 'Κ': '\\Kappa', 'κ': '\\kappa', 'Λ': '\\Lambda', 'λ': '\\lambda', 'Μ': '\\Mu', 'μ': '\\mu', 'Ν': '\\Nu', 'ν': '\\nu', 'Ξ': '\\Xi', 'ξ': '\\xi', 'Ο': 'O', 'ο': 'o', 'Π': '\\Pi', 'π': '\\pi', 'Ρ': '\\Rho', 'ρ': '\\rho', 'Σ': '\\Sigma', 'σ': '\\sigma', 'Τ': '\\Tau', 'τ': '\\tau', 'Υ': '\\Upsilon', 'υ': '\\upsilon', 'Φ': '\\Phi', 'φ': '\\phi', 'Χ': '\\Chi', 'χ': '\\chi', 'Ψ': '\\Psi', 'ψ': '\\psi', 'Ω': '\\Omega', 'ω': '\\omega', '°': '^\\circ', '△': '\\triangle', '□': '\\Box', '†': '\\dagger', '‡': '\\ddagger', '★': '\\star', '☆': '\\star', '…': '\\cdots', '*': '*', '+': '+', '-': '-', '.': '.', '<': '<', '=': '=', '>': '>', '@': '@', '~': '\\sim', '\u301c': '\\sim', '\u00ac': '\\lnot', '\u00b1': '\\pm', '\u00d7': '\\times', '\u00f7': '\\div', '\u2200': '\\forall', '\u2202': '\\partial', '\u2203': '\\exists', '\u2205': '\\emptyset', '\u2207': '\\nabla', '\u2208': '\\in', '\u2209': '\\notin', '\u220b': '\\ni', '\u2212': '-', '\u2213': '\\mp', '\u221d': '\\propto', '\u221e': '\\infty', //'\u221f': '\\rightangle', '\u2220': '\\angle', '\u2225': '\\parallel', '\u2226': '\\nparallel', '\u2227': '\\land', '\u2228': '\\lor', '\u2229': '\\cap', '\u222a': '\\cup', '\u2234': '\\therefore', '\u2235': '\\because', //'\u223d': '\\varpropto', '\u2243': '\\simeq', '\u2245': '\\cong', '\u2248': '\\approx', '\u2252': '\\simeq', '\u2260': '\\neq', '\u2261': '\\equiv', '\u2262': '\\not\\equiv', '\u2266': '\\leq', '\u2267': '\\geq', '\u226a': '\\ll', '\u226b': '\\gg', '\u2276': '\\lessgtr', '\u2277': '\\gtrless', '\u2282': '\\subset', '\u2283': '\\supset', '\u2284': '\\not\\subset', '\u2285': '\\not\\supset', '\u2286': '\\subseteq', '\u2287': '\\supseteq', '\u228a': '\\subsetneq', '\u228b': '\\supsetneq', '\u2295': '\\oplus', '\u2296': '\\ominus', '\u2297': '\\otimes', '\u22a5': '\\perp', '\u22bf': '\\triangle', '\u22c5': '\\cdot', '\u22da': '\\lesseqgtr', '\u22db': '\\gtreqless', '\u29bf': '\\odot', '\u30fb': '\\cdot' }; var mathSequence = { ' *': '\\times', ' .': '\\cdot', '+-': '\\pm', '-+': '\\mp', '!=': '\\neq', '=/=': '\\neq', '_|_': '\\perp', '<-': '\\leftarrow', '<=': '\\Leftarrow', '<--': '\\longleftarrow', '<==': '\\Longleftarrow', '->': '\\to', '=>': '\\Rightarrow', '-->': '\\longrightarrow', '==>': '\\Longrightarrow', '<->': '\\leftrightarrow', '<=>': '\\Leftrightarrow', '<-->': '\\longleftrightarrow', '<==>': '\\Longleftrightarrow', '|=': '\\models', '|->': '\\mapsto', '<': '\\lt', '>': '\\gt', '=<': '\\leq', '>=': '\\geq', '>>': '\\ll', '>>>': '\\lll', '<<': '\\gg', '<<<': '\\ggg', ' |-': '\\vdash', ' -|': '\\dashv', '~': '\\sim', '~<': '\\lesssim', '>~': '\\gtrsim', '||': '\\parallel', 'oo': '\\infty', '...': '\\cdots', 'sin': '\\sin', 'cos': '\\cos', 'tan': '\\tan', 'csc': '\\csc', 'cosec': '\\csc', 'sec': '\\sec', 'cot': '\\cot', 'arcsin': '\\arcsin', 'arccos': '\\arccos', 'arctan': '\\arctan', 'asin': '\\arcsin', 'acos': '\\arccos', 'atan': '\\arctan', 'sinh': '\\sinh', 'cosh': '\\cosh', 'tanh': '\\tanh', 'coth': '\\coth', 'exp': '\\exp', 'log': '\\log', 'ln': '\\ln', 'max': '\\max', 'min': '\\min', 'lim': '\\lim', 'Pr': '\\Pr', 'gd': '\\mathrm{gd}\\,', 'grad': '\\mathrm{grad}\\,', 'rot': '\\mathrm{rot}\\,', 'div': '\\mathrm{div}\\,', 'Tr': '\\mathrm{Tr}\\,', 'det': '\\mathrm{det}\\,', 'sinc': '\\mathrm{sinc}\\,', 'if': '\\mathrm{if}\\ ', 'iff': '\\mathrm{iff}\\ ', 'otherwise': '\\mathrm{otherwise}\\ ' }; me = {}; function cell(ch) { var me, processed = false, st; me = {}; st = String.fromCharCode(ch); me.getChar = function() { return st; }; me.getCharCode = function() { return ch; }; me.isProcessed = function() { return processed; }; me.markProcessed = function() { processed = true; }; me.isMarkStart = function() { return me.markReturn.length > 0; }; me.markTemp = false; me.markFraction = false; me.markBinomialBorder = false; me.markRoot = false; me.markRootNum = false; me.markRootEnd = 0; me.markRootEndProcessed = 0; me.markRootWall = false; me.markRootBase = false; me.markRootProcessed = false; me.markRootStartV = false; me.markRootWallInner = false; me.markRootNumRet = false; me.markPow = false; me.markPowProcessed = false; me.markPowRight = false; me.markSubPowProcessed = false; me.markSub = false; me.markSubRet = false; me.markSumStart = false; me.markSumSign = false; me.markSumBase = false; me.markSumRight = false; me.markIgnoreSubPow = false; me.markIntTempStart = false; me.markSumMathSign = ''; me.markReturn = []; me.markNumberOfRootV = []; me.markMatrixRange = 0; me.markMatrixStart = false; me.markMatrixRowSeparator = false; me.markMatrixRowLine = false; me.markMatrixColLine = false; me.markMatrixProcessed = false; me.markMatrixRowLineBase = false; me.markMatrixInit = false; me.markAccent = false; me.markCasesRange = false; me.markCasesStart = false; me.markCasesRowSeparator = false; me.markCmbTemp = false; me.markCmbFound = false; me.markCmbBoundary = false; me.markMinusTemp = false; me.markParenTemp = false; me.markMiddleBar = false; me.isOutsideX = function() { return ch === -1 || ch === -3; }; me.isOutsideY = function() { return ch === -2 || ch === -3; }; me.isPrintable = function() { if(ch < 0) { return false; } return printableRE.test(me.getChar()); }; me.isWhitespace = function() { return /[ \t\n]/.test(me.getChar()); }; me.isOperator = function() { return /[+\-\*\/=]/.test(me.getChar()); }; me.isVector = function() { return /[>]/.test(me.getChar()) && !processed; }; me.isTraversed = function() { return processed || me.markRootWall || me.markSumSign; }; me.isBoundY = function() { return (me.isOutsideY() || me.markMatrixRowSeparator || me.markCasesRowSeparator || me.isTraversed() || me.markTemp || me.markSumBase); }; me.isRootEnd = function() { return me.markRootEnd || me.markRootWall; }; me.isMatrixEnd = function() { return (me.markReturn[0] === 'INIT' || me.markReturn[me.markReturn.length - 1] === 'FRAC1' || me.markReturn[me.markReturn.length - 1] === 'FRAC2' || me.markReturn[me.markReturn.length - 1] === 'ROOTBASE' || me.markReturn[me.markReturn.length - 1] === 'POW' || me.markReturn[me.markReturn.length - 1] === 'POW_AFTER_SUB' || me.markReturn[me.markReturn.length - 1] === 'SUB'); }; return me; } OUTSIDEX = cell(-1); OUTSIDEY = cell(-2); OUTSIDEXY = cell(-3); function isTwoBytes(ch) { return TWOBYTES.test(ch); } function quadroLength(str) { var xLen = 0, j; for(j = 0; j < str.length; j++) { xLen += isTwoBytes(str.charAt(j)) ? 2 : 1; } return xLen; } function quadro() { var me, quadro = [], ilist, xMax = 0, xLen, i, j, k, yPos = 0, xPos = 0, upfunctions, builder = '', builderUpper = [], builderSub = '', models = [], isbar = false, beforech = [], texcharFn = false, istex = false, isquote = false, boldmath = false, boldskip = false, boldFn, quantumBracket = false, isprime = 0; upfunctions = { '_': function(x) { if(x === 'h' && opt.usePlanckConstant) { return "\\hbar"; } else { return "\\bar{" + x + "}"; } }, '~': function(x) { return "\\tilde{" + x + "}"; }, '.': function(x) { return "\\dot{" + x + "}"; }, '^': function(x) { return "\\hat{" + x + "}"; }, 'v': function(x) { return "\\check{" + x + "}"; }, "'": function(x) { return "\\acute{" + x + "}"; }, '`': function(x) { return "\\grave{" + x + "}"; }, '=': function(x) { return "\\bar{\\bar{" + x + "}}"; }, '-': function(x) { return "\\vec{" + x + "}"; } }; boldFn = { '|': function(x) { return new MathDecorate(x, "\\mathbb"); }, '/': function(x) { return new MathDecorate(x, "\\mathcal"); }, '*': function(x) { return new MathDecorate(x, "\\mathfrak"); } }; function getUpfunction() { var up, res; up = getPosRel(0, -1); if(!up.isTraversed() && !!(res = upfunctions[up.getChar()])) { return res; } else { return false; } } function getPos(x, y) { if(y < 0 || y >= ilist.length) { return x < 0 || x >= xMax ? OUTSIDEXY : OUTSIDEY; } else if(x < 0 || x >= xMax) { return OUTSIDEX; } else { return quadro[y][x]; } } function getPosRel(x, y) { return getPos(xPos + x, yPos + y); } function getPosRelChar(x, y) { var cell; cell = getPosRel(x, y); if(cell === OUTSIDEX || cell === OUTSIDEY) { return ' '; } else { return cell.getChar(); } } function isSumAscii(yoffset) { return (getPosRelChar(0, 0 + yoffset) === ' ' && getPosRelChar(1, 0 + yoffset) === '>' && getPosRelChar(0, -1 + yoffset) === '-' && getPosRelChar(1, -1 + yoffset) === '-' && getPosRelChar(2, -1 + yoffset) === '-' && getPosRelChar(0, 1 + yoffset) === '-' && getPosRelChar(1, 1 + yoffset) === '-' && getPosRelChar(2, 1 + yoffset) === '-' && !getPosRel(1, 0 + yoffset).markSumSign && !getPosRel(0, -1 + yoffset).markSumSign && !getPosRel(1, -1 + yoffset).markSumSign && !getPosRel(2, -1 + yoffset).markSumSign && !getPosRel(0, 1 + yoffset).markSumSign && !getPosRel(1, 1 + yoffset).markSumSign); } function isSumAsciiShort(yoffset) { var up = getPosRelChar(0, -1 + yoffset), cn = getPosRelChar(0, 0 + yoffset), dn = getPosRelChar(0, 1 + yoffset); return (/[\-_]/.test(up) && cn === '>' && /[\-]/.test(dn) && !getPosRel(0, 0 + yoffset).markSumSign && !getPosRel(0, -1 + yoffset).markSumSign && !getPosRel(0, -1 + yoffset).markSumSign); } function isIntAscii(yoffset, center) { return (getPosRelChar(0, 0 + yoffset) === ' ' && getPosRelChar(1, 0 + yoffset) === center && getPosRelChar(1, -1 + yoffset) === '/' && getPosRelChar(2, -1 + yoffset) === '\\' && getPosRelChar(0, 1 + yoffset) === '\\' && getPosRelChar(1, 1 + yoffset) === '/' && !getPosRel(1, 0 + yoffset).markSumSign && !getPosRel(1, -1 + yoffset).markSumSign && !getPosRel(2, -1 + yoffset).markSumSign && !getPosRel(0, 1 + yoffset).markSumSign && !getPosRel(1, 1 + yoffset).markSumSign); } function isProdAscii(yoffset) { return (getPosRelChar(0, 0 + yoffset) === ' ' && getPosRelChar(1, 0 + yoffset) === '|' && getPosRelChar(2, 0 + yoffset) === ' ' && getPosRelChar(3, 0 + yoffset) === '|' && getPosRelChar(0, -1 + yoffset) === '_' && getPosRelChar(1, -1 + yoffset) === '_' && getPosRelChar(2, -1 + yoffset) === '_' && getPosRelChar(3, -1 + yoffset) === '_' && getPosRelChar(4, -1 + yoffset) === '_' && getPosRelChar(0, 1 + yoffset) === ' ' && getPosRelChar(1, 1 + yoffset) === '|' && getPosRelChar(2, 1 + yoffset) === ' ' && !getPosRel(3, 1 + yoffset).markSumSign && !getPosRel(1, 0 + yoffset).markSumSign && !getPosRel(3, 0 + yoffset).markSumSign && !getPosRel(0, -1 + yoffset).markSumSign && !getPosRel(1, -1 + yoffset).markSumSign && !getPosRel(2, -1 + yoffset).markSumSign && !getPosRel(3, -1 + yoffset).markSumSign && !getPosRel(4, -1 + yoffset).markSumSign && !getPosRel(1, 1 + yoffset).markSumSign && !getPosRel(3, 1 + yoffset).markSumSign); } function isProdAsciiShort(yoffset) { return (getPosRelChar(0, 0) === 'T' && getPosRelChar(1, 0) === 'T' && !getPosRel(0, 0).markSumSign && !getPosRel(1, 0).markSumSign); } function isSumMulti() { return (opt.useUnicodeSigmaAsSum && getPosRelChar(0, 0) === '\n' && (getPosRelChar(1, 0) === 'Σ' || getPosRelChar(1, 0) === '\u2211') && !getPosRel(1, 0).markSumSign); } function isIntMulti() { return (getPosRelChar(0, 0) === '\n' && getPosRelChar(1, 0) === '\u222B' && !getPosRel(1, 0).markSumSign); } function isDintMulti() { return (getPosRelChar(0, 0) === '\n' && getPosRelChar(1, 0) === '\u222C' && !getPosRel(1, 0).markSumSign); } function isOintMulti() { return (getPosRelChar(0, 0) === '\n' && getPosRelChar(1, 0) === '\u222E' && !getPosRel(1, 0).markSumSign); } function isProdMulti() { return (opt.useUnicodePiAsProduct && getPosRelChar(0, 0) === '\n' && getPosRelChar(1, 0) === 'Π' && !getPosRel(1, 0).markSumSign); } function isCupMulti() { return (getPosRelChar(0, 0) === '\n' && getPosRelChar(1, 0) === '\u222a' && !getPosRel(1, 0).markSumSign && getPosRel(2, 0).isWhitespace()); } function isCapMulti() { return (getPosRelChar(0, 0) === '\n' && getPosRelChar(1, 0) === '\u2229' && !getPosRel(1, 0).markSumSign && getPosRel(2, 0).isWhitespace()); } function isLorMulti() { return (getPosRelChar(0, 0) === '\n' && getPosRelChar(1, 0) === '\u2228' && !getPosRel(1, 0).markSumSign && getPosRel(2, 0).isWhitespace()); } function isLandMulti() { return (getPosRelChar(0, 0) === '\n' && getPosRelChar(1, 0) === '\u2227' && !getPosRel(1, 0).markSumSign && getPosRel(2, 0).isWhitespace()); } function isVdots() { return (getPosRelChar(0, 0) === '.' && getPosRelChar(0, 1) === '.' && getPosRelChar(0, 2) === '.'); } function isDdots() { return (getPosRelChar(0, 0) === '.' && getPosRelChar(0, 1) === ' ' && getPosRelChar(0, 2) === ' ' && getPosRelChar(1, 0) === ' ' && getPosRelChar(1, 1) === '.' && getPosRelChar(1, 2) === ' ' && getPosRelChar(2, 0) === ' ' && getPosRelChar(2, 1) === ' ' && getPosRelChar(2, 2) === '.'); } function isPerp() { return (getPosRelChar(-1, 0) === '_' && getPosRelChar( 0, 0) === '|' && getPosRelChar( 1, 0) === '_'); } function isModels() { return (getPosRelChar( 0, 0) === '|' && getPosRelChar( 1, 0) === '='); } function isVdash() { return (getPosRelChar(-1, 0) === ' ' && getPosRelChar( 0, 0) === '|' && getPosRelChar( 1, 0) === '-' && getPosRelChar( 2, 0) === ' '); } function isDashv() { return (getPosRelChar(-2, 0) === ' ' && getPosRelChar(-1, 0) === '-' && getPosRelChar( 0, 0) === '|' && getPosRelChar( 1, 0) === ' '); } function isParallel1() { return (getPosRelChar( 0, 0) === '|' && getPosRelChar( 1, 0) === '|'); } function isParallel2() { return (getPosRelChar(-1, 0) === '|' && getPosRelChar( 0, 0) === '|'); } function isMapsto() { return (getPosRelChar( 0, 0) === '|' && getPosRelChar( 1, 0) === '-' && getPosRelChar( 2, 0) === '>'); } function isOperatorWithBar() { return (isPerp() || isModels() || isVdash() || isDashv() || isParallel1() || isParallel2() || isMapsto()); } function builderToChar(len) { var j, l, up; l = len === void(0) ? builder.length : len; for(j = 0; j < l; j++) { up = builderUpper[j]; up = up ? up : function(x) { return x; }; me.addModel(new Printable(up(builder.charAt(j)))); } } function matchMathSequence(func) { var i, a, maxi = '', maxa; for(i in mathSequence) { if((a = builder.indexOf(i)) >= 0) { if(maxi.length < i.length) { maxi = i; maxa = a; } } } if(maxi) { builderToChar(maxa); builder = builder.substring(maxi.length + maxa, builder.length); me.addModel(new Printable(mathSequence[maxi] + ' ')); if(func) { func(); } return true; } else { return false; } } function hasSuperSubScript(direction) { var y = yPos + direction, cell; for(; !(cell = getPos(xPos, y)).isBoundY(); y += direction) { if(cell.isPrintable() && !me.isCellBar()) { return true; } } return false; } function hasSuperSubBound(direction) { var y = yPos + direction, cell; for(;; y += direction) { cell = getPos(xPos, y); if(cell.isPrintable() && cell.markTemp) { return true; } else if(cell.isBoundY() || !cell.isWhitespace()) { return false; } } } function isMatrixByScanning(direction) { var i, cell, ch, barcount; if(!((me.get().getChar() === '\\' && direction < 0) || (me.get().getChar() === '/' && direction > 0) || me.get().getChar() === '-' || me.get().getChar() === '|')) { return false; } barcount = me.get().getChar() === '|' ? 1 : 0; for(i = direction;; i += direction) { cell = getPosRel(0, i); ch = cell.getChar(); if((ch === '/' && direction < 0) || (ch === '\\' && direction > 0) || ch === '-') { return barcount > 0; } else if(ch !== '|') { return barcount > 1; } else { barcount++; } } } function moveMatrix(direction) { function moveHead(direction) { if(direction < 0) { me.moveUp(); } else { me.moveDown(); } } moveHead(direction); } function isMarkRootEndOrProcessedBelow(threshold, prop) { var i, cell, th = threshold ? threshold : 0; for(i = 0;; i++) { cell = getPosRel(0, i); if(cell.isOutsideY()) { return false; } else if(cell[prop]) { return cell[prop] > th; } } } function addPrime() { var result = '^{', i = 0; builderToChar(); for(i = 0; i < isprime; i++) { result += '\\prime'; } result += '}'; me.addModel(new Printable(result)); isprime = 0; me.clearStringBuilder(); } me = {}; ilist = input.split(/\n/); for(i = 0; i < ilist.length; i++) { xLen = quadroLength(ilist[i]); xMax = xMax < xLen ? xLen : xMax; } xMax++; for(i = 0; i < ilist.length; i++) { quadro[i] = []; for(j = 0, k = 0; j < xMax; j++) { if(j >= ilist[i].length) { quadro[i][k++] = cell(32); } else if(isTwoBytes(ilist[i].charAt(j))) { quadro[i][k] = cell(10); quadro[i][k + 1] = cell(ilist[i].charCodeAt(j)); k += 2; } else { quadro[i][k++] = cell(ilist[i].charCodeAt(j)); } } } me.get = function() { return getPos(xPos, yPos); }; me.getCellRel = function(x, y) { return getPosRel(x, y); }; me.getCellUp = function() { return getPos(xPos, yPos - 1); }; me.getCellDown = function() { return getPos(xPos, yPos + 1); }; me.getCellLeft = function() { return getPos(xPos - 1, yPos); }; me.getCellRight = function() { return getPos(xPos + 1, yPos); }; me.getCellUpChar = function() { var cl = me.getCellUp(); return (cl.getCharCode() < 0 || cl.isProcessed()) ? ' ' : cl.getChar(); }; me.getCellSubChar = function() { var cl = me.getCellDown(); return (cl.getCharCode() < 0 || cl.isProcessed()) ? ' ' : cl.getChar(); }; me.hasSuperScript = function() { return hasSuperSubScript(-1); }; me.hasSuperBound = function() { return hasSuperSubBound(-1); }; me.hasSubScript = function() { return hasSuperSubScript(1); }; me.hasSubBound = function() { return hasSuperSubBound(1); }; me.isCellBar = function() { var ccl, dcl; ccl = me.get(); dcl = me.getCellDown(); return /[_\->]/.test(ccl.getChar()) && !ccl.isProcessed() && dcl.isPrintable() && !dcl.isProcessed(); }; me.moveLeft = function() { xPos--; return me; }; me.moveRight = function() { xPos++; return me; }; me.moveUp = function() { yPos--; return me; }; me.moveDown = function() { yPos++; return me; }; me.moveUpIfNotMulti = function() { yPos -= /[T\n]/.test(me.get().getChar()) ? 0 : 1; return me; }; me.moveDownIfNotMulti = function() { yPos += /[T\n]/.test(me.get().getChar()) ? 0 : 1; return me; }; me.clearStringBuilder = function() { builder = ''; builderUpper = []; builderSub = ''; return me; }; me.appendBuilder = function() { var i, v1, v2, grp, a, uf, ch = me.get().getChar(); function partialIndexOf(str) { var i, pstr; for(i = 1; i < str.length; i++) { if(builder.indexOf(str) < 0) { pstr = str.substring(0, i); if(builder.indexOf(pstr) >= 0) { return true; } } } return false; } function markAccent() { var up, i; up = getPosRel(0, -1); if(!up.isTraversed() && up.getChar() === '-') { for(i = 0;;i++) { up = getPosRel(i, -1); if(up.getChar() === '-') { up.markProcessed(); up.markAccent = true; } else if(up.getChar() === '>') { up.markProcessed(); up.markAccent = true; break; } else { break; } } } else if(getUpfunction()) { getPosRel(0, -1).markProcessed(); getPosRel(0, -1).markAccent = true; } } function putPrintable(str) { var uf; builderToChar(); uf = getUpfunction(); uf = uf ? uf : function(x) { return x; }; me.addModel(new Printable(uf(str))); markAccent(); return me.clearStringBuilder(); } function decorateMath(math, decorator) { var i, array; if(math instanceof ConcatFormula) { array = math.toArray(); for(i = 0; i < array.length; i++) { me.addModel(decorator(array[i])); } } else { me.addModel(decorator(math)); } } function searchSuperOrSub(posx, step) { var i, qcell; for(i = step;; i += step) { qcell = me.getCellRel(posx, i); if(qcell.isBoundY()) { return false; } else if(qcell.isPrintable()) { return true; } } } function searchQuantumBracket() { var i, stq = "init", qch; for(i = 1;; i++) { qch = me.getCellRel(i, 0).getChar(); if(qch === ' ' && (searchSuperOrSub(i, -1) || searchSuperOrSub(i, 1))) { continue; } switch(stq) { case "init": if(qch !== '\n' && !printableRE.test(qch)) { return false; } else if(qch === '|') { stq = "bar"; } break; case "bar": if(qch !== '\n' && !printableRE.test(qch)) { return "bra"; } else if(qch === '>' || (qch === '\n' && me.getCellRel(i + 1, 0).getChar() === '\uff1e')) { return "ket"; } break; } } } function searchQuantumKet() { var i, qch; for(i = 1;; i++) { qch = me.getCellRel(i, 0).getChar(); if(qch === ' ' && (searchSuperOrSub(i, -1) || searchSuperOrSub(i, 1))) { continue; } if(qch !== '\n' && !printableRE.test(qch)) { return false; } else if(qch === '>' || (qch === '\n' && me.getCellRel(i + 1, 0).getChar() === '\uff1e')) { return "ket"; } } } if(ch === '\n') { while(matchMathSequence()) {} builderToChar(); markAccent(); return me.clearStringBuilder(); } else if(boldskip) { boldskip = false; return me; } else if(texcharFn) { if(/[ \*]/.test(ch)) { me.addModel(new Printable(texcharFn('\\' + builder))); texcharFn = false; me.clearStringBuilder(); } else { builder += ch; return me; } } me.operator = /[ \t\n]/.test(ch) ? me.operator : /[+\-\*\/=]/.test(ch); if(istex) { if(ch === '$') { me.addModel(new Printable(builder.replace(/\$.*$/, ""))); istex = false; return me.clearStringBuilder(); } else { builder += ch; return me; } } else if(isprime > 0) { if(ch === '\'') { isprime++; return me; } else { addPrime(); return me.appendBuilder(); } } else if(ch === '\'') { isprime++; return me; } else if(!quantumBracket && /[{\(\[]/.test(ch)) { beforech.push([ch === '{' ? '\\{' : ch]); if(!matchMathSequence()) { builderToChar(); } me.newModel(); return me.clearStringBuilder(); } else if(!quantumBracket && /[}\)\]]/.test(ch)) { builderToChar(); v1 = me.popModel(); grp = beforech.pop(); grp.push(ch === '}' ? '\\}' : ch); if(grp.length < 3) { me.addModel(new GroupFormula(v1, grp)); } else { v2 = me.popModel(); me.addModel(new GroupFormula(v2, v1, grp)); } return me.clearStringBuilder(); } else if(ch === '|' && !isOperatorWithBar()) { if(quantumBracket === "bra") { quantumBracket = false; } else if(opt.useQuantumBracket && searchQuantumKet()) { quantumBracket = "ket"; } else if(me.get().markMiddleBar) { me.get().markMiddleBar = false; builderToChar(); me.addModel(new Printable('\\mid')); return me.clearStringBuilder(); } else { builderToChar(); if(isbar) { isbar = false; v1 = me.popModel(); me.addModel(new GroupFormula(v1, ['|', '|'])); } else { isbar = true; me.newModel(); } return me.clearStringBuilder(); } } else if(ch === '$') { builderToChar(); istex = true; return me.clearStringBuilder(); } else if(opt.useAtAsRoundD && ch === '@') { return putPrintable('\\partial '); } else if(/[ ]/.test(ch)) { if(matchMathSequence(markAccent)) { return me.clearStringBuilder(); } } else if(ch === '\\') { builderToChar(); texcharFn = getUpfunction(); texcharFn = texcharFn ? texcharFn : function(x) { return x; }; markAccent(); return me.clearStringBuilder(); } else if(ch === '*') { if(boldmath) { builderToChar(); v1 = me.popModel(); decorateMath(v1, boldmath); boldmath = false; return me.clearStringBuilder(); } else if(/[\|\/\*]/.test(me.getCellRight().getChar()) && !/[ ]/.test(me.getCellRel(2, 0).getChar())) { builderToChar(); me.newModel(); boldmath = boldFn[me.getCellRight().getChar()]; boldskip = true; return me.clearStringBuilder(); } else if(!/[ ]/.test(me.getCellRight().getChar())) { builderToChar(); me.newModel(); boldmath = decorateBold; return me.clearStringBuilder(); } } else if(ch === '`') { isquote = !isquote; if(isquote) { builderToChar(); me.clearStringBuilder(); builder += ' '; return me; } else { me.addModel(new Printable('\\text{' + builder + '}')); return me.clearStringBuilder(); } } else if(opt.useQuantumBracket && /[<\uff1c]/.test(ch) && searchQuantumBracket()) { builderToChar(); quantumBracket = searchQuantumBracket(); me.addModel(new Printable('\\langle')); return me.clearStringBuilder(); } else if(quantumBracket === "ket" && /[>\uff1e]/.test(ch)) { builderToChar(); quantumBracket = false; me.addModel(new Printable('\\rangle')); return me.clearStringBuilder(); } for(i in mathChars) { if(i === ch) { return putPrintable(mathChars[i]); } } builder += ch; builderUpper.push(getUpfunction()); markAccent(); for(i in mathSequence) { if(partialIndexOf(i)) { return me; } } if(matchMathSequence()) { return me.clearStringBuilder(); } builderToChar(); return me.clearStringBuilder(); }; me.f