// Transliteration mapping (Latin to Cyrillic) const transliterationMap = { 'ce': 'це', 'ci': 'ци', 'cy': 'ци', 'sh': 'ш', 'ch': 'ч', 'ph': 'ф', 'th': 'ҭ', 'ya': 'я', 'yo': 'йо', 'yu': 'ю', 'ye': 'йе', 'ay': 'ай', 'ey': 'ей', 'iy': 'ий', 'oy': 'ой', 'uy': 'уй', 'a': 'а', 'b': 'б', 'c': 'к', 'd': 'д', 'e': 'е', 'f': 'ф', 'g': 'г', 'h': 'х', 'i': 'и', 'j': 'ж', 'k': 'к', 'l': 'л', 'm': 'м', 'n': 'н', 'o': 'о', 'p': 'п', 'q': 'к', 'r': 'р', 's': 'с', 't': 'т', 'u': 'у', 'v': 'в', 'w': 'ў', 'x': 'кс', 'y': 'и', 'z': 'з', 'Ce': 'Це', 'Ci': 'Ци', 'Cy': 'Ци', 'Sh': 'Ш', 'Ch': 'Ч', 'Ph': 'Ф', 'Th': 'Ҭ', 'Ya': 'Я', 'Yo': 'Йо', 'Yu': 'Ю', 'Ye': 'Йе', 'Ay': 'Ай', 'Ey': 'Ей', 'Iy': 'Ий', 'Oy': 'Ой', 'Uy': 'Уй', 'A': 'А', 'B': 'Б', 'C': 'К', 'D': 'Д', 'E': 'Е', 'F': 'Ф', 'G': 'Г', 'H': 'Х', 'I': 'И', 'J': 'Ж', 'K': 'К', 'L': 'Л', 'M': 'М', 'N': 'Н', 'O': 'О', 'P': 'П', 'Q': 'К', 'R': 'Р', 'S': 'С', 'T': 'Т', 'U': 'У', 'V': 'В', 'W': 'Ў', 'X': 'Кс', 'Y': 'И', 'Z': 'З', }; function transliterateText(text) { // Sort keys by length (longest first) to prioritize multi-character matches const sortedKeys = Object.keys(transliterationMap).sort((a, b) => b.length - a.length); // Create a regex that matches any key in the map (case-sensitive) const regex = new RegExp(sortedKeys.map(k => k.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')).join('|'), 'g'); // Replace matched Latin sequences with Cyrillic equivalents return text.replace(regex, match => transliterationMap[match] || match); } // Function to process all text nodes in the DOM function transliteratePage() { const walker = document.createTreeWalker( document.body, NodeFilter.SHOW_TEXT, { acceptNode: function (node) { // Skip script, style, and input elements const parent = node.parentElement; if (parent.tagName === 'SCRIPT' || parent.tagName === 'STYLE' || parent.tagName === 'INPUT') { return NodeFilter.FILTER_REJECT; } return NodeFilter.FILTER_ACCEPT; } }, false ); let node; while ((node = walker.nextNode())) { node.nodeValue = transliterateText(node.nodeValue); } } // Run transliteration when the page loads transliteratePage(); // Observe DOM changes for dynamic content const observer = new MutationObserver(transliteratePage); observer.observe(document.body, { childList: true, subtree: true });