<!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="" />
<link href="style.css" rel="stylesheet" type="text/css" />
<style>
div {
padding: 1rem;
}
</style>
</head>
<body>
<div>
Input String: <input type="text" style="width: 20rem;" value="" oninput="outputEl.textContent = latexReplace(this.value);" onchange="outputEl.textContent = latexReplace(this.value);" />
</div>
<div>
Output: <span id="output"></span>
</div>
<div>
Enter a string in the input above and some common LaTeX syntax will be parsed -- matrices, square roots, floor/ceiling functions like "⌊3.2⌋ + \begin{matrix}1 & 2\\ 3 & 4\end{matrix} - \sqrt[2]{4}".
</div>
<script src="script.js"></script>
<script>
var outputEl = document.getElementById('output');
</script>
</body>
</html>
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 parseLatexLog(input){
if (input.length < 2){return input;}
var pars = ["",""];
var openPar = 0;
if (input[0] == '['){
pars = ["[","]"];
openPar = 1;
}
else if (input[0] == '{'){
pars = ["{","}"];
openPar = 1;
}
else if (input[0] == '('){
pars = ["(",")"];
openPar = 1;
}
else {
if (input[0] >= "0" && input[0] <= "9"){
if (input[1]=='{'){
input = "{"+input[0]+","+input.substring(2);
}
else if (input[1]=='('){
input = "("+input[0]+","+input.substring(2);
}
else {
input = input[0]+";"+input.substring(1);
}
return input;
}
return input;
}
for (var i=1;i<input.length;i++){
if (input[i] == pars[0]){
openPar++;
}
else if (input[i] == pars[1]){
openPar--;
if (openPar == 0){
if (input[i+1]=='{'){
input = "{"+input.substring(1,i)+","+input.substring(i+2);
}
else if (input[i+1]=='('){
input = "("+input.substring(1,i)+","+input.substring(i+2);
}
else {
input = input.substring(1,i)+";"+input.substring(i+1);
}
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 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));
}
}
return input;
}
This repl parses common LaTeX math syntax and outputs a string that is easier to postfix.
To view this on TripleLog, click here.
The HTML is a simple input/output to change a string of text.
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 script.js file parses some LaTeX like fractions, matrices, roots, and more. Try "⌊3.2⌋ + \begin{matrix}1 & 2\ 3 & 4\end{matrix} - \sqrt[2]{4}". A lot of LaTeX can easily be parsed without any special functions so this script is far from complete. You can add support for more syntax.