MediaWiki:LBSSearch.js: Difference between revisions

No edit summary
No edit summary
 
Line 1: Line 1:
mw.loader.load("http://jcbl.jp/mediawiki/js/jquery/jquery-ui.css", "text/css");
/*
mw.loader.load("http://jcbl.jp/mediawiki/js/jquery/jquery-ui.min.js", "text/javascript");
Last-Update: 2023/01/24
 
*/
addOnloadHook(init)
class LBSSearch
 
allChain = Array();
function init()
{
{
  var button = document.getElementById("sequence_search_button");
constructor()
  button.onclick = function(){
{
    sequenceSearch();
this.allChain = Array();
  }
  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 = "^";
    chainSearch(nre + searchchain + ".*", mainchain, "AdvResult");
  }


    // get all chain
var button = document.getElementById("sequence_search_button");
  var url = '/mediawiki/api.php?action=query&prop=revisions&redirects=1&titles=Persist:ListAllChains&rvprop=content&rvparse=1&format=xml';
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");
}


  var xmlHttpRequest = new XMLHttpRequest();
// get all chain
  xmlHttpRequest.onreadystatechange = function()
var url = '/mediawiki/api.php?action=query&prop=revisions&redirects=1&titles=Persist:ListAllChains&rvprop=content&rvparse=1&format=xml';
  {
fetch(url, {
    var READYSTATE_COMPLETED = 4;
method: 'GET',
    if(this.readyState == READYSTATE_COMPLETED){
headers: { 'Content-Type': 'plain/text; charset=utf-8' },
      var HTTP_STATUS_OK = 200;
      if(this.status == HTTP_STATUS_OK) {
        // success
        var xml     = this.response.trim();
        var parser  = new DOMParser();
        var dom    = parser.parseFromString(xml, 'text/xml');
        var rev    = dom.getElementsByTagName("rev")[0];
        var choices;
        if(rev.innerHTML != undefined)
          choices = rev.innerHTML.replace("<ul><li>","").replace("</li></ul>","").split("</li><li>");
        else // for Edge
          choices = rev.textContent.replace("<ui><ll>","").replace("</li></ul>","").split("</li><li>");


        var uniqChoices = Array();
}).then((res) => { // 結果取得
        for(var i = 0; i < choices.length; i ++){
if(!res.ok)
          var w = choices[i].trim().split("==");
throw new Error(`${res.status} ${res.statusText}`);
          allChain.push({"id":w[0], "chain":w[1], "img":w[2]});
return res.text();
          if(uniqChoices.indexOf(w[1]) == -1)
            uniqChoices.push(w[1]);
        }
        $('#advanced_polysaccharide_sequence').autocomplete({
          source:    uniqChoices,
          autoFocus: false,
          delay:    0,
          minLength: 4
        });


        // ボタン有効化
}).then((text) => {
        var button = document.getElementById("sequence_search_button");
// success
        button.disabled = false;
var xml    = text.trim();
        button = document.getElementById("advanced_search_button");
var parser  = new DOMParser();
        button.disabled = false;
var dom    = parser.parseFromString(xml, 'text/xml');
        var loading = document.getElementById("loading");
var rev    = dom.getElementsByTagName("rev")[0];
        loading.style.display = "none";
var html;
      } else {
if(rev.innerHTML != undefined)
        // error
    html = rev.innerHTML.replace(/&lt;/g, "<").replace(/&gt;/g, ">");
        console.log('retrieving is failed. ' + this.status + ':' + this.statusText + "/" + this.readyState);
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
});


  // search
// ボタン有効化
  xmlHttpRequest.open('GET', url, true);
var button = document.getElementById("sequence_search_button");
  xmlHttpRequest.responseType = 'text';
button.disabled = false;
  xmlHttpRequest.send(null);
button = document.getElementById("advanced_search_button");
}
button.disabled = false;
var loading = document.getElementById("loading");
loading.style.display = "none";
});
}


