chem.min.js 23 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={},preview=1,precise=0,collapse=0,useIon=0,useIonId=0;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),s={};if("("==i)s=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),s[i]?s[i]++:s[i]=1}var o=getco(t.slice(e+1,a));if(o[0])for(key in s)s[key]*=o[0];for(key in s)r[key]?r[key]=r[key]+s[key]:r[key]=s[key];e+=o[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),s=(i[0]&&(e=i[0]),workMolecule(i[1],i[2]));for(key in s)s[key]*=e;return s}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,s="";for(let e=0;e<=l;e++){var o=weigh(parseMolecule(n[e]),t);i+=o,"="==a.charAt(e)&&(s+=eps(i,t)+"=",i=0),r=r+o+a.charAt(e)}return l&&(r+="<br>"+s+eps(i,t)),r.replace(/\*/g,"\\cdot")}function parseEquation(e){var t=(e=e.replace(/ /g,"").replace(/<\d*e[\+\-]>*/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 getCondition(e){return"加热"==e?"\\Delta":e}function renderEquation(e,t=""){return 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,"\\times"),e="\\("+(e=t?e.replace(/=/g,`\\stackrel{${getCondition(t)}}{=}`):e)+"\\)"}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(){$("#precise").hide(),$(".frame")[0].innerHTML=renderEquation(balText),$("#balBtn").html('配平 <span class="glyphicon glyphicon-transfer"></span>'),$("#balInput").attr("placeholder",case1+"(输入化学式以配平)"),$("#balBtn").attr("href","/chem?"+case1),$("#balBtn").removeClass("disabled"),mode="bal",input(),MathJax.typeset()}function setWeigh(){$("#precise").show(),$("#balBtn").text("相对质量"),$("#balInput").attr("placeholder",case2+"(输入化学式以计算相对质量)"),$("#balBtn").attr("href",""),$("#balBtn").addClass("disabled"),mode="weigh",input()}function input(){inputText=balInput.value.replace(/[\[\{]/g,"(").replace(/[\]\}]/g,")"),"bal"==mode?$(".frame")[0].innerHTML=renderEquation(""==inputText?case1:inputText)+'<br><span class="glyphicon glyphicon-chevron-down" aria-hidden="true"></span><br>'+(""!=balText?renderEquation(balText):"..."):"weigh"==mode&&($(".frame")[0].innerHTML=renderEquation(""==inputText?case2:inputText)+"<br>"+weighEquation(""==inputText?case2:inputText,precise)),preview&&MathJax.typeset(),inputText.match("!")&&balUp()}function balance(){if(input(),!running&&"bal"==mode)return $("#balBtn").text("配平..."),$("#balBtn").addClass("disabled"),$(".frame").addClass("text-muted"),running=1,fetch("/alog",{method:"POST",headers:{"Content-type":"application/json"},body:'{"content":"'+(""==inputText?case1:inputText)+'"}'}),fetch("https://43.143.233.184:7989/chem",{method:"POST",headers:{"Content-type":"application/json"},body:'{"q":"'+(""==inputText?case1:inputText)+'"}'}).then(e=>e.text()).then(t=>(t=(t="{}"==t?'"!Description: Invalid Character."':t).split('"')[1].replace(/\\n/g,"\n"),$(".frame")[0].innerHTML="!"==t.charAt(0)?'<pre class="text-danger bg-danger">'+t.slice(1,t.length)+"</pre>":renderEquation(""==inputText?case1:inputText)+'<br><span class="glyphicon glyphicon-chevron-down" aria-hidden="true"></span><br>'+renderEquation(t),"!"!=t.charAt(0)&&(balText=t),MathJax.typeset(),$("#balBtn").html('配平 <span class="glyphicon glyphicon-transfer"></span>'),$("#balBtn").removeClass("disabled"),$(".frame").removeClass("text-muted"),running=0,new Promise(e=>e(t))))}function balUp(){"bal"==mode&&($("#balInput").val(balText),input())}$().ready(function(){balInput=$("#balInput")[0],setBal(),setQry(),$("#balInput").keydown(function(e){13==e.keyCode&&"bal"==mode&&$("#balBtn")[0].click()}),$("#qryInput").keydown(function(e){13==e.keyCode&&$("#qryBtn")[0].click()}),$("#preview").tooltip(),$(function(){$("[data-toggle='tooltip']").tooltip()}),$(".has").on("click",e=>{$(e.currentTarget).children().hasClass("active")||$(e.currentTarget).children("span").click()});for(let e=0;e<typelist.length;e++)$(".type-list").append(`<label class="btn btn-default type type-${typelist[e]} add add-mo${e?"":" active"}" onclick="type=${typelist[e]}"><input type="radio"> ${typelist[e]} </label>`)});var modeq="query",nameq="eq",strict=!1,matchMode="mole",namels=["eq","mo","io","el"],ionRegex="";function toggl(e,t=0){$("#qryBtn").html(e),$(".op").hide(),$(".op-"+modeq+"-"+nameq).show(),"add"==modeq||"upd"==modeq?($(".add:not(.add-"+nameq+",#addId)").hide(),$(".add-"+nameq).show(500),"upd"==modeq?$("#addId").show(300):$("#addId").hide(300)):$(".add").hide(),t?$(".qryInputHidable").show():$(".qryInputHidable").hide()}function setQry(e=0){$(".qry-group>label").removeClass("active"),$(".frame").removeClass("active"),$(".frame")[0].classList.add("active"),"query"==modeq?toggl('查询 <span class="glyphicon glyphicon-search"></span>',"eq"==nameq&&strict):toggl("add"==modeq?'上传 <span class="glyphicon glyphicon-plus"></span>':'修改 <span class="glyphicon glyphicon-pencil"></span>'),"eq"==nameq?($(".frame")[1].classList.add("active"),$(".qry-group>label")[0].classList.add("active"),"query"==modeq?$("#qryInput").attr("placeholder","O2=H2O(查询数据库中的化学式,也可输入 id)"):"add"==modeq?$("#qryInput").attr("placeholder","H2+O2=H2O(将化学式上传至数据库)"):$("#qryInput").attr("placeholder","(修改已有化学式)")):"mo"==nameq?($(".qry-group>label")[1].classList.add("active"),$(".frame")[2].classList.add("active"),"query"==modeq?useIon?useIonId?($("#qryInput").attr("placeholder","2,3(输入离子编号查询数据库中的分子)"),$(".qry-group>label")[2].classList.add("active"),$(".frame")[3].classList.add("active")):$("#qryInput").attr("placeholder","Fe<3e+>(输入离子查询数据库中的分子)"):$("#qryInput").attr("placeholder","Fe(查询数据库中的分子,也可输入 id)"):("add"==modeq?$("#qryInput").attr("placeholder","Fe3O4(将分子上传至数据库)"):$("#qryInput").attr("placeholder","(修改已有分子)"),$("#addTitle").attr("placeholder","四氧化三铁")),useIon&&$(".op-ionid").show()):"io"==nameq?($(".qry-group>label")[2].classList.add("active"),$(".frame")[3].classList.add("active"),"query"==modeq?$("#qryInput").attr("placeholder","Fe(查询数据库中的离子,也可输入 id)"):("add"==modeq?$("#qryInput").attr("placeholder","Fe<3e+>(将离子上传至数据库)"):$("#qryInput").attr("placeholder","(修改已有离子)"),$("#addTitle").attr("placeholder","三价铁"))):($(".qry-group>label")[3].classList.add("active"),$(".frame")[4].classList.add("active"),"query"==modeq&&$("#qryInput").attr("placeholder","Fe(输入元素获取汇总信息)")),input2(),"upd"==modeq&&e&&$(".add-reload").show(300),collapse?($(".frame:not(.active)").parent().hide(300),$(".frame.active:not(#balFrame)").parent().show(200)):$(".frame:not(#balFrame)").parent().show(300)}function replaceRegex(e){return e.replace(/([\+\=\.;])+/g,"$1").replace(/([\(\)])/g,"\\\\$1").replace(/(<\d*)e\+/g,"$1%")}function getRegex(){var t="";if("eq"!=nameq)return replaceRegex($("#qryInput").val()?$("#qryInput").val():$("#qryInput").attr("placeholder").split("(")[0]).replace(/%/g,"e+")+"([^a-z]|$)";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{if((t=$("#qryInput").val())&&!t.match(/[^\d]/g))return t;e=(t=replaceRegex(t=t||$("#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 procClass(e){e[0].class=JSON.parse(e[0].class);var a=e[0].class;for(let e=0;e<a.length;e++){let t=JSON.stringify(a[e]).split(":")[0].split('"')[1],n="";a.filter(e=>{JSON.stringify(e).split(":")[0].split('"')[1]==t&&(n+=","+JSON.stringify(e).split(":")[1].split("}")[0].replace(/"/g,""))}),curClass[t]=n.slice(1)}getClass(1)}function renderTable(r,e){var l=[],s=[];for(i=0;i<e.length;i++){var t=JSON.parse(e[i].class).filter(e=>e[r])[0][r];l.includes(t)||l.push(t),s.includes(e[i].type)||s.push(e[i].type)}l.sort(),s.sort(),console.log(l,s),str="<thead><tr><th>"+r+"</th>";for(let e=0;e<s.length;e++)str+=`<th>${s[e]}</th>`;str+="</tr></thead><tbody>";for(let a=0;a<l.length;a++){str+=`<tr><td>${l[a]}</td>`;for(let n=0;n<s.length;n++){var o=e.filter(e=>JSON.parse(e.class).filter(e=>e[r]==l[a]).length&&e.type==s[n]);str+="<td>";let t="";for(let e=0;e<o.length;e++)t+=""+o[e].content,e<o.length-1&&(t+=";"),e%5==4&&(str+=renderEquation(t),t="");str=str+renderEquation(t)+"</td>"}str+="</tr>"}str+="</tbody>",$(".table-el").html(str),console.log(str)}function renderResult(t,n,a,r,e){var l=$("#qryInput").val();if("!"!=n[0]){if(n=JSON.parse(n),"eq"==nameq)if(-1!=e){a&&(r&&$("#qryInput").val(n[0].content),$("#addCondition").val(n[0].conditions),$("#addIdText").val(JSON.parse(t).content),$("#addDescription").val(n[0].descriptions));var i="";i+='<div class="result" style="margin-left: 50px;margin-top: -20px;">'+renderEquation(n[0].content,n[0].conditions)+"<br>",n[0].conditions&&(i+="("+n[0].conditions+")"),i=i+(n[0].descriptions+"<br>")+"</div>",$(".res-"+e).append(i)}else{$(".frame")[1].innerHTML=a&&r?"":'<span id="qryInputRender">'+renderEquation(strict?l+"="+$("#qryInput2").val():l)+" - 匹配到 "+n.length+' 个</span><br><span class="glyphicon glyphicon-chevron-down" aria-hidden="true"></span><br>';i="";for(let e=0;e<n.length;e++)i+=`<div class="result res-${e}">${renderEquation(n[e].content,n[e].conditions)}<br><span class="label label-${n[e].rel?0<n[e].rel?"warning":"success":"default"}" onclick="doQuery(JSON.stringify({content:'${n[e].id}'}),'id',2,-2)">${n[e].id}</span> `,n[e].conditions&&(i+="("+n[e].conditions+")"),i+=n[e].descriptions+"<br>",0<n[e].rel&&(i+=`<span class="glyphicon glyphicon-share-alt"></span> <span class="label label-sub label-success" onclick="$(this).siblings('.result').length||doQuery(JSON.stringify({content:'${n[e].rel}'}),'id',2,${e})">${n[e].rel}</span><br>`),n[e].rel<0&&(i+=`<span class="glyphicon glyphicon-share-alt"></span> <span class="label label-sub label-warning" onclick="$(this).siblings('.result').length||doQuery(JSON.stringify({content:'${-n[e].rel}'}),'id',2,${e})">${-n[e].rel}</span><br>`),a&&(r&&$("#qryInput").val(n[0].content),$("#addCondition").val(n[0].conditions),$("#addIdText").val(JSON.parse(t).content),$("#addDescription").val(n[0].descriptions)),!l.match("!")&&2!=r||$("#qryInput").val(n[0].content),i+="</div>";$(".frame")[1].innerHTML+=i}else if("mo"==nameq){-1==e&&($(".frame")[2].innerHTML=a?"":'<span id="qryInputRender-mo">'+renderEquation(l)+" - 匹配到 "+n.length+' 个</span><br><span class="glyphicon glyphicon-chevron-down" aria-hidden="true"></span><br>');i="";for(let e=0;e<n.length;e++){i=(i+=`<div class="result">${renderEquation(n[e].content)}<br><span class="label label-default" onclick="doQuery(JSON.stringify({content:'${n[e].id}'}),'id',2,-2)">${n[e].id}</span> `)+`${n[e].title}${n[e].descriptions?" - "+n[e].descriptions:""}<span class="pull-right">${n[e].type}</span><br>`;var s=JSON.parse(n[e].ions);i+='<span class="ions">';for(let e=0;e<s.length;e++)i+=`<span class="ion"><span class="label label-ion label-sub">${s[e].id}</span> ${renderEquation(s[e].c+"~"+s[e].v)}</span>`,e<s.length-1&&(i+="/");s.length&&(i+="<br>"),i+="</span>",a&&(r&&$("#qryInput").val(n[0].content),$("#addTitle").val(n[0].title),$("#addIdText").val(JSON.parse(t).content),$("#addDescription").val(n[0].descriptions),procClass(n),type=n[0].type,$(".type").removeClass("active"),$(".type-"+type).addClass("active"),ionList=JSON.parse(n[0].ions),updateIon()),!l.match("!")&&2!=r||$("#qryInput").val(n[0].content),i+="</div>"}-1==e&&($(".frame")[2].innerHTML+=i)}else if("io"==nameq){-1==e&&($(".frame")[3].innerHTML=a?"":'<span id="qryInputRender-io">'+renderEquation(l)+" - 匹配到 "+n.length+' 个</span><br><span class="glyphicon glyphicon-chevron-down" aria-hidden="true"></span><br>');i="";ionRegex="";for(let e=0;e<n.length;e++)i=(i+=`<div class="result"><span class="count-ion-${n[e].id}"></span>${renderEquation(n[e].content)}<br><span class="label label-ion" onclick="addIon(${n[e].id},'${n[e].content}')">${n[e].id}</span> `)+n[e].title+"<br>",ionClass[n[e].id]=n[e].class,useIonId?ionRegex+='(?=.*"id":'+n[e].id+",.*)":a&&(r&&$("#qryInput").val(n[0].content),$("#addTitle").val(n[0].title),$("#addIdText").val(JSON.parse(t).content),$("#addDescription").val(n[0].descriptions),procClass(n),type=n[0].type,$(".type").removeClass("active"),$(".type-"+type).addClass("active")),!l.match("!")&&2!=r||$("#qryInput").val(n[0].content),i+="</div>";ionRegex+=".*",-1==e&&($(".frame")[3].innerHTML+=i)}else i="",i+=`${t=JSON.parse(t).content.split("(")[0]} - ${0<list.indexOf(t)?`第 ${list.indexOf(t)} 号`:"未知"}元素`,list.indexOf(t),$(".frame")[4].innerHTML=i+'<table class="table table-el"></table>',renderTable(t,n);return MathJax.typeset(),n.length}$(".frame")[getC(nameq)].innerHTML='<pre class="text-danger bg-danger">'+n+"</pre>"}async function doQuery(e,t="",n=1,a=-1){return renderResult(e,await(await fetch("/chem/query/"+nameq+t,{method:"POST",headers:{"Content-type":"application/json"},body:e})).text(),t,n,a)}function doUpload(e){fetch("/chem/"+modeq+"/"+nameq,{method:"POST",headers:{"Content-type":"application/json"},body:e}).then(()=>{"eq"==nameq&&"upd"==modeq?inputId():$("#qryInput").val()&&doQuery(JSON.stringify({content:getRegex()}))})}async function upload(t){var n={};if("eq"==nameq){if($("#balInput").val($("#qryInput").val()?$("#qryInput").val():$("#qryInput").attr("placeholder").split("(")[0]),setBal(),"!"==(e=await balance())[0])return;if(input(),!$("#addDescription").val())return alert("无描述!");if(!confirm(e+(t?"有相似项,":"")+"确认上传?"))return;$("#qryInput").val(e),n={content:$("#qryInput").val(),conditions:$("#addCondition").val(),descriptions:$("#addDescription").val()}}else if("mo"==nameq){if(getClass(),!$("#addTitle").val())return alert("无中文名!");if(!checkIon()&&(await autoClass(),!checkIon())&&!confirm("电荷总数不为零,确认继续?"))return;if(!confirm((t?"有相似项,":"")+"确认上传?"))return;n={content:$("#qryInput").val(),title:$("#addTitle").val(),descriptions:$("#addDescription").val(),class:JSON.stringify(filClass()),ions:JSON.stringify(ionList),type:type}}else if("io"==nameq){if(getClass(),!$("#addTitle").val())return alert("无中文名!");if(!checkIon(1)&&!confirm("电荷总数不符,确认继续?"))return;if(!confirm((t?"有相似项,":"")+"确认上传?"))return;n={content:$("#qryInput").val(),class:JSON.stringify(filClass()),title:$("#addTitle").val()}}"upd"==modeq&&(n.id=$("#addIdText").val()),n.content&&doUpload(JSON.stringify(n))}function query(){if("query"==modeq||"add"==modeq){var e;if("mo"==nameq&&"query"==modeq&&useIonId){if(""==ionRegex)return;e=JSON.stringify({content:ionRegex,type:"ions"})}else{var t=getRegex();if(""==t)return;e=JSON.stringify({content:t,type:useIon&&"query"==modeq&&"mo"==nameq?useIonId?"ionid":"ions":"content"})}doQuery(e).then(e=>{"add"==modeq&&upload(e)})}"upd"==modeq&&upload(0)}var curCount={},curClass={};function getClass(e=0){var t=parseEquation($("#qryInput").val());if(!e)for(var n in curCount)curClass[n]=$("#class-"+n).val();if($("#class").empty(),t!=curCount)for(var a in"{}"==JSON.stringify(t)?$("#pclass").show():$("#pclass").hide(300),t)$("#class").append(`<span class="input-group-addon">${a}</span><input id="class-${a}" type="text" class="form-control" autocomplete="off" placeholder="">`),$("#class-"+a).val(curClass[a]),curCount[a]||($("#class-"+a).hide(),$("#class-"+a).show(300));curCount=t}function filClass(){var e=[];for(j in curCount)if(curClass[j].match(",")){var t=curClass[j].split(",");for(k=0;k<t.length;k++){var n={};n[j]=t[k],t[k]&&e.push(n)}}else{var a={};a[j]=curClass[j],curClass[j]&&e.push(a)}return e}async function autoClass(){for(i in await getIons(),curClass)curClass[i]="";for(let e=0;e<ionList.length;e++){var t=JSON.parse(ionClass[ionList[e].id]);for(let e=0;e<t.length;e++)for(k in t[e])curClass[k]?curClass[k]+=","+t[e][k]:curClass[k]=t[e][k]}getClass(1)}var ionList=[],ionClass={};async function getIons(){$(".frame")[3].classList.add("active"),$(".qry-group>label")[2].classList.add("active"),getClass();let e="";for(var t in curCount)e+="|"+t;bd=JSON.stringify({content:"^(("+e.slice(1)+")\\d?)+(<|[^a-z])"}),nameq="io",await doQuery(bd,""),nameq="mo",$("#qryInputRender-io").append(" - 点击标签以添加")}async function getOkIons(){let e=$("#qryInput").val();e&&e.replace(/[^\d,]/g,"")==e&&(e=e.replace(/,/g,"' or id='"),bd=JSON.stringify({content:e}),nameq="io",await doQuery(bd,"id",0),nameq="mo")}function updateIon(){let t="";if($(".ionList").empty(),!ionList.length)return $(".ionList").append("...");for(let e=0;e<ionList.length;e++)t+=`<span class="ion"><span class="label label-ion" onclick="removeIon(${ionList[e].id})">${ionList[e].id}</span> ${renderEquation(ionList[e].v)} x${ionList[e].c}</span>/`;t+=' 点击标签以减少 / <span style="cursor:pointer" class="glyphicon glyphicon-trash" onclick="clearIon()"></span>',$(".ionList").append(t),preview&&MathJax.typeset()}function clearIon(){ionList=[],updateIon()}function addIon(t,e){console.log(ionList),ionList.filter(e=>(e.id==t&&(e.c++,$(".count-ion-"+t).text(e.c+" ")),e.id==t)).length||($(".count-ion-"+t).text("1 "),ionList.push({id:t,v:e,c:1})),updateIon()}function removeIon(t,e){ionList=ionList.filter(e=>(e.id==t&&(e.c--,$(".count-ion-"+t).text(e.c+" ")),e.c)),updateIon()}function checkIon(e=0){e=e&&$("#qryInput").val().replace(/<e([+-])>/g,"<1e$1>").replace(/.*<(\d)e([+-])>$/g,"$2$1");let t=0;for(var n in curCount){if(curClass[n].match(","))return!0;t+=curCount[n]*curClass[n]}return t==e}function input2(){"add"!=modeq&&"upd"!=modeq||"mo"!=nameq&&"io"!=nameq||getClass(),"mo"==nameq&&"query"==modeq&&useIonId?getOkIons():$("#qryInput").val()&&$("#qryInput").val().match(/^\d+!?$/g)?doQuery(JSON.stringify({content:$("#qryInput").val().split("!")[0]}),"id",0):$("#qryInput").val().match("!")&&($("#qryInput").val($("#qryInput").val().split("!")[0]),doQuery(JSON.stringify({content:getRegex()}),"",2)),"eq"==nameq?$("#qryInputRender")[0]&&(preview?$("#qryInputRender").html(renderEquation(strict?$("#qryInput").val()+"="+$("#qryInput2").val():$("#qryInput").val())):$("#qryInputRender").text(strict?$("#qryInput").val()+"="+$("#qryInput2").val():$("#qryInput").val())):$("#qryInputRender-"+nameq)[0]&&(preview?$("#qryInputRender-"+nameq).html(renderEquation($("#qryInput").val())):$("#qryInputRender-"+nameq).text($("#qryInput").val())),preview&&MathJax.typeset()}function getC(e){return"eq"==e?1:"mo"==e?2:"io"==e?3:void 0}function inputId(){var e=JSON.stringify({content:$("#addIdText").val()});$("#addIdText").val()?doQuery(e,"id"):"el"!=nameq&&($(".frame")[getC(nameq)].innerHTML="")}function qryToggleMatch(){matchMode="mole"==matchMode?"elem":"mole"}var typelist=["单质","酸","碱","盐","氧化物","氢化物"],type=typelist[0];