MediaWiki:LBSSearch.js: Difference between revisions
Jcblmaster (talk | contribs) No edit summary |
Jcblmaster (talk | contribs) No edit summary |
||
| (4 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
/* | |||
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"; | |||
} | |||
} | } | ||
Latest revision as of 13:19, 25 January 2023
/*
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";
}
}