shikiml
Version:
Markup mathematical formulae by ASCII-art
1,240 lines (1,169 loc) • 231 kB
JavaScript
/**
* 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