// ==UserScript==
// @name 国立アイヌ民族博物館アイヌ語アーカイブの 辞書の 強化
// @namespace https://lit.link/toracatman
// @version 2025-09-10
// @description 国立アイヌ民族博物館アイヌ語アーカイブの 辞書の 機能を 強化します。
// @author トラネコマン
// @match https://ainugo.nam.go.jp/dic*
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant none
// @license MIT
// ==/UserScript==
let flag = "ig";
let c = [
["á", "a"], ["í", "i"], ["ú", "u"], ["é", "e"], ["ó", "o"],
[", ?", "、"], ["\\. ?", "。"], ["! ?", "!"], ["\\? ?", "?"],
[" ?“", "「"], ["” ?", "」"], [" ?‘", "『"], ["’ ?", "』"],
["(?<=[a-z])-(?=[a-z])", "・"], ["(?<=[a-z])=|=(?=[a-z])", "゠"],
["a[hx]", "aㇵ"], ["i[hx]", "iㇶ"], ["u[hx]", "uㇷ"], ["e[hx]", "eㇸ"], ["o[hx]", "oㇹ"],
["ar", "aㇻ"], ["ir", "iㇼ"], ["ur", "uㇽ"], ["er", "eㇾ"], ["or", "oㇿ"],
["[hxㇵ-ㇹ]a", "ハ"], ["[hxㇵ-ㇹ]i", "ヒ"], ["[hxㇵ-ㇹ]u", "フ"], ["[hxㇵ-ㇹ]e", "ヘ"], ["[hxㇵ-ㇹ]o", "ホ"], ["[hx]", "ㇵ"],
["[rㇻ-ㇿ]a", "ラ"], ["[rㇻ-ㇿ]i", "リ"], ["[rㇻ-ㇿ]u", "ル"], ["[rㇻ-ㇿ]e", "レ"], ["[rㇻ-ㇿ]o", "ロ"], ["r", "ㇽ"],
["ka", "カ"], ["ki", "キ"], ["ku", "ク"], ["ke", "ケ"], ["ko", "コ"], ["k", "ㇰ"],
["ga", "ガ"], ["gi", "ギ"], ["gu", "グ"], ["ge", "ゲ"], ["go", "ゴ"], ["g", "ㇰ゙"],
["(ts|ċ)a",""], ["ċi",""], ["(ts|ċ)u","ツ"], ["(ts|ċ)e",""], ["(ts|ċ)o",""],
["sa", "サ"], ["ṡi", ""], ["su", "ス"], ["se", "セ"], ["so", "ソ"],
["şa", ""], ["[sş]i", "シ"], ["şu", ""], ["şe", ""], ["şo", ""],
["dza",""], ["dżi",""], ["dzu","ヅ"], ["dze",""], ["dzo",""],
["za", "ザ"], ["żi", ""], ["zu", "ズ"], ["ze", "ゼ"], ["zo", "ゾ"],
["dja",""], ["d[jz]i","ヂ"], ["dju",""], ["dje",""], ["djo",""],
["ja", ""], ["[jz]i", "ジ"], ["ju", ""], ["je", ""], ["jo", ""],
["ca", ""], ["(ts|c)i", "チ"], ["cu", ""], ["ce", ""], ["co", ""],
["(ts|ċ)",""], ["ṡ", "ㇲ"], ["[sş]", "ㇱ"], ["dż","ッ゙"], ["ż", "ㇲ゙"], ["d[jz]","゙"], ["[jz]", "ㇱ゙"], ["c", ""],
["ta", "タ"], ["ti", ""], ["tu", ""], ["te", "テ"], ["to", "ト"], ["t", "ㇳ"],
["da", "ダ"], ["di", ""], ["du", ""], ["de", "デ"], ["do", "ド"], ["d", "ㇳ゙"],
["na", "ナ"], ["ni", "ニ"], ["nu", "ヌ"], ["ne", "ネ"], ["no", "ノ"], ["n", "ン"],
["ḣu", ""],
["ba", "バ"], ["bi", "ビ"], ["bu", "ブ"], ["be", "ベ"], ["bo", "ボ"], ["b", "ㇷ゙"],
["pa", "パ"], ["pi", "ピ"], ["pu", "プ"], ["pe", "ペ"], ["po", "ポ"], ["p", "ㇷ゚"],
["ma", "マ"], ["mi", "ミ"], ["mu", "ム"], ["me", "メ"], ["mo", "モ"], ["m", "ㇺ"],
["ya", "ヤ"], ["yi", "𛄠"], ["yu", "ユ"], ["ye", "𛄡"], ["yo", "ヨ"], ["y", ""],
["wa", "ワ"], ["wi", "ヰ"], ["wu", "𛄢"], ["we", "ヱ"], ["wo", "ヲ"], ["w", ""],
["va", "ヷ"], ["vi", "ヸ"], ["vu", ""], ["ve", "ヹ"], ["vo", "ヺ"], ["v", "゙"],
["fa", ""], ["fi", ""], ["fu", ""], ["fe", ""], ["fo", ""], ["f", "゚"],
["a", "ア"], ["i", "イ"], ["u", "ウ"], ["e", "エ"], ["o", "オ"],
["ʼ", ""]
];
let source = {
tamura: {name: "田村", mark: "出典:田村"},
kayano: {name: "萱野", mark: "出典:萱野"},
cxiri: {name: "知里", mark: ""}
};
for (let a in source) {
source[a].enable = (localStorage.getItem(a) ?? "true") == "true";
}
let display;
function updateAuthor() {
let css = "";
for (let a in source) {
if (!source[a].enable) {
css += `
.${a} {
display: none;
}
`;
}
}
display.textContent = css;
}
let order;
(() => {
let style = document.createElement("style");
style.textContent = '@font-face{font-family:"Mkana+";src:local("Mkana+"),url("https://toracatman.github.io/fonts/mkanaplus.woff2")format("woff2"),url("https://toracatman.github.io/fonts/mkanaplus.woff")format("woff");font-display:swap;}.kana{font-family:"Mkana+";}dd{white-space:pre-line;}dd:first-line{font-size:0}';
document.head.appendChild(style);
let dt = document.getElementsByTagName("dt");
for (let i = 0; i < dt.length; i++) {
let s = dt[i].textContent;
for (let j = 0; j < c.length; j++) {
s = s.replace(new RegExp(c[j][0], flag), c[j][1]);
}
dt[i].insertAdjacentHTML("beforeend", ` / <span class="kana">${s}</span>`);
}
display = document.createElement("style");
updateAuthor();
document.head.appendChild(display);
let html = `
<h2>オプション</h2>
<h3>出典</h3>`;
for (let a in source) {
html += `<label><input class="schSource" type="checkbox" name="${a}"${source[a].enable ? " checked" : ""}>${source[a].name}</label>`;
}
document.getElementById("wordForm").insertAdjacentHTML("afterend", html);
let schSource = document.getElementsByClassName("schSource");
for (let i = 0; i < schSource.length; i++) {
schSource[i].addEventListener("change", function() {
source[this.name].enable = this.checked;
localStorage.setItem(this.name, this.checked);
updateAuthor();
});
}
order = localStorage.getItem("order") ?? "ain-ja";
html = `
<label><input class="schOrder" type="radio" name="order" value="ain-ja"${order == "ain-ja" ? " checked" : ""}>アイヌ語→日本語</label>
<label><input class="schOrder" type="radio" name="order" value="ja-ain"${order == "ja-ain" ? " checked" : ""}>日本語→アイヌ語</label>
`;
document.getElementById("sch-word").insertAdjacentHTML("afterend", html);
let schOrder = document.getElementsByClassName("schOrder");
for (let i = 0; i < schOrder.length; i++) {
schOrder[i].addEventListener("change", function() {
order = this.value;
localStorage.setItem("order", this.value);
});
}
let dd = document.getElementsByTagName("dd");
for (let i = 0; i < dd.length; i++) {
let text = dd[i].textContent;
for (let a in source) {
if (text.indexOf(source[a].mark) !== -1) {
dd[i].classList.add(a);
dd[i].previousElementSibling.classList.add(a);
break;
}
}
}
if (order == "ja-ain") {
dd = Array.from(dd);
for (let i = 0; i < dd.length; i++) {
let text = dd[i].textContent;
let o = text.slice(text.indexOf("\n", text.indexOf("\n") + 1))
.replace(/【.+?】/g, "")
.replace(/\[.+?\]/g, "")
.replace(/\(.+?\)/g, "")
.trim().indexOf(document.getElementById("sch-word").value)
dd[i].setAttribute("data-order", o == -1 ? Number.MAX_SAFE_INTEGER : o);
}
dd.sort((a, b) => Number(a.getAttribute("data-order")) - Number(b.getAttribute("data-order")));
let f = document.createDocumentFragment();
let dl = document.querySelector("dl");
f.appendChild(dl);
let dl2 = document.createElement("dl");
for (let i = 0; i < dd.length; i++) {
dl2.appendChild(dd[i].previousElementSibling);
dl2.appendChild(dd[i]);
}
document.querySelector(".xresultDict").appendChild(dl2);
}
})();