chem.min.js 12 KB

1
  1. var list=["","H","He","Li","Be","B","C","N","O","F","Ne","Na","Mg","Al","Si","P","S","Cl","Ar","K","Ca","Sc","Ti","V","Cr","Mn","Fe","Co","Ni","Cu","Zn","Ga","Ge","As","Se","Br","Kr","Rb","Sr","Y","Zr","Nb","Mo","Tc","Ru","Rh","Pd","Ag","Cd","In","Sn","Sb","Te","I","Xe","Cs","Ba","La","Ce","Pr","Nd","Pm","Sm","Eu","Gd","Tb","Dy","Ho","Er","Tm","Yb","Lu","Hf","Ta","W","Re","Os","Ir","Pt","Au","Hg","Tl","Pb","Bi","Po","At","Rn","Fr","Ra","Ac","Th","Pa","U","Np","Pu","Am","Cm","Bk","Cf","Es","Fm","Md","No","Lr","Rf","Db","Sg","Bh","Hs","Mt","Ds","Rg","Cn","Nh","Fl","Mc","Lv","Ts","Og"],weighList={H:1,He:4,Li:7,Be:9,B:11,C:12,N:14,O:16,F:19,Ne:20,Na:23,Mg:24,Al:27,Si:28,P:31,S:32,Cl:35.5,Ar:40,K:39,Ca:40,Sc:45,Ti:48,V:51,Cr:52,Mn:55,Fe:56,Co:59,Ni:59,Cu:64,Zn:65.5,Ga:70,Ge:72.5,As:75,Se:79,Br:80,Kr:84,Rb:85.5,Sr:87.5,Y:89,Zr:91,Nb:93,Mo:96,Tc:99,Ru:101,Rh:103,Pd:106.5,Ag:108,Cd:112.5,In:115,Sn:118.5,Sb:122,Te:127.5,I:127,Xe:131,Cs:133,Ba:137,La:139,Ce:140,Pr:141,Nd:144,Pm:147,Sm:150.5,Eu:152,Gd:157,Tb:159,Dy:162.5,Ho:165,Er:167,Tm:169,Yb:173,Lu:175,Hf:178.5,Ta:181,W:184,Re:186,Os:190,Ir:192,Pt:195,Au:197,Hg:200.5,Tl:204.5,Pb:207,Bi:209,Po:209,At:210,Rn:222,Fr:223,Ra:226,Ac:227,Th:232,Pa:231,U:238,Np:237,Pu:244,Am:243,Cm:247,Bk:247,Cf:251,Es:252,Fm:257,Md:258,No:259,Lr:260,Rf:261,Db:262,Sg:263,Bh:262,Hs:265,Mt:266,Ds:269,Rg:272,Cn:285,Nh:284,Fl:289,Mc:288,Lv:293,Ts:291,Og:294},weighList2={H:1.008,He:4.003,Li:6.941,Be:9.012,B:10.81,C:12.01,N:14.01,O:16,F:19,Ne:20.18,Na:22.99,Mg:24.31,Al:26.98,Si:28.09,P:30.97,S:32.07,Cl:35.45,Ar:49.95,K:39.1,Ca:40.08,Sc:44.96,Ti:47.87,V:50.94,Cr:52,Mn:54.94,Fe:55.85,Co:58.93,Ni:58.69,Cu:63.55,Zn:65.39,Ga:79.72,Ge:72.61,As:74.92,Se:78.96,Br:79.9,Kr:83.8,Rb:85.47,Sr:87.62,Y:88.91,Zr:91.22,Nb:92.91,Mo:95.94,Tc:99,Ru:101.1,Rh:102.9,Pd:106.4,Ag:107.9,Cd:112.4,In:114.8,Sn:118.7,Sb:121.8,Te:127.6,I:126.9,Xe:131.3,Cs:132.9,Ba:137.3,La:138.9,Ce:140.1,Pr:140.9,Nd:144.2,Pm:147,Sm:150.4,Eu:152,Gd:157.3,Tb:158.9,Dy:162.5,Ho:164.9,Er:167.3,Tm:168.9,Yb:173,Lu:175,Hf:178.5,Ta:180.9,W:183.8,Re:186.2,Os:190.2,Ir:192.2,Pt:195.1,Au:197,Hg:200.6,Tl:204.4,Pb:207.2,Bi:209,Po:209,At:210,Rn:222,Fr:223,Ra:226,Ac:227,Th:232,Pa:231,U:238,Np:237,Pu:244,Am:243,Cm:247,Bk:247,Cf:251,Es:252,Fm:257,Md:258,No:259,Lr:260,Rf:261,Db:262,Sg:263,Bh:262,Hs:265,Mt:266,Ds:269,Rg:272,Cn:285,Nh:284,Fl:289,Mc:288,Lv:293,Ts:291,Og:294},bracket={};function getco(e){for(var t=e.length,n=0,a=0;a<t;a++){var r=e.charAt(a);if(isNaN(r))break;n=n*10+ +r}return[n,e=e.slice(a,t),a]}function workMolecule(t,n){var a=t.length,r={};for(let e=0;e<a;e++){var l,i=t.charAt(e),o={};if("("==i)o=workMolecule(t.slice(e+1,bracket[e+n]-n),n+e+1),e=bracket[e+n]-n;else{if(!("A"<=i&&i<="Z"))return{};e+1<a&&"a"<=(l=t.charAt(e+1))&&l<="z"&&(e++,i+=l),o[i]?o[i]++:o[i]=1}var d=getco(t.slice(e+1,a));if(d[0])for(key in o)o[key]*=d[0];for(key in o)r[key]?r[key]=r[key]+o[key]:r[key]=o[key];e+=d[2]}return r}function parseMolecule(t){var n=(t=(t=t.replace(/[\[{]/g,"(").replace(/[\]}]/g,")")).replace(/<\d*e[\+\-]>*/g,"")).length,e=1,a=[],r=0;for(let e=0;e<n;e++){var l=t.charAt(e);if("("==l?(a[r]=e,r++):")"==l&&(bracket[a[r-1]]=e,bracket[e]=a[r-1],r--),r<0)return{}}if(0!=r)return{};var i=getco(t),o=(i[0]&&(e=i[0]),workMolecule(i[1],i[2]));for(key in o)o[key]*=e;return o}function eps(e,t=0){return t?1==(t=e.toString().split("e")).length?parseFloat(parseFloat(e).toFixed(4)):Math.round(1e4*parseFloat(t[0]))/1e4+"e"+t[1]:e}function weigh(e,t=0){var n=0;if(t)for(key in e)weighList2[key]&&(n+=e[key]*weighList2[key]);else for(key in e)weighList[key]&&(n+=e[key]*weighList[key]);return eps(n,t)}function weighEquation(e,t=0){var n=(e=e.replace(/<\d*e[\+\-]>*/g,"").replace(/[^\dA-Za-z<>\(\)\+\-=\.;]/g,"")).split(/[=\+\-\.;]/g),a=e.replace(/[^=\+\-\.;]/g,"").replace(/\./g,"*"),r="";if(""==e)return"";var l=a.length,i=0,o="";for(let e=0;e<=l;e++){var d=weigh(parseMolecule(n[e]),t);i+=d,"="==a.charAt(e)&&(o+=eps(i,t)+"=",i=0),r=r+d+a.charAt(e)}return l&&(r+="<br>"+o+eps(i,t)),r.replace(/\*/g,"\\cdot")}function parseEquation(e){var t=(e=e.replace(/ /g,"")).split(/[=\+\-\.]/g),n={},a=e.replace(/[^=\+\-\.]/g,"").length;for(let e=0;e<=a;e++){var r=parseMolecule(t[e]);for(key in r)n[key]?n[key]=n[key]+r[key]:n[key]=r[key]}return n}function renderEquation(e){return e="<a href='#'>\\("+(e=(e=(e=(e=(e=(e=(e=e.replace(/[\[{]/g,"(").replace(/[\]}]/g,")")).replace(/([\+\=\.;])\1+/g,"$1")).replace(/[^\dA-Za-z<>\(\)\+\-=\.;]/g,"")).replace(/([A-Za-z]+)/g,"\\text{$1}")).replace(/<(\d*)\\text\{e\}([\+\-])>/g,"^{$1$2}")).replace(/([\}\)])(\d+)/g,"$1_{$2}")).replace(/\./g,"\\cdot")).replace(/([\+\-=\.;])([^\}])/g,"\\)</a> \\($1\\) <a href='#'>\\($2")+"\\)</a>"}var balInput,inputText,running,mode="bal",balText="",case1="CrI3+Cl2+KOH=K2CrO4+KIO4+KCl+H2O",case2="CH3CHO+2Ag(NH3)2OH=CH3COONH4+2Ag+3NH3+H2O";function setBal(){$(".frame")[0].innerHTML=renderEquation(balText),MathJax.typeset(),$("#balBtn").text("配平"),$("#balShare").removeClass("disabled"),$("#balInput").attr("placeholder",case1+"(输入化学式以配平)"),$("#balBtn").attr("href","/chem?"+case1),$("#balBtn").removeClass("disabled"),mode="bal",input()}function setWeigh(){$("#balBtn").text("相对质量"),$("#balShare").addClass("disabled"),$("#balInput").attr("placeholder",case2+"(输入化学式以计算相对质量)"),$("#balBtn").attr("href",""),$("#balBtn").addClass("disabled"),mode="weigh",input()}function setWeigh2(){$("#balBtn").text("相对质量*"),$("#balShare").addClass("disabled"),$("#balInput").attr("placeholder",case2+"(输入化学式以计算相对质量)"),$("#balBtn").attr("href",""),$("#balBtn").addClass("disabled"),mode="weigh2",input()}function input(){inputText=balInput.value,"bal"==mode?($(".frame")[0].innerHTML=renderEquation(""==inputText?case1:inputText)+'<br><span class="glyphicon glyphicon-chevron-down" aria-hidden="true"></span><br>'+(""!=balText?renderEquation(balText):"..."),MathJax.typeset()):"weigh"==mode?($(".frame")[0].innerHTML=renderEquation(""==inputText?case2:inputText)+"<br>"+weighEquation(""==inputText?case2:inputText),MathJax.typeset()):"weigh2"==mode&&($(".frame")[0].innerHTML=renderEquation(""==inputText?case2:inputText)+"<br>"+weighEquation(""==inputText?case2:inputText,1),MathJax.typeset())}function balance(){if(input(),!running&&"bal"==mode)return $("#balBtn").text("配平..."),$("#balBtn").addClass("disabled"),$(".frame").addClass("text-muted"),running=1,$.get("/chem?"+(""==inputText?case1:inputText),function(e){$(".frame")[0].innerHTML="!"==e.charAt(0)?'<pre class="text-danger bg-danger">'+e.slice(1,e.length)+"</pre>":renderEquation(""==inputText?case1:inputText)+'<br><span class="glyphicon glyphicon-chevron-down" aria-hidden="true"></span><br>'+renderEquation(e),"!"!=e.charAt(0)&&(balText=e),MathJax.typeset(),$("#balBtn").text("配平"),$("#balBtn").removeClass("disabled"),$(".frame").removeClass("text-muted"),running=0})}function balUp(){"bal"==mode&&($("#balInput").val(balText),input())}$().ready(function(){balInput=$("#balInput")[0],setBal(),setQryEq(),$("#balInput").keydown(function(e){13==e.keyCode&&"bal"==mode&&$("#balBtn")[0].click()}),$("#qryInput").keydown(function(e){13==e.keyCode&&"bal"==mode&&$("#qryBtn")[0].click()}),$(function(){$("[data-toggle='tooltip']").tooltip()})});var modeq="query",nameq="eq",strict=!1,matchMode="mole";function toggl(e,t=0,n=0){$("#qryBtn").text(e),t?($("#qryMatch").hide(),$(".addInput").show(),$(".ok").hide(),2==t?$("#addId").show():$("#addId").hide()):($("#qryMatch").show(),$(".addInput").hide(),$(".ok").show()),n?$(".qryInputHidable").show():$(".qryInputHidable").hide()}function setQryEq(){toggl("查询方程式"),modeq="query",strict=!(nameq="eq"),$("#qryInput").attr("placeholder","O2=H2O(输入化学式查询数据库,支持模糊搜索)"),input2()}function setQryEq2(){toggl("查询方程式*",0,1),modeq="query",nameq="eq",strict=!0,$("#qryInput").attr("placeholder","H2O"),input2()}function setQryMo(){toggl("查询分子"),modeq="query",nameq="mo",input2()}function setAddEq(){toggl("上传方程式",1),modeq="add",nameq="eq",$("#qryInput").attr("placeholder","H2+O2=H2O(输入化学式上传至数据库)")}function setAddMo(){toggl("上传分子",1),modeq="add",nameq="mo"}function setUpdEq(){toggl("修改方程式",2),modeq="upd",nameq="eq",$("#qryInput").attr("placeholder","(输入 id 修改已有化学式)")}function setUpdMo(){toggl("修改分子",2),modeq="upd",nameq="mo"}function replaceRegex(e){return e.replace(/([\+\=\.;])+/g,"$1").replace(/([\(\)])/g,"\\\\$1").replace(/(<\d*)e\+/g,"$1%")}function getRegex(){var t="";if(strict){var e=$("#qryInput").val(),n=$("#qryInput2").val(),e=replaceRegex(e=e||n?e:$("#qryInput").attr("placeholder").split("(")[0]),n=replaceRegex(n),t="^";if(e){var a=e.split("+");for(let e=0;e<a.length;e++)t+="mole"==matchMode?"(?=([^=]*\\+|)[0-9]?"+a[e]+"([+=]|$))":"(?=[^=]*"+a[e]+"([^a-z]|$))"}if(n){var r=n.split("+");for(let e=0;e<r.length;e++)t+="mole"==matchMode?"(?=.*=(.*\\+|)[0-9]?"+r[e]+"([+=]|$))":"(?=.*=.*"+r[e]+"([^a-z]|$))"}}else{e=(t=replaceRegex(t=(t=$("#qryInput").val())||$("#qryInput").attr("placeholder").split("(")[0])).split("=");if(2<e.length)return;a=e[0].split("+");t="mole"==matchMode?"^":"";for(let e=0;e<a.length;e++)t+="mole"==matchMode?"(?=(.*[+=]|)[0-9]?"+a[e]+"([+=]|$))":"(?=.*"+a[e]+"([^a-z]|$))";if(1<e.length){r=e[1].split("+");for(let e=0;e<r.length;e++)t+="mole"==matchMode?"(?=(.*[+=]|)[0-9]?"+r[e]+"([+=]|$))":"(?=.*"+r[e]+"([^a-z]|$))"}}return(t+=".*").replace(/%/g,"e+")}function doQuery(e,n=""){fetch("/chem/query/"+nameq+n,{method:"POST",headers:{"Content-type":"application/json"},body:e}).then(e=>e.text()).then(t=>{if("!"==t[0])$(".frame")[1].innerHTML='<pre class="text-danger bg-danger">'+t+"</pre>";else{t=JSON.parse(t),$(".frame")[1].innerHTML=n?"":'<span id="qryInputRender">'+renderEquation(strict?$("#qryInput").val()+"="+$("#qryInput2").val():$("#qryInput").val())+" - 匹配到 "+t.length+' 个</span><br><span class="glyphicon glyphicon-chevron-down" aria-hidden="true"></span><br>';for(let e=0;e<t.length;e++)$(".frame")[1].innerHTML+=renderEquation(t[e].content)+'<br><span class="label label-default">'+t[e].id+"</span> ",t[e].conditions&&($(".frame")[1].innerHTML+="("+t[e].conditions+")"),$(".frame")[1].innerHTML+=t[e].descriptions+"<br>",0<t[e].rel&&($(".frame")[1].innerHTML+='rel: <span class="label label-success">'+t[e].rel+"</span><br>"),t[e].rel<0&&($(".frame")[1].innerHTML+='rel: <span class="label label-warning">'+-t[e].rel+"</span><br>"),n&&($("#qryInput").val(t[0].content),$("#addCondition").val(t[0].conditions),$("#addDescription").val(t[0].descriptions));MathJax.typeset()}})}function query(){var e;"query"!=modeq&&"add"!=modeq||(e=getRegex(),$(".ok").text(e),doQuery(JSON.stringify({content:e}))),"add"==modeq&&($("#balInput").val($("#qryInput").val()?$("#qryInput").val():$("#qryInput").attr("placeholder").split("(")[0]),setBal(),balance().then(e=>{"!"!=e[0]&&(input(),$("#addDescription").val()?confirm(e+"请确认")&&($("#qryInput").val(e),e=JSON.stringify({content:$("#qryInput").val(),conditions:$("#addCondition").val(),descriptions:$("#addDescription").val()}),console.log(e),fetch("/chem/add/"+nameq,{method:"POST",headers:{"Content-type":"application/json"},body:e}).then(()=>{doQuery(JSON.stringify({content:$("#qryInput").val()}))})):alert("无描述"))})),"upd"==modeq&&($("#balInput").val($("#qryInput").val()?$("#qryInput").val():$("#qryInput").attr("placeholder").split("(")[0]),setBal(),balance().then(e=>{if("!"!=e[0])if(input(),$("#addDescription").val()){if(confirm(e+"请确认"))return $("#qryInput").val(e),e=JSON.stringify({content:$("#qryInput").val(),id:$("#addIdText").val(),conditions:$("#addCondition").val(),descriptions:$("#addDescription").val()}),console.log(e),fetch("/chem/upd/"+nameq,{method:"POST",headers:{"Content-type":"application/json"},body:e})}else alert("无描述")}).then(inputId))}function input2(){"query"==modeq&&$(".ok").text(getRegex()),$("#qryInputRender")[0]&&($("#qryInputRender")[0].innerHTML=renderEquation(strict?$("#qryInput").val()+"="+$("#qryInput2").val():$("#qryInput").val())),MathJax.typeset()}function inputId(){var e=JSON.stringify({content:$("#addIdText").val()});$("#addIdText").val()?(console.log(e),doQuery(e,"id")):$(".frame")[1].innerHTML=""}function qryToggleMatch(){matchMode="mole"==matchMode?($("#qryMatch")[0].innerHTML="匹配元素","elem"):($("#qryMatch")[0].innerHTML="匹配分子","mole")}function qryUp(){var e=$("#balInput").val().split("=");1<e.length&&"query"==modeq?($("#qryInput").val(e[0]),$("#qryInput2").val(e[1]),setQryEq2()):$("#qryInput").val($("#balInput").val())}