let trieMap0 = {" And ":"&"," and ":"&"," AND ":"&"," Or ":"|"," or ":"|"," OR ":"|"," In ":"∈"," in ":"∈"," IN ":"∈"," Not In ":"∉"," not in ":"∉"," NOT IN ":"∉"," Mod ":"\\mod"," mod ":"\\mod"," MOD ":"\\mod"," % ":"\\mod"," Perm ":"\\perm"," perm ":"\\perm"," PERM ":"\\perm"," Comb ":"\\comb"," comb ":"\\comb"," COMB ":"\\comb"," choose ":"\\comb"," CHOOSE ":"\\comb"," Choose ":"\\comb","! ":"!_","\\in ":"∈","\\not\\in ":"∉"};
let trieMap1 = {"Math.sin(":"sin(","math.sin(":"sin(","MATH.SIN(":"sin(","Math.Sin(":"sin(","Math.cos(":"cos(","math.cos(":"cos(","MATH.COS(":"cos(","Math.Cos(":"cos(","Math.tan(":"tan(","math.tan(":"tan(","MATH.TAN(":"tan(","Math.Tan(":"tan(","Math.sec(":"sec(","math.sec(":"sec(","MATH.SEC(":"sec(","Math.Sec(":"sec(","Math.csc(":"csc(","math.csc(":"csc(","MATH.CSC(":"csc(","Math.Csc(":"csc(","Math.cot(":"cot(","math.cot(":"cot(","MATH.COT(":"cot(","Math.Cot(":"cot(","Math.sinh(":"sinh(","math.sinh(":"sinh(","MATH.SINH(":"sinh(","Math.Sinh(":"sinh(","Math.cosh(":"cosh(","math.cosh(":"cosh(","MATH.COSH(":"cosh(","Math.Cosh(":"cosh(","Math.tanh(":"tanh(","math.tanh(":"tanh(","MATH.TANH(":"tanh(","Math.Tanh(":"tanh(","Math.asin(":"arcsin(","math.asin(":"arcsin(","MATH.ASIN(":"arcsin(","Math.Asin(":"arcsin(","Math.acos(":"arccos(","math.acos(":"arccos(","MATH.ACOS(":"arccos(","Math.Acos(":"arccos(","Math.atan(":"arctan(","math.atan(":"arctan(","MATH.ATAN(":"arctan(","Math.Atan(":"arctan(","Math.asinh(":"arcsinh(","math.asinh(":"arcsinh(","MATH.ASINH(":"arcsinh(","Math.Asinh(":"arcsinh(","Math.acosh(":"arccosh(","math.acosh(":"arccosh(","MATH.ACOSH(":"arccosh(","Math.Acosh(":"arccosh(","Math.atanh(":"arctanh(","math.atanh(":"arctanh(","MATH.ATANH(":"arctanh(","Math.Atanh(":"arctanh(","Math.log2(":"log_{2}(","math.log2(":"log_{2}(","MATH.LOG2(":"log_{2}(","Math.Log2(":"log_{2}(","Math.log10(":"log_{10}(","math.log10(":"log_{10}(","MATH.LOG10(":"log_{10}(","Math.Log10(":"log_{10}(","Math.fabs(":"abs(","math.fabs(":"abs(","MATH.FABS(":"abs(","Math.Fabs(":"abs(","Math.gcd(":"gcd(","math.gcd(":"gcd(","MATH.GCD(":"gcd(","Math.Gcd(":"gcd(","Math.comb(":"comb(","math.comb(":"comb(","MATH.COMB(":"comb(","Math.Comb(":"comb(","Math.perm(":"perm(","math.perm(":"perm(","MATH.PERM(":"perm(","Math.Perm(":"perm(","Math.fmod(":"mod(","math.fmod(":"mod(","MATH.FMOD(":"mod(","Math.Fmod(":"mod(","Math.exp(":"e^(","math.exp(":"e^(","MATH.EXP(":"e^(","Math.Exp(":"e^(","Math.pow(":"pow(","math.pow(":"pow(","MATH.POW(":"pow(","Math.Pow(":"pow(","**":"^","Math.floor(":"floor(","math.floor(":"floor(","MATH.FLOOR(":"floor(","Math.Floor(":"floor(","Math.ceil(":"ceil(","math.ceil(":"ceil(","MATH.CEIL(":"ceil(","Math.Ceil(":"ceil(","Math.round(":"round(","math.round(":"round(","MATH.ROUND(":"round(","Math.Round(":"round(","Math.max(":"max(","math.max(":"max(","MATH.MAX(":"max(","Math.Max(":"max(","Math.min(":"min(","math.min(":"min(","MATH.MIN(":"min(","Math.Min(":"min(","Math.pi":"π","math.pi":"π","MATH.PI":"π","Math.Pi":"π","Math.PI":"π","math.Pi":"π","Math.e":"e","math.e":"e","MATH.E":"e","Math.E":"e","math.E":"e","Math.sqrt2":"sqrt(2)","math.sqrt2":"sqrt(2)","MATH.SQRT2":"sqrt(2)","Math.Sqrt2":"sqrt(2)","Math.sqrt(":"sqrt(","math.sqrt(":"sqrt(","MATH.SQRT(":"sqrt(","Math.Sqrt(":"sqrt(","Math.sqrt1_2":"sqrt(1/2)","math.sqrt1_2":"sqrt(1/2)","MATH.SQRT1_2":"sqrt(1/2)","Math.Sqrt1_2":"sqrt(1/2)","Math.log2e":"log_{2}(e)","math.log2e":"log_{2}(e)","MATH.LOG2E":"log_{2}(e)","Math.Log2E":"log_{2}(e)","Math.log10e":"log_{10}(e)","math.log10e":"log_{10}(e)","MATH.LOG10E":"log_{10}(e)","Math.Log10E":"log_{10}(e)","Math.ln2":"log_{e}(2)","math.ln2":"log_{e}(2)","MATH.LN2":"log_{e}(2)","Math.Ln2":"log_{e}(2)","Math.ln10":"log_{e}(10)","math.ln10":"log_{e}(10)","MATH.LN10":"log_{e}(10)","Math.Ln10":"log_{e}(10)","Math.tau":"τ","math.tau":"τ","MATH.TAU":"τ","Math.Tau":"τ","infinity":"∞","INFINITY":"∞","Infinity":"∞","\\infty":"∞","\\INFTY":"∞","\\Infty":"∞","\\cdot":"*","\\CDOT":"*","\\Cdot":"*","\\times":"*","\\TIMES":"*","\\Times":"*","\\max":"max","\\MAX":"max","\\Max":"max","\\min":"min","\\MIN":"min","\\Min":"min","product(":"prod(","PRODUCT(":"prod(","Product(":"prod(","log[":"log_[","LOG[":"log_[","Log[":"log_[","\\log_":"\\log_","\\LOG_":"\\log_","\\Log_":"\\log_","\\log":"\\log_{e}","\\LOG":"\\log_{e}","\\Log":"\\log_{e}","\\ln":"\\log_{e}","\\LN":"\\log_{e}","\\Ln":"\\log_{e}","log(":"log_{e}(","LOG(":"log_{e}(","Log(":"log_{e}(","ln(":"log_{e}(","LN(":"log_{e}(","Ln(":"log_{e}(","log2(":"log_{2}(","LOG2(":"log_{2}(","Log2(":"log_{2}(","log3(":"log_{3}(","LOG3(":"log_{3}(","Log3(":"log_{3}(","log4(":"log_{4}(","LOG4(":"log_{4}(","Log4(":"log_{4}(","log5(":"log_{5}(","LOG5(":"log_{5}(","Log5(":"log_{5}(","log6(":"log_{6}(","LOG6(":"log_{6}(","Log6(":"log_{6}(","log7(":"log_{7}(","LOG7(":"log_{7}(","Log7(":"log_{7}(","log8(":"log_{8}(","LOG8(":"log_{8}(","Log8(":"log_{8}(","log9(":"log_{9}(","LOG9(":"log_{9}(","Log9(":"log_{9}(","log10(":"log_{10}(","LOG10(":"log_{10}(","Log10(":"log_{10}(","log_10":"log_{10}","LOG_10":"log_{10}","Log_10":"log_{10}","\\log\\log":"\\loglog","\\LOG\\LOG":"\\loglog","\\Log\\Log":"\\loglog","\\log\\log\\log":"\\logloglog","\\LOG\\LOG\\LOG":"\\logloglog","\\Log\\Log\\Log":"\\logloglog","loglog(":"loglog(","LOGLOG(":"loglog(","Loglog(":"loglog(","\\exp":"e^","\\EXP":"e^","\\Exp":"e^","exp(":"e^(","EXP(":"e^(","Exp(":"e^(","\\div":"/","\\DIV":"/","\\Div":"/","\\int":"\\int","\\in":"∈","\\IN":"∈","\\In":"∈","\\not\\in":"∉","\\NOT\\IN":"∉","\\Not\\In":"∉","\\notin":"∉","\\NOTIN":"∉","\\Notin":"∉","\\pmod":"%","\\PMOD":"%","\\Pmod":"%","\\mod":"%","\\MOD":"%","\\Mod":"%","\\pm":"±","\\PM":"±","\\Pm":"±","\\plusmn":"±","\\PLUSMN":"±","\\Plusmn":"±","\\neq":"≠","\\NEQ":"≠","\\Neq":"≠","!==":"≠","!=":"≠","\\gt":">","\\GT":">","\\Gt":">","\\lt":"<","\\LT":"<","\\Lt":"<","\\ge":"≥","\\GE":"≥","\\Ge":"≥","\\geq":"≥","\\GEQ":"≥","\\Geq":"≥",">=":"≥","\\le":"≤","\\LE":"≤","\\Le":"≤","\\leq":"≤","\\LEQ":"≤","\\Leq":"≤","<=":"≤","\\lparen":"(","\\LPAREN":"(","\\Lparen":"(","\\rparen":")","\\RPAREN":")","\\Rparen":")","\\left(":"(","\\LEFT(":"(","\\Left(":"(","\\right)":")","\\RIGHT)":")","\\Right)":")","\\lfloor":"⌊","\\LFLOOR":"⌊","\\Lfloor":"⌊","\\rfloor":"⌋","\\RFLOOR":"⌋","\\Rfloor":"⌋","\\lceil":"⌈","\\LCEIL":"⌈","\\Lceil":"⌈","\\rceil":"⌉","\\RCEIL":"⌉","\\Rceil":"⌉","ceiling(":"ceil(","CEILING(":"ceil(","Ceiling(":"ceil(","\\Pi":"Π","\\Alpha":"Α","\\Beta":"Β","\\Gamma":"Γ","\\Delta":"Δ","\\Epsilon":"Ε","\\Zeta":"Ζ","\\Eta":"Η","\\Theta":"Θ","\\Iota":"Ι","\\Kappa":"Κ","\\Lambda":"Λ","\\Mu":"Μ","\\Nu":"Ν","\\Xi":"Ξ","\\Omicron":"Ο","\\Rho":"Ρ","\\Sigma":"Σ","\\Tau":"Τ","\\Upsilon":"Υ","\\Phi":"Φ","\\Chi":"Χ","\\Psi":"Ψ","\\Omega":"Ω","\\pi":"π","\\alpha":"α","\\beta":"β","\\gamma":"γ","\\delta":"δ","\\epsilon":"ε","\\zeta":"ζ","\\eta":"η","\\theta":"θ","\\iota":"ι","\\kappa":"κ","\\lambda":"λ","\\mu":"μ","\\nu":"ν","\\xi":"ξ","\\omicron":"ο","\\rho":"ρ","\\sigma":"σ","\\tau":"τ","\\upsilon":"υ","\\phi":"φ","\\chi":"χ","\\psi":"ψ","\\omega":"ω"};
let root0 = newNode();
// Construct trie
for (var i in trieMap0){
trieInsert(i,root0);
}
let root1 = newNode();
// Construct trie
for (var i in trieMap1){
trieInsert(i,root1);
}
function newNode() {
var obj = {};
obj.isEnd = false;
obj.children = {};
return obj;
}
//Adds a key to the Trie
function trieInsert(key, pCrawl) {
let len = key.length;
var index;
for (var level = 0; level < len; level++) {
index = key[level];
if (pCrawl.children[index] == null) {
pCrawl.children[index] = newNode();
}
pCrawl = pCrawl.children[index];
}
pCrawl.isEnd = true;
}
// Returns true if key presents in trie, else false
function trieSearch(key, pCrawl) {
let len = key.length;
if (len == 0) { return; }
var index;
var longestMatch = -1;
for (var level = 0; level < len; level++) {
index = key[level];
if (pCrawl.children[index] == null) {
if (longestMatch >= 0) {
return [longestMatch + 1, key.substring(0, longestMatch + 1)];
}
else {
return false;
}
}
pCrawl = pCrawl.children[index];
if (pCrawl.isEnd) {
longestMatch = level;
}
}
if (longestMatch >= 0) {
return [longestMatch + 1, key.substring(0, longestMatch + 1)];
}
else {
return false;
}
}
function trieReplace0(input) {
var len = input.length;
for (var i = 0; i < input.length; i++) {
var ts = trieSearch(input.substring(i), root0);
if (ts) {
let out = trieMap0[ts[1]];
input = input.substring(0, i) + out + input.substring(i + ts[0]);
i += out.length - 1;
}
}
return input;
}
function trieReplace1(input) {
var len = input.length;
for (var i = 0; i < input.length; i++) {
var ts = trieSearch(input.substring(i), root1);
if (ts) {
let out = trieMap1[ts[1]];
input = input.substring(0, i) + out + input.substring(i + ts[0]);
i += out.length - 1;
}
}
return input;
}
function nextSpaces(input) {
var openPar = 0;
var firstSpace = 0;
for (var i=0;i<input.length;i++){
if (input[i] == "(" || input[i] == "{" || input[i] == "["){
openPar++;
}
else if (input[i] == ")" || input[i] == "}" || input[i] == "]"){
openPar--;
}
if (openPar == 0){
if (firstSpace == 1){
if (input[i] != " " && input[i] != "\t" && input[i] != "\n"){
firstSpace = -1;
input=input.substring(0,i-1)+"{"+input.substring(i);
}
continue;
}
if (input[i] == " " || input[i] == "\t" || input[i] == "\n"){
if (firstSpace == 0){
firstSpace = 1;
}
else {
input=input.substring(0,i)+"}"+input.substring(i+1);
break;
}
}
}
else if (openPar < 0){
if (firstSpace == -1){
input=input.substring(0,i)+"}"+input.substring(i);
break;
}
}
if (firstSpace == -1 && i == input.length - 1){
input += "}";
break;
}
}
return input;
}
function latexReplaceSpaces(input){
for (var i=0;i<input.length;i++){
if (input[i] == "m"){
if (i >= 3 && input.substring(i-3,i+1) == "\\lim"){
input = input.substring(0,i)+nextSpaces(input.substring(i));
}
else if (i >= 3 && input.substring(i-3,i+1) == "\\sum"){
input = input.substring(0,i)+nextSpaces(input.substring(i));
}
else if (i >= 6 && input.substring(i-6,i+1) == "\\mathrm"){
input = input.substring(0,i)+nextSpaces(input.substring(i));
}
}
else if (input[i] == "d"){
if (i >= 4 && input.substring(i-4,i+1) == "\\prod"){
input = input.substring(0,i)+nextSpaces(input.substring(i));
}
}
}
return input;
}
function simpleReplace(input) {
input = trieReplace0(input);
input = latexReplaceSpaces(input);
input = input.replace(/\s/g, "");
return trieReplace1(input);
}
function parseLatexFC(input){
var openPar = 1;
var type = "floor";
if (input[0] == "⌈"){
type = "ceil";
}
for (var i=1;i<input.length;i++){
if (input[i] == "⌊"){
openPar++;
}
else if (input[i] == "⌈"){
openPar++;
}
else if (input[i] == "⌋"){
openPar--;
}
else if (input[i] == "⌉"){
openPar--;
}
if (openPar == 0){
input = type+"("+input.substring(1,i)+")"+input.substring(i+1);
return input;
}
}
return input;
}
function parseLatexRoot(input){
for (var i=0;i<input.length;i++){
if (input[i] == "]"){
if (i+1 < input.length){
if (input[i+1]=='{'){
input = "{"+input.substring(0,i)+","+input.substring(i+2);
}
else if (input[i+1]=='('){
input = "("+input.substring(0,i)+","+input.substring(i+2);
}
else {
input = input.substring(0,i)+","+input.substring(i+2);
}
}
else {
input = input.substring(0,i)+","+input.substring(i+2);
}
return input;
}
}
return input;
}
function parseLatexDerivatives(input){
var openPar = 1;
var parCount = 0;
var bottomStr = "";
var dx = "x";
var insideStr = "";
for (var i=0;i<input.length;i++){
if (input[i] == "{" || input[i] == "["){
openPar++;
}
else if (input[i] == "}" || input[i] == "]"){
openPar--;
if (openPar == 0){
if (parCount > 0){
bottomStr = bottomStr.substring(0,i-parCount);
if (bottomStr.substring(0,10) == "\\mathrm{d}"){
dx = bottomStr.substring(10);
insideStr = input.substring(i+2);
openPar = 0;
parCount = -1*(i+2);
}
else if (bottomStr[0] == "d"){
dx = bottomStr.substring(1);
insideStr = input.substring(i+2);
openPar = 0;
parCount = -1*(i+2);
}
else {
return "\\frac{"+input;
}
}
else if (parCount < 0){
insideStr = insideStr.substring(0,i+parCount);
input = "der("+insideStr+","+dx+")"+input.substring(i+1);
return input;
}
else {
if (input.substring(0,i) == "d" || input.substring(0,i) == "\\mathrm{d}"){
bottomStr = input.substring(i+2);
openPar = 0;
parCount = i+2;
}
else {
return "\\frac{"+input;
}
}
}
}
}
return "\\frac{"+input;
}
function parseLatexMatrix(input){
var key = "";
var openPar = 1;
var idx = 0;
var val = "";
for (var i=0;i<input.length;i++){
if (input[i] == "{"){
return false;
}
else if (input[i] == "}"){
key = input.substring(0,i);
idx = i+1;
break;
}
}
var end = input.indexOf("\\end{"+key+"}");
var begin = input.indexOf("\\begin{"+key+"}",idx);
if (end < 0){
return false;
}
if (begin == -1 || begin > end){
val = input.substring(idx,end);
}
else {
return false;
}
if (key.indexOf("matrix") > -1){
var rows = val.trim().split("\\\\");
var out = "[";
for (var i=0;i<rows.length;i++){
if (rows[i].trim().length == 0){continue;}
var row = "[";
row += rows[i].trim().replace(/&/g,", ")+'';
row += "]";
if (i > 0){
out += ", ";
}
out += row;
}
out += "]";
out += input.substring(end+6+key.length);
return out;
}
return false;
}
function parseLatexInt(input){
var sub = "";
var sup = "";
var inside = "";
var rest = "";
var dx = "x";
var subi = 0;
var supi = 0;
if (input[0] == "_"){
if (input[1] == "{"){
var openPar = 1;
sub = "";
for (var i=2;i<input.length;i++){
if (input[i] == "{"){
openPar++;
sub += input[i];
}
else if (input[i] == "}"){
openPar--;
if (openPar == 0){
subi = i+1;
break;
}
sub += input[i];
}
else {
sub += input[i];
}
}
}
else {
sub = input[1];
subi = 2;
}
if (input[subi] != "^"){
supi = subi;
}
else {
subi++;
if (input[subi] == "{"){
var openPar = 1;
sup = "";
for (var i=subi+1;i<input.length;i++){
if (input[i] == "{"){
openPar++;
sup += input[i];
}
else if (input[i] == "}"){
openPar--;
if (openPar == 0){
supi = i+1;
break;
}
sup += input[i];
}
else {
sup += input[i];
}
}
}
else {
sup = input[subi];
supi = subi+1;
}
}
}
var dindex = input.substring(supi).indexOf('\\mathrm{d}');
if (dindex < 0){
dindex = input.substring(supi).indexOf('d');
if (dindex < 0){
inside = input.substring(supi).replace(/\\\,/g,"").replace(/\\\!/g,"");
dx = "x";
}
else {
inside = input.substring(supi,dindex+supi).replace(/\\\,/g,"").replace(/\\\!/g,"");
rest = input.substring(dindex+supi+2);
dx = input.substring(supi)[dindex+1];
}
}
else {
inside = input.substring(supi,dindex+supi).replace(/\\\,/g,"").replace(/\\\!/g,"");
rest = input.substring(dindex+supi+11);
dx = input.substring(supi)[dindex+10];
}
var out = "int("+inside+","+dx;
if (sub != "" || sup != ""){
out += ","+sub+","+sup;
}
out += ")";
return out+rest;
}
function parseLatexFunction(input){
var sub = "";
var sup = "";
var inside = "";
var rest = "";
var subi = 0;
var supi = 0;
if (input[0] == "_"){
if (input[1] == "{"){
var openPar = 1;
sub = "";
for (var i=2;i<input.length;i++){
if (input[i] == "{"){
openPar++;
sub += input[i];
}
else if (input[i] == "}"){
openPar--;
if (openPar == 0){
subi = i+1;
break;
}
sub += input[i];
}
else {
sub += input[i];
}
}
}
else {
sub = input[1];
subi = 2;
}
if (input[subi] != "^"){
supi = subi;
}
else {
subi++;
if (input[subi] == "{"){
var openPar = 1;
sup = "";
for (var i=subi+1;i<input.length;i++){
if (input[i] == "{"){
openPar++;
sup += input[i];
}
else if (input[i] == "}"){
openPar--;
if (openPar == 0){
supi = i+1;
break;
}
sup += input[i];
}
else {
sup += input[i];
}
}
}
else {
sup = input[subi];
supi = subi+1;
}
}
}
var dindex = input.substring(supi).indexOf('}');
var openPar = 0;
for (var i=supi;i<input.length;i++){
if (input[i] == "{"){openPar++;}
else if (input[i] == "}"){
openPar--;
if (openPar == 0){
rest = input.substring(i+1);
inside = input.substring(supi+1,i);
break;
}
}
if (i == input.length - 1){inside = input.substring(supi);}
}
var out = "("+inside;
if (sub != "" || sup != ""){
out += ","+sub+","+sup;
}
out += ")";
return out+rest;
}
function latexReplace(input){
for (var i=0;i<input.length;i++){
if (input[i] == "{"){
if (i >=6 && input.substring(i-6,i) == "\\begin"){
var matrix = parseLatexMatrix(input.substring(i+1));
if (matrix){
input = input.substring(0,i-6)+matrix;
}
}
else if (i >=5 && input.substring(i-5,i) == "\\frac"){
input = input.substring(0,i-5)+parseLatexDerivatives(input.substring(i+1));
}
}
else if (input[i] == "["){
if (i >=5 && input.substring(i-5,i) == "\\sqrt"){
input = input.substring(0,i-5)+"\\sqrt"+parseLatexRoot(input.substring(i+1));
}
else if (i >=4 && input.substring(i-4,i) == "sqrt"){
input = input.substring(0,i-4)+"\\sqrt"+parseLatexRoot(input.substring(i+1));
}
}
else if (input[i] == "⌊"){
input = input.substring(0,i)+parseLatexFC(input.substring(i));
}
else if (input[i] == "⌈"){
input = input.substring(0,i)+parseLatexFC(input.substring(i));
}
else if (input[i] == "t"){
if (i >= 3 && input.substring(i-3,i+1) == "\\int"){
input = input.substring(0,i-3)+parseLatexInt(input.substring(i+1));
}
}
else if (input[i] == "m"){
if (i >= 3 && input.substring(i-3,i+1) == "\\sum"){
input = input.substring(0,i-3)+"\\sum"+parseLatexFunction(input.substring(i+1));
}
else if (i >= 3 && input.substring(i-3,i+1) == "\\lim"){
input = input.substring(0,i-3)+"\\lim"+parseLatexFunction(input.substring(i+1));
}
}
else if (input[i] == "d"){
if (i >= 4 && input.substring(i-4,i+1) == "\\prod"){
input = input.substring(0,i-4)+"\\prod"+parseLatexFunction(input.substring(i+1));
}
}
}
return input;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="favicon.png">
<title></title>
<meta name="description" content="" />
<style>
.output > span {
display: inline-block;
width: 2rem;
height: 1.5rem;
padding: 0.25rem 0.25rem;
text-align: center;
background: #DDD;
}
.output > span:nth-child(2n-1) {
background: #EEE;
}
</style>
</head>
<body>
<div>
<input type="text" style="width: 80ch;" id="infix" value="2+log_{3}(9)-4" oninput="fullPostfix()" onchange="fullPostfix()" />
</div>
<div style="padding: 0.25rem;">
Original:
<span id="original" class="output">
</span>
</div>
<div style="padding: 0.25rem;">
Cleaned:
<span id="clean" class="output">
</span>
</div>
<div style="padding: 0.25rem;">
LaTeX Removed:
<span id="latex" class="output">
</span>
</div>
Infix Array:
<div id="infixArray" class="output">
</div>
Postfix Array:
<div id="postfixArray" class="output">
</div>
<table>
<thead>
<tr><th>Step</th><th>Postfix Array</th><th>Stack</th></tr>
</thead>
<tbody id="allSteps">
</tbody>
</table>
<script src="prec.js"></script>
<script src="clean.js"></script>
<script src="postfix.js"></script>
<script>
function fullPostfix() {
var input = document.getElementById('infix').value;
document.getElementById('original').textContent=input;
var simple = simpleReplace(input);
document.getElementById('clean').textContent=simple;
var latex = latexReplace(simple);
document.getElementById('latex').textContent=latex;
newInput(latex);
}
</script>
</body>
</html>
function toInfixArray(input){
var arr = [];
var str = "";
for (var i=0;i<input.length;i++){
if ("(){}[]".indexOf(input[i]) > -1){
if (str.length > 0){
if ("({[".indexOf(input[i]) > -1){
if (str[0] == "\\"){
if (prec[str.substring(1)]){
arr.push(str.substring(1));
}
else {
arr.push("\\:"+str.substring(1));
prec["\\:"+str.substring(1)]=100;
}
}
else if (isNumber(str)){
arr.push(str);
arr.push("*");
}
else if (prec[str]){
arr.push(str);
}
else {
arr.push("\\:"+str);
prec["\\:"+str]=100;
}
}
else {
arr.push(str);
}
}
arr.push(input[i]);
str = "";
}
else if (input[i] == "-"){
if (str.length > 0){arr.push(str);}
if (i == 0){
arr.push("0-");
}
else if (arr.length > 0 && prec[arr[arr.length-1]] > 0){
arr.push("0-");
}
else {
arr.push(input[i]);
}
str = "";
}
else if (input[i] == "_"){
if (str == "log"){continue;}
if (str == "" && arr.length > 0 && arr[arr.length-1] == "log"){continue;}
if (str.length > 0){arr.push(str);}
arr.push(input[i]);
str = "";
}
else if (input[i] == " "){
if (str.length > 0){arr.push(str);}
str = "";
}
else if (prec[str+input[i]]){
str += input[i];
while (i+1 < input.length && prec[str+input[i+1]]){
str += input[i+1];
i++;
}
if (str == "!" && i+1<input.length && input[i+1] == "_"){
str = "!";
i++;
}
if (str.length > 0){arr.push(str);}
str = "";
}
else if (prec[input[i]]){
if (str.length > 0){arr.push(str);}
str = "";
str += input[i];
while (i+1 < input.length && prec[str+input[i+1]]){
str += input[i+1];
i++;
}
if (str == "!" && i+1<input.length && input[i+1] == "_"){
str = "!";
i++;
}
arr.push(str);
str = "";
}
else {
str += input[i];
}
}
if (str.length > 0){arr.push(str);}
return arr;
}
function toPostfixArray(input,max=-1){
var stack = [];
var postfix = [];
var maxx = max;
if (maxx > input.length || maxx < 0){maxx = input.length;}
for (var i=0;i<maxx;i++){
if (prec[input[i]]){
if (stack.length == 0){
stack.push(input[i]);
}
else if (input[i] == "0-"){
stack.push(input[i]);
}
else if (prec[stack[stack.length-1]] < prec[input[i]]){
stack.push(input[i]);
}
else if (stack[stack.length-1] == "^" && input[i] == "^"){
stack.push(input[i]);
}
else {
while (stack.length > 0 && prec[stack[stack.length-1]] >= prec[input[i]]) {
if (stack[stack.length-1] == "^" && input[i] == "^"){break;}
var last = stack[stack.length-1];
if (last == "0-" && isNumber(postfix[postfix.length-1])){
postfix[postfix.length-1] = "-"+postfix[postfix.length-1];
}
else {
postfix.push(last);
}
stack.pop();
}
stack.push(input[i]);
}
}
/*else if (input[i][0] == '\\'){
stack.push(input[i]);
}*/
else if (input[i] == '(' || input[i] == '{' || input[i] == '['){
stack.push(input[i]);
}
else if (input[i] == ')'){
while (stack.length > 0 && stack[stack.length-1] != "(") {
var last = stack[stack.length-1];
if (last == "0-" && isNumber(postfix[postfix.length-1])){
postfix[postfix.length-1] = "-"+postfix[postfix.length-1];
}
else {
postfix.push(last);
}
stack.pop();
}
stack.pop();
}
else if (input[i] == '}'){
while (stack.length > 0 && stack[stack.length-1] != "{") {
var last = stack[stack.length-1];
if (last == "0-" && isNumber(postfix[postfix.length-1])){
postfix[postfix.length-1] = "-"+postfix[postfix.length-1];
}
else {
postfix.push(last);
}
stack.pop();
}
stack.pop();
}
else if (input[i] == ']'){
var isRow = false;
while (stack.length > 0 && stack[stack.length-1] != "[") {
var last = stack[stack.length-1];
if (last == ","){isRow = true;}
if (last == "0-" && isNumber(postfix[postfix.length-1])){
postfix[postfix.length-1] = "-"+postfix[postfix.length-1];
}
else {
postfix.push(last);
}
stack.pop();
}
stack.pop();
if (isRow){postfix.push("row")}
}
else {
if (input[i].length <= 1 || isNumber(input[i])){
postfix.push(input[i]);
}
else {
var idx = 1;
while (idx < input[i].length && isNumber(input[i].substring(0,idx))){
idx++;
}
if (idx > 1){
if (input[i][idx-1] == "%"){
if (idx == input[i].length){
//12% is just a number
postfix.push(input[i]);
}
else {
//12%7 becomes 12mod7
input.splice(i,1,input[i].substring(0,idx-1),"mod",input[i].substring(idx));
maxx = max;
if (maxx > input.length || maxx < 0){maxx = input.length;}
i--;
continue;
}
}
else {
//Converts 4x to 4*x
input.splice(i,1,input[i].substring(0,idx-1),"*",input[i].substring(idx-1));
maxx = max;
if (maxx > input.length || maxx < 0){maxx = input.length;}
i--;
continue;
}
}
else {
postfix.push(input[i]);
}
}
}
}
if (max == -1){
while (stack.length > 0) {
var last = stack[stack.length-1];
if (last == "0-" && isNumber(postfix[postfix.length-1])){
postfix[postfix.length-1] = "-"+postfix[postfix.length-1];
}
else {
postfix.push(last);
}
stack.pop();
}
return postfix;
}
return {postfix:postfix,stack:stack};
}
function newInput(input){
var arr = toInfixArray(input);
var postfix = toPostfixArray(arr,-1);
console.log(postfix)
var out = document.getElementById('infixArray');
out.innerHTML = "";
for (var i=0;i<arr.length;i++){
var span = document.createElement('span');
span.textContent = arr[i];
out.appendChild(span);
}
out = document.getElementById('postfixArray');
out.innerHTML = "";
for (var i=0;i<postfix.length;i++){
var span = document.createElement('span');
span.textContent = postfix[i];
out.appendChild(span);
}
var allSteps = document.getElementById('allSteps');
allSteps.innerHTML = "";
for (var ii=1;ii<arr.length+1;ii++){
var obj = toPostfixArray(arr,ii);
var tr = document.createElement('tr');
var cell1 = document.createElement('td');
cell1.textContent = arr[ii-1];
tr.appendChild(cell1);
var cell2 = document.createElement('td');
cell2.classList.add('output');
var cell3 = document.createElement('td');
cell3.classList.add('output');
tr.appendChild(cell2);
tr.appendChild(cell3);
for (var i=0;i<obj.postfix.length;i++){
var span = document.createElement('span');
span.textContent = obj.postfix[i];
cell2.appendChild(span);
}
for (var i=0;i<obj.stack.length;i++){
var span = document.createElement('span');
span.textContent = obj.stack[i];
cell3.appendChild(span);
}
allSteps.appendChild(tr);
}
}
function isNumber(input){
var len = input.length;
if (len == 0){return false;}
for (var i=0;i<len;i++){
if ("0123456789.".indexOf(input[i]) < 0){
return false;
}
}
return true;
}
var prec = {};
{
prec['~'] = 100;
prec['☀'] = 100;
prec['ln'] = 100;
prec['log'] = 100;
prec['loglog'] = 100;
prec['logloglog'] = 100;
prec['matrix'] = 100;
prec['sqrt'] = 100;
prec['pow'] = 100;
prec['der'] = 100;
prec['lim'] = 100;
prec['int'] = 100;
prec['round'] = 100;
prec['floor'] = 100;
prec['ceil'] = 100;
prec['sum'] = 100;
prec['prod'] = 100;
prec['mod'] = 100;
prec['perm'] = 100;
prec['comb'] = 100;
var trig = ['sin','cos','tan','csc','sec','cot','sinh','cosh','tanh'];
var arctrig = ['arcsin','arccos','arctan','arcsinh','arccosh','arctanh'];
for (var i=0;i<trig.length;i++){
prec[trig[i]]=100;
}
for (var i=0;i<arctrig.length;i++){
prec[arctrig[i]]=100;
}
var commafns = ['max','min','gcd'];
for (var i=0;i<commafns.length;i++){
prec[commafns[i]]=100;
}
prec['!'] = 90;
prec['^'] = 80;
prec['*'] = 70;
prec['0-'] = 70;
prec['/'] = 70;
prec['+'] = 50;
prec['±'] = 50;
prec['-'] = 50;
prec['>'] = 30;
prec['<'] = 30;
prec['==='] = 30;
prec['=='] = 30;
prec['='] = 30;
prec['!=='] = 30;
prec['≠'] = 30;
prec['≤'] = 30;
prec['≥'] = 30;
prec['∈'] = 30;
prec['∉'] = 30;
prec['&'] = 20;
prec['|'] = 20;
prec[','] = 5;
prec['row'] = 5;
}
This repl parses common math expressions that have LaTeX syntax.
To view this on TripleLog, click here.
The HTML is a simple input/output to change a string of text. Each step is output including each step of the postfixing.
Add CSS by editing the style.css file that is linked to in the head section or inline edit the style section in the head.
The prec.js file just creates the precendence map. The clean.js file makes some adjustments to the input to be easier to postfix and parses some LaTeX like matrices, derivatives, and more. The postfix.js file then postfixes the cleaned string. There is also some JavaScript in the index.html that puts it all together.
This repl includes the most LaTeX functions -- integrals, sums, products, derivatives, etc.