Replace Kangxi radicals with normal characters based on data from Google Sheets
当前为
// ==UserScript==
// @name CJK部首/康熙部首文字置き換え表示スクリプト
// @namespace http://tampermonkey.net/
// @version 0.34
// @description Replace Kangxi radicals with normal characters based on data from Google Sheets
// @author You
// @match *://*/*
// @exclude /^[^:/#?]*:\/\/([^#?/]*\.)?greasyfork\.org(:[0-9]{1,5})?\/.*$/
// @grant GM_xmlhttpRequest
// @license MIT
// ==/UserScript==
(function() {
'use strict';
// グローバル変数としてデータを保持
var kangxiRadicals = {};
// Google Sheets の公開URL
var spreadsheetUrl = 'https://docs.google.com/spreadsheets/d/1rKTSCyWkeMEJ-tp9Fr95UjH-NL-xliVX-gu69-WnX3c';
// Google Sheets からデータを取得して処理する関数
function processDataFromGoogleSheets(data) {
try {
// データの処理を行う
var lines = data.split('\n');
var headerFound = false;
for (var i = 0; i < lines.length; i++) {
var line = lines[i].trim();
if (!headerFound && line.startsWith("CID")) {
headerFound = true;
continue; // CID行をスキップ
}
if (headerFound) {
var parts = line.split(',');
if (parts.length >= 5) {
kangxiRadicals[parts[3]] = parts[4];
}
}
}
} catch (error) {
console.error('Error processing data from Google Sheets:', error);
}
}
// ページ内のテキストを置き換える関数
function replaceText(node) {
if (node.nodeType === Node.TEXT_NODE && /\p{Unified_Ideograph}/u.test(node.nodeValue)) {
var text = node.nodeValue;
for (var radical in kangxiRadicals) {
var regex = new RegExp(radical, 'g');
text = text.replace(regex, kangxiRadicals[radical]);
}
node.nodeValue = text;
} else if (node.nodeType === Node.ELEMENT_NODE && node.tagName !== 'TEXTAREA' && node.tagName !== 'INPUT') {
for (var i = 0; i < node.childNodes.length; i++) {
replaceText(node.childNodes[i]);
}
}
}
// ページ内の全てのテキストを置き換える
function replaceAllText() {
replaceText(document.body);
}
var typingTimer;
var doneTypingInterval = 15000; // 15秒後に文字置換を再開
var isInputting = false; // ユーザーが入力中かどうかのフラグ
var isFirstMutation = false; // 初めての変更かどうかのフラグ
var isMouseOver = false; // マウスオーバーイベント後のフラグ
// 文字入力中のイベントハンドラ
function handleInput() {
isInputting = true;
clearTimeout(typingTimer);
typingTimer = setTimeout(function() {
isInputting = false;
isFirstMutation = true;
}, doneTypingInterval);
}
// ページの読み込みが完了した時にデータを処理し、テキストを置き換える
window.addEventListener('load', function() {
GM_xmlhttpRequest({
method: 'GET',
url: spreadsheetUrl + '/export?format=csv',
onload: function(response) {
processDataFromGoogleSheets(response.responseText);
replaceAllText();
},
onerror: function(error) {
console.error('Error fetching data from Google Sheets:', error);
}
});
});
// ページのDOMが変更されたらテキストを再度置き換える
var observer = new MutationObserver(function(mutationsList) {
if (isInputting ) { // ユーザーが入力中の場合はスキップ
return;
}
if (isFirstMutation) { // ユーザーが入力後初めての変更の場合はスキップしてフラグを解除
isFirstMutation = false;
return;
}
if (isMouseOver) { // マウスオーバーイベント後初めての変更の場合はスキップしてフラグを解除
isMouseOver = false;
return;
}
replaceAllText();
});
observer.observe(document.body, { childList: true, subtree: true });
// ユーザーの文字入力を監視する
document.addEventListener('input', handleInput);
// マウスオーバーイベントのハンドラ
document.addEventListener('mouseover', function() {
isMouseOver = true;
});
})();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址