Lourah = Lourah || {}; (function () { Activity.importScript(Lourah.jsFramework.parentDir() + "/Lourah.utils.text.Search.js"); var patV1 = /((?:[\w.]*\s*(?:(?:\([^()]*\))+))|(?:[w.]+))\^((?:[\w.]+)+)?/g; var patV2 = /((?:[^^+\-*\/]+)|(?:[\w.]*\s*(?:(?:\([^()]*\))+)))\^((?:[\w.]+)+)?/g; var patV3 = /((?:[^^\+\-\*\/]+)|(?:[\w.]*\s*(?:(?:\([^()]*\))+)))\^((?:(?:-|\+)?[^^+\-*\/]+)|(?:[\w.]*\s*(?:(?:\([^()]*\))+)))/g; var patV4 = /((?:[\w.+\-]+)|(?:[\w.]*\s*(?:(?:\([^()]*\))+)))\^((?:[\w.+\-]+)|(?:[\w.]*\s*(?:(?:\([^()]*\))+)))/g; var pat = patV4; //pat = patV1 Lourah.utils.text.Formula = function() { this.parse = (txt) => { var s = new Lourah.utils.text.SearchString(txt); s.search(/π/g).replaceAll("Math.PI") .search(/√([^;]+)/g).replaceAll("sqrt($1)") .search(/(\d*[.]?\d+)°/g) .replaceAll("$1*Math.PI/180") //.search(/([\w.]*(\([A-Za-z0-9\._\(\)%\$\+\-\*\/\[\]]*\))*)\^([\w.]*(\([A-Za-z0-9\._\(\)%\$\+\-\*\/\[\]]*\))*)/g) .search(/\|(.+)\|/g) .replaceAll("abs($1)") while(s.search(pat).getMatchs().length>0) { //console.log("toProcess::"+s); s.process(toPow) } s.search(/<>x>>/g).replaceAll(")"); if (s.search(/\^/g).getMatchs().length > 0) { throw "Lourah.util.text.Fomula::error::^ not reduced, check parenthesis::'" + txt +"'"; } s.search( /\b(pow|a?cosh?|a?sinh?|a?tanh?|abs|sqrt)\(/g ).replaceAll("Math.$1("); s.search(/\b(log)\(/g) .replaceAll("Math.log10("); s.search(/\b(ln)\(/g) .replaceAll("Math.log("); return s.toString(); }; function toPow(m, sub) { //console.log("...toPow::" + sub); //var [left, right] = [sub.$(1), sub.$(2)]; //console.log("......[left, right]::[" + [left, right] + "]"); //console.log("s::" + s); var left = (new Lourah.utils.text.SearchString(sub.$(1))).search(pat).process(toPow); var right = (new Lourah.utils.text.SearchString(sub.$(2))).search(pat).process(toPow); //console.log("......<" + m + ">[left, right]::[" + [left, right] + "]"); var ret = "pow<>x>>"; //console.log(".........>" + ret); return ret; } function brackets(s) { return s.search(/\(/g) .replaceFirst("<>x>>"); } }; })(); function testIdex() { var f = new Lourah.utils.text.Formula(); console.log(f.parse("√|acosh(1)^2 + sinh(1°)^2|")); }