Автозамена английских имён на русские на «Чесскоме»
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(); })();
Comments