// ==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();
})();