CJK部首/康熙部首文字置き換え表示スクリプト

Replace Kangxi radicals with normal characters based on data from Google Sheets

当前为 2024-03-03 提交的版本,查看 最新版本

// ==UserScript==
// @name         CJK部首/康熙部首文字置き換え表示スクリプト
// @namespace    http://tampermonkey.net/
// @version      0.33
// @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 || isMouseOver) { // ユーザーが入力中またはマウスオーバー中の場合はスキップ
            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或关注我们的公众号极客氢云获取最新地址