{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Антон Ким: заметки с тегом стриминг",
    "_rss_description": "Всё о шахматах: дебюты, ловушки, ошибки, тактика, стратегия, миттельшпиль, эндшпиль, стриминг",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/antonkim.ru\/chess\/tags\/streaming\/",
    "feed_url": "https:\/\/antonkim.ru\/chess\/tags\/streaming\/json\/",
    "icon": "https:\/\/antonkim.ru\/chess\/pictures\/userpic\/userpic@2x.jpg?1729599471",
    "authors": [
        {
            "name": "Антон Ким",
            "url": "https:\/\/antonkim.ru\/chess\/",
            "avatar": "https:\/\/antonkim.ru\/chess\/pictures\/userpic\/userpic@2x.jpg?1729599471"
        }
    ],
    "items": [
        {
            "id": "2",
            "url": "https:\/\/antonkim.ru\/chess\/all\/auto-replace-english-names-to-russian-names-on-chess-com\/",
            "title": "Автозамена английских имён на русские на «Чесскоме»",
            "content_html": "<p>Я освещаю шахматные турниры для русскоязычной аудитории. Даже с русским интерфейсом имена всё равно отображаются на английском, что мешает их правильно прочитать или произнести во время эфиров. Я написал скрипт, который решает эту проблему.<\/p>\n<h2>Что делать<\/h2>\n<ol start=\"1\">\n<li>Установить расширение <a href=\"https:\/\/chromewebstore.google.com\/detail\/tampermonkey\/dhdgffkkebhmkfjojejmpbldmpobfkfo\">Tampermonkey<\/a>.<\/li>\n<\/ol>\n<ol start=\"2\">\n<li>Зайти на сайт <a href=\"https:\/\/chess.com\">chess.com<\/a>.<\/li>\n<\/ol>\n<ol start=\"3\">\n<li>В правом верхнем углу браузера нажать на значок Tampermonkey.<\/li>\n<\/ol>\n<ol start=\"4\">\n<li>Нажать Create a new script или «Создать новый скрипт».<\/li>\n<\/ol>\n<ol start=\"5\">\n<li>Откроется новое окно. Всё удалить.<\/li>\n<\/ol>\n<ol start=\"6\">\n<li>Вставить скрипт:<\/li>\n<\/ol>\n<pre class=\"e2-text-code\"><code class=\"\">\/\/ ==UserScript==\n\/\/ @name         Chess.com Имена на Русском Языке\n\/\/ @namespace    http:\/\/tampermonkey.net\/\n\/\/ @version      1.5\n\/\/ @description  Автозамена английских имён на русские на chess.com с постоянным отслеживанием изменений интерфейса\n\/\/ @author       Anton Kim\n\/\/ @match        https:\/\/www.chess.com\/*\n\/\/ @grant        none\n\/\/ ==\/UserScript==\n\n(function() {\n    'use strict';\n\n    \/\/ Массив для замены текстов\n    const replacements = {\n        &quot;Magnus Carlsen&quot;: &quot;Магнус Карлсен&quot;,\n        &quot;Alireza Firouzja&quot;: &quot;Алиреза Фирузджа&quot;,\n        &quot;Maxime Vachier-Lagrave&quot;: &quot;Максим Вашье-Лаграв&quot;,\n        &quot;&quot;: &quot;&quot;,\n        &quot;&quot;: &quot;&quot;,\n        &quot;&quot;: &quot;&quot;,\n        \/\/ Добавьте другие имена здесь\n    };\n\n    \/\/ Кэширование обработанных узлов для предотвращения повторной обработки\n    const processedNodes = new WeakSet();\n\n    \/\/ Функция для замены текста на странице\n    function replaceText(node) {\n        if (node.nodeType === 3 &amp;&amp; !processedNodes.has(node)) { \/\/ Проверяем, текст ли это и был ли он уже обработан\n            let originalText = node.textContent;\n            let newText = originalText;\n\n            for (let [enName, ruName] of Object.entries(replacements)) {\n                if (originalText.includes(enName)) { \/\/ Оптимизация: выполняем замену только если строка содержит имя\n                    newText = newText.replace(new RegExp(enName, 'g'), ruName);\n                }\n            }\n\n            \/\/ Заменяем текст только если были изменения\n            if (newText !== originalText) {\n                node.textContent = newText;\n                processedNodes.add(node); \/\/ Кэшируем этот узел\n            }\n        }\n    }\n\n    \/\/ Функция для обхода всех узлов страницы\n    function walk(node) {\n        let child, next;\n\n        switch (node.nodeType) {\n            case 1:  \/\/ Элемент\n            case 9:  \/\/ Документ\n            case 11: \/\/ Фрагмент\n                child = node.firstChild;\n                while (child) {\n                    next = child.nextSibling;\n                    walk(child);\n                    child = next;\n                }\n                break;\n\n            case 3: \/\/ Текстовый узел\n                replaceText(node);\n                break;\n        }\n    }\n\n    \/\/ Постоянный MutationObserver для слежения за изменениями интерфейса\n    function observeMutations() {\n        const observer = new MutationObserver(function(mutations) {\n            mutations.forEach(function(mutation) {\n                mutation.addedNodes.forEach(node =&gt; {\n                    if (node.nodeType === 1) { \/\/ Только элементы\n                        walk(node); \/\/ Проверяем новые узлы\n                    }\n                });\n\n                \/\/ Также проверяем изменения текста в существующих узлах\n                mutation.target.childNodes.forEach(node =&gt; {\n                    if (node.nodeType === 3) { \/\/ Текстовые узлы\n                        replaceText(node); \/\/ Обновляем текст при его изменении\n                    }\n                });\n            });\n        });\n\n        \/\/ Наблюдаем за изменениями в body и всём поддереве\n        observer.observe(document.body, { childList: true, subtree: true, characterData: true });\n    }\n\n    \/\/ Запуск функции сразу на загрузке страницы и отслеживание изменений\n    walk(document.body);\n    observeMutations();\n\n})();<\/code><\/pre><ol start=\"7\">\n<li>Чтобы добавить новое имя, впишите его в «Массив для замены текстов».<\/li>\n<\/ol>\n<ol start=\"8\">\n<li>Нажать Ctrl + S, чтобы сохранить скрипт. Или в меню File — Save.<\/li>\n<\/ol>\n<ol start=\"9\">\n<li>Зайти на любой <a href=\"https:\/\/chess.com\/events\/results\">турнир в chess.com<\/a> и проверить изменения.<\/li>\n<\/ol>\n<ol start=\"10\">\n<li>Готово.<\/li>\n<\/ol>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"1080\" data-ratio=\"1\">\n<img src=\"https:\/\/antonkim.ru\/chess\/pictures\/giri-firouzja-en.jpg\" width=\"1080\" height=\"1080\" alt=\"\" \/>\n<img src=\"https:\/\/antonkim.ru\/chess\/pictures\/giri-firouzja-ru.jpg\" width=\"1080\" height=\"1080\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-caption\">Результат до и после<\/div>\n<\/div>\n<h2>Заключение<\/h2>\n<p>Этот скрипт прекрасен тем, что работает в любой части сайта. Это значит, что имена, которые вы прописали, будут меняться везде, где встретится совпадение.<\/p>\n<p>P.S. Можно добавить хоть свой ник, и заменить его на своё имя. Будете играть под своим именем. Мелочь, а приятно :—)<\/p>\n",
            "date_published": "2024-10-23T10:39:44+05:00",
            "date_modified": "2024-10-23T10:53:38+05:00",
            "tags": [
                "стриминг"
            ],
            "image": "https:\/\/antonkim.ru\/chess\/pictures\/giri-firouzja-en.jpg",
            "_date_published_rfc2822": "Wed, 23 Oct 2024 10:39:44 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "2",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css",
                    "jquery\/jquery.js",
                    "fotorama\/fotorama.css",
                    "fotorama\/fotorama.js"
                ],
                "og_images": [
                    "https:\/\/antonkim.ru\/chess\/pictures\/giri-firouzja-en.jpg",
                    "https:\/\/antonkim.ru\/chess\/pictures\/giri-firouzja-ru.jpg"
                ]
            }
        }
    ],
    "_e2_version": 4134,
    "_e2_ua_string": "Aegea 11.3 (v4134)"
}