Last active
August 31, 2015 05:24
-
-
Save minoki/6a750010a3e900d5652f to your computer and use it in GitHub Desktop.
MyOPACのログインフォームを改善したりいろいろ
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name Better MyOPAC | |
// @namespace http://d-poppo.nazo.cc/ | |
// @description MyOPACのログインフォーム等を改善する | |
// @include https://opac.dl.itc.u-tokyo.ac.jp/myopac/ | |
// @include https://opac.dl.itc.u-tokyo.ac.jp/myopac/index.php* | |
// @include https://opac.dl.itc.u-tokyo.ac.jp/opac/opac_list.cgi | |
// @include https://opac.dl.itc.u-tokyo.ac.jp/optsrv/opac_list.php* | |
// @version 5 | |
// @grant none | |
// @author ARATA Mizuki | |
// @license MIT http://opensource.org/licenses/mit-license.php | |
// ==/UserScript== | |
'use strict'; | |
function getElementByXPath(x,root) { | |
var r = document.evaluate(x, root || document, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null); | |
return r.singleNodeValue; | |
} | |
// 「ログイン」 | |
function better_login_form() { | |
var loginspace = document.getElementById("loginspace"); | |
if (loginspace) { | |
var login_button = getElementByXPath(".//a[@onclick='submit_check(); return false;']", loginspace); | |
if (login_button) { | |
var submit = document.createElement("button"); | |
submit.setAttribute("type", "submit"); | |
submit.style.display = 'none'; | |
login_button.parentNode.insertBefore(submit, login_button); | |
login_button.addEventListener("click", function() { submit.click(); }, false); | |
} | |
window.chk_key = function() {}; | |
window.submit_check = function() {}; | |
var LOGIN_USERID = document.getElementById("LOGIN_USERID"); | |
if (LOGIN_USERID) { | |
LOGIN_USERID.required = true; | |
} | |
var LOGIN_PASS = document.getElementById("LOGIN_PASS"); | |
if (LOGIN_PASS) { | |
LOGIN_PASS.required = true; | |
} | |
/* | |
var frm1 = document.getElementById("frm1"); | |
if (frm1) { | |
frm1.addEventListener("submit", function(event) { | |
if (LOGIN_USERID.value === "" || LOGIN_PASS.value === "") { | |
alert(MSG_NOTHAVE_INPUT); | |
event.preventDefault(); | |
} | |
}, false); | |
} | |
*/ | |
} | |
} | |
// 「検索」 | |
function better_search_form() { | |
var opacsearch = document.getElementById("opacsearch"); | |
var frm_opacsearch = opacsearch && getElementByXPath("./form[@name='frm_opacsearch']", opacsearch); | |
if (frm_opacsearch) { | |
frm_opacsearch.action = "/myopac/insert_op.php"; | |
frm_opacsearch.target = "opacsearch"; | |
var opackywd = document.getElementById("opackywd"); | |
if (opackywd) { | |
opackywd.name = "kywd"; | |
opackywd.required = true; | |
frm_opacsearch.opackywd = opackywd; | |
} | |
var lang = getElementByXPath(".//input[@type='hidden' and @name='LANG']", opacsearch); | |
if (lang) { | |
lang.name = "lang"; | |
frm_opacsearch.LANG = lang; | |
} | |
var search_button = getElementByXPath(".//a[@onclick='opac_search(); return false;']", opacsearch); | |
if (search_button) { | |
var submit = document.createElement("button"); | |
submit.setAttribute("type", "submit"); | |
submit.style.display = 'none'; | |
search_button.parentNode.insertBefore(submit, search_button); | |
search_button.addEventListener("click", function() { submit.click(); }, false); | |
window.chk_key = function() {}; | |
window.opac_search = function() {}; | |
} | |
/* | |
frm_opacsearch.addEventListener("submit", function(event) { | |
if (opackywd.value === "") { | |
alert(MSG_NOTINPUT_KEYWORD); | |
event.preventDefault(); | |
} | |
}, false); | |
*/ | |
} | |
} | |
// 検索結果 | |
function better_search_result() { | |
var main_list = document.getElementById("main_list"); | |
if (main_list) { | |
var links = document.evaluate("./table[@class='result_list']/tbody/tr/td[@class='list_result']/span/a[starts-with(@href,\"javascript:DisplayWindow('\")]", main_list, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); | |
// .//div[@id='main_list']/table[@class='result_list']/tbody/tr/td[@class='list_result']/span/a[starts-with(@href,\"javascript:DisplayWindow('\") and ends-with(@href,\"','1');\")] | |
console.log('search result links:', links ? links.snapshotLength : null); | |
for (var i = 0; i < links.snapshotLength; ++i) { | |
var item = links.snapshotItem(i); | |
var href = item.getAttribute("href"); | |
var m = href.match(/^javascript\:DisplayWindow\((.*?)\,\'1\'\)\;$/); | |
if (m) { | |
var url = eval(m[1]); | |
item.setAttribute("href", url); | |
item.setAttribute("target", "_blank"); | |
} | |
} | |
} | |
} | |
// 検索結果の「所蔵館」を冊数順に並べ替える | |
function better_search_result_department() { | |
var facet_block = document.getElementById("facet_block"); | |
var facet_list = facet_block ? getElementByXPath("./table/tbody/tr/td/div[@class='facet_list']", facet_block) : null; | |
var isElementNode = function(e) { return e.nodeType === Node.ELEMENT_NODE; }; | |
if (facet_block && facet_list) { | |
var facet_list_observer = new MutationObserver(function(mutations) { | |
mutations.forEach(function(mutation) { | |
var facet_item1 = Array.prototype.filter.call(mutation.addedNodes, function(e) { return isElementNode(e) && e.id === "facet_item1"; })[0]; | |
if (facet_item1) { | |
facet_list_observer.disconnect(); | |
var facet_item1_observer = new MutationObserver(function(mutations) { | |
mutations.forEach(function(mutation) { | |
var table = Array.prototype.filter.call(mutation.addedNodes, function(e) { return isElementNode(e) && e.tagName === "TABLE"; })[0]; | |
if (table) { | |
facet_item1_observer.disconnect(); | |
setTimeout(function() { | |
var dptidpl_block = getElementByXPath("./tbody/tr/td/div[@class='dptidpl_block']", table); | |
var facets1 = getElementByXPath("./ul[@class='facet_item']", dptidpl_block); | |
var facets2 = getElementByXPath("./div[@id='dptidpl_list']/ul[@class='facet_item']", dptidpl_block); | |
if (facets1 && facets2) { | |
var list1 = Array.prototype.filter.call(facets1.childNodes, isElementNode); | |
var list2 = Array.prototype.filter.call(facets2.childNodes, isElementNode); | |
list1.forEach(function(e) { facets1.removeChild(e); }); | |
list2.forEach(function(e) { facets2.removeChild(e); }); | |
var all = list1.concat(list2).map(function(elem) { | |
var m = elem.lastChild.textContent.match(/\((\d+)\)/); | |
return {elem: elem, count: m ? parseInt(m[1]) : -1}; | |
}); | |
all.sort(function(x,y) { return y.count - x.count; }); | |
all.forEach(function(e,i) { | |
if (i < list1.length) { | |
facets1.appendChild(e.elem); | |
} else { | |
facets2.appendChild(e.elem); | |
} | |
}); | |
} | |
}, 0); | |
} | |
}); | |
}); | |
facet_item1_observer.observe(facet_item1, {childList: true}); | |
} | |
}); | |
}); | |
facet_list_observer.observe(facet_list, {childList: true}); | |
} | |
} | |
function init() { | |
console.log("Better MyOPAC is running"); | |
better_login_form(); | |
better_search_form(); | |
better_search_result(); | |
better_search_result_department(); | |
} | |
if (document.readyState === "interactive" || document.readyState === "complete") { | |
init(); | |
} else { | |
window.addEventListener('load', init, false); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment