Skip to content

Instantly share code, notes, and snippets.

@minoki
Last active August 31, 2015 05:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save minoki/6a750010a3e900d5652f to your computer and use it in GitHub Desktop.
Save minoki/6a750010a3e900d5652f to your computer and use it in GitHub Desktop.
MyOPACのログインフォームを改善したりいろいろ
// ==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