MediaWiki:LBSSearch.js
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
/* Last-Update: 2023/01/24 */ class LBSSearch { constructor() { this.allChain = Array(); var button = document.getElementById("sequence_search_button"); button.onclick = function(){ gVar.lbsSearch.sequenceSearch(); } button = document.getElementById("advanced_search_button"); button.onclick = function(){ var mainchain = document.getElementById("advanced_polysaccharide_sequence").value; var searchchain = mainchain.replace(/\?/g, "\\?"); var nre = ".*"; if(document.getElementById("advanced_search_nre").checked) nre = "^"; gVar.lbsSearch.chainSearch(nre + searchchain + ".*", mainchain, "AdvResult"); } // get all chain var url = '/mediawiki/api.php?action=query&prop=revisions&redirects=1&titles=Persist:ListAllChains&rvprop=content&rvparse=1&format=xml'; fetch(url, { method: 'GET', headers: { 'Content-Type': 'plain/text; charset=utf-8' }, }).then((res) => { // 結果取得 if(!res.ok) throw new Error(`${res.status} ${res.statusText}`); return res.text(); }).then((text) => { // success var xml = text.trim(); var parser = new DOMParser(); var dom = parser.parseFromString(xml, 'text/xml'); var rev = dom.getElementsByTagName("rev")[0]; var html; if(rev.innerHTML != undefined) html = rev.innerHTML.replace(/</g, "<").replace(/>/g, ">"); else // for Edge html = rev.textContent; html = html.replace(/<div.*><ul>/, ''); var choices = html.split("</li>"); var uniqChoices = Array(); for(var i = 0; i < choices.length-1; i ++){ var w = choices[i].trim().substring(4).split("=="); gVar.lbsSearch.allChain.push({"id":w[0], "chain":w[1], "img":w[2]}); if(uniqChoices.indexOf(w[1]) == -1) uniqChoices.push(w[1]); } $('#advanced_polysaccharide_sequence').autocomplete({ source: uniqChoices, autoFocus: false, delay: 0, minLength: 4 }); // ボタン有効化 var button = document.getElementById("sequence_search_button"); button.disabled = false; button = document.getElementById("advanced_search_button"); button.disabled = false; var loading = document.getElementById("loading"); loading.style.display = "none"; }); } sequenceSearch() { var ops = []; ops[0] = document.getElementById("nre"); ops[1] = document.getElementById("4th"); ops[2] = document.getElementById("3th"); ops[3] = document.getElementById("2nd"); ops[4] = document.getElementById("1st"); ops[5] = document.getElementById("re"); var st; var mc; var searchtext = ""; var mainchain = ""; var counter = 0; for(var i = 0; i < ops.length; i ++){ st = ops[i].options[ops[i].selectedIndex].innerHTML; mc = ops[i].options[ops[i].selectedIndex].value; searchtext += st; mainchain += mc; if(i == 0 || i == ops.length-1) continue; if(st === "Others") counter ++; } if(counter >= 3){ alert("3つ以上のあいまい条件指定はできません。"); return; } this.chainSearch(mainchain, searchtext, "PolySeqResult"); } chainSearch(mainchain, searchtext, resultDiv) { // search var result = Array(); var regexp = new RegExp(mainchain, "i"); for(var i = 0; i < this.allChain.length; i ++){ if(regexp.test(this.allChain[i]["chain"])){ result[this.allChain[i]["id"]] = this.allChain[i]["img"].replace(/</g,"<").replace(/>/g,">") + this.allChain[i]["chain"]; } } // display var html = "Search Text: " + searchtext + "<br />"; html += "Search Expression: " + mainchain + "<br />"; var keys = Object.keys(result); html += keys.length + " Hit(s) / " + this.allChain.length + ".<hr />"; html += "<ol>"; for(var i = 0; i < keys.length; i ++){ html += "<li><a href=\"/wiki/" + keys[i] + "\" target=\"_blank\"><big><tt>" + keys[i] + "</tt></big></a>" + result[keys[i]] + "</li>"; } html += "</ol>"; var div = document.getElementById(resultDiv); div.innerHTML = html; div.style.display = "block"; } }