function sequenceSearch()
sequenceSearch()
{
{
  var ops = [];
var ops = [];
  ops[0] = document.getElementById("nre");
ops[0] = document.getElementById("nre");
  ops[1] = document.getElementById("4th");
ops[1] = document.getElementById("4th");
  ops[2] = document.getElementById("3th");
ops[2] = document.getElementById("3th");
  ops[3] = document.getElementById("2nd");
ops[3] = document.getElementById("2nd");
  ops[4] = document.getElementById("1st");
ops[4] = document.getElementById("1st");
  ops[5] = document.getElementById("re");
ops[5] = document.getElementById("re");


  var st;
var st;
  var mc;
var mc;
  var searchtext = "";
var searchtext = "";
  var mainchain  = "";
var mainchain  = "";
  var counter = 0;
var counter = 0;
  for(var i = 0; i < ops.length; i ++){
for(var i = 0; i < ops.length; i ++){
    st = ops[i].options[ops[i].selectedIndex].innerHTML;
st = ops[i].options[ops[i].selectedIndex].innerHTML;
    mc = ops[i].options[ops[i].selectedIndex].value;
mc = ops[i].options[ops[i].selectedIndex].value;
    searchtext += st;
searchtext += st;
    mainchain  += mc;
mainchain  += mc;
    if(i == 0 || i == ops.length-1)
if(i == 0 || i == ops.length-1)
      continue;
continue;
    if(st === "Others")
if(st === "Others")
      counter ++;
counter ++;
  }
}
  if(counter >= 3){
if(counter >= 3){
    alert("3つ以上のあいまい条件指定はできません。");
alert("3つ以上のあいまい条件指定はできません。");
    return;
return;
  }
}
  chainSearch(mainchain, searchtext, "PolySeqResult");
this.chainSearch(mainchain, searchtext, "PolySeqResult");
}
}


function chainSearch(mainchain, searchtext, resultDiv)
chainSearch(mainchain, searchtext, resultDiv)
{
{
  // search
// search
  var result = Array();
var result = Array();
  var regexp = new RegExp(mainchain, "i");
var regexp = new RegExp(mainchain, "i");
  for(var i = 0; i < allChain.length; i ++){
for(var i = 0; i < this.allChain.length; i ++){
    if(regexp.test(allChain[i]["chain"])){
if(regexp.test(this.allChain[i]["chain"])){
      result[allChain[i]["id"]] = allChain[i]["img"].replace(/&lt;/g,"<").replace(/&gt;/g,">") + allChain[i]["chain"];
result[this.allChain[i]["id"]] = this.allChain[i]["img"].replace(/&lt;/g,"<").replace(/&gt;/g,">") + this.allChain[i]["chain"];
    }
}
  }
}


  // display
// display
  var html = "Search Text: " + searchtext + "<br />";
var html = "Search Text: " + searchtext + "<br />";
  html += "Search Expression: " + mainchain + "<br />";
html += "Search Expression: " + mainchain + "<br />";
  var keys = Object.keys(result);
var keys = Object.keys(result);
  html += keys.length + " Hit(s) / " + allChain.length + ".<hr />";
html += keys.length + " Hit(s) / " + this.allChain.length + ".<hr />";
  html += "<ol>";
html += "<ol>";
  for(var i = 0; i < keys.length; i ++){
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 += "<li><a href=\"/wiki/" + keys[i] + "\" target=\"_blank\"><big><tt>" + keys[i] + "</tt></big></a>" + result[keys[i]] + "</li>";
  }
}
  html += "</ol>";
html += "</ol>";


  var div = document.getElementById(resultDiv);
var div = document.getElementById(resultDiv);
  div.innerHTML    = html;
div.innerHTML    = html;
  div.style.display = "block";
div.style.display = "block";
}
}
}

Latest revision as of 04: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(/&lt;/g, "<").replace(/&gt;/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(/&lt;/g,"<").replace(/&gt;/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";
	}
}