Автозамена английских имён на русские на «Чесскоме»

PHOTO EMBED

Wed Oct 23 2024 12:48:55 GMT+0000 (Coordinated Universal Time)

Saved by @Artemsikin

// ==UserScript==
// @name         Chess.com Имена на Русском Языке
// @namespace    http://tampermonkey.net/
// @version      1.5
// @description  Автозамена английских имён на русские на chess.com с постоянным отслеживанием изменений интерфейса
// @author       Anton Kim
// @match        https://www.chess.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Массив для замены текстов
    const replacements = {
        "Magnus Carlsen": "Магнус Карлсен",
        "Alireza Firouzja": "Алиреза Фирузджа",
        "Maxime Vachier-Lagrave": "Максим Вашье-Лаграв",
        "": "",
        "": "",
        "": "",
        // Добавьте другие имена здесь
    };

    // Кэширование обработанных узлов для предотвращения повторной обработки
    const processedNodes = new WeakSet();

    // Функция для замены текста на странице
    function replaceText(node) {
        if (node.nodeType === 3 && !processedNodes.has(node)) { // Проверяем, текст ли это и был ли он уже обработан
            let originalText = node.textContent;
            let newText = originalText;

            for (let [enName, ruName] of Object.entries(replacements)) {
                if (originalText.includes(enName)) { // Оптимизация: выполняем замену только если строка содержит имя
                    newText = newText.replace(new RegExp(enName, 'g'), ruName);
                }
            }

            // Заменяем текст только если были изменения
            if (newText !== originalText) {
                node.textContent = newText;
                processedNodes.add(node); // Кэшируем этот узел
            }
        }
    }

    // Функция для обхода всех узлов страницы
    function walk(node) {
        let child, next;

        switch (node.nodeType) {
            case 1:  // Элемент
            case 9:  // Документ
            case 11: // Фрагмент
                child = node.firstChild;
                while (child) {
                    next = child.nextSibling;
                    walk(child);
                    child = next;
                }
                break;

            case 3: // Текстовый узел
                replaceText(node);
                break;
        }
    }

    // Постоянный MutationObserver для слежения за изменениями интерфейса
    function observeMutations() {
        const observer = new MutationObserver(function(mutations) {
            mutations.forEach(function(mutation) {
                mutation.addedNodes.forEach(node => {
                    if (node.nodeType === 1) { // Только элементы
                        walk(node); // Проверяем новые узлы
                    }
                });

                // Также проверяем изменения текста в существующих узлах
                mutation.target.childNodes.forEach(node => {
                    if (node.nodeType === 3) { // Текстовые узлы
                        replaceText(node); // Обновляем текст при его изменении
                    }
                });
            });
        });

        // Наблюдаем за изменениями в body и всём поддереве
        observer.observe(document.body, { childList: true, subtree: true, characterData: true });
    }

    // Запуск функции сразу на загрузке страницы и отслеживание изменений
    walk(document.body);
    observeMutations();

})();
content_copyCOPY

https://antonkim.ru/chess/all/auto-replace-english-names-to-russian-names-on-chess-com/