Greasy Fork is available in English.

Telegram Unicode First Char Fix

Revives lost first Unicode char + appends full word (without first letter) if Unikey mod char used

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램을 설치해야 합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

Advertisement:

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

Advertisement:

// ==UserScript==
// @name         Telegram Unicode First Char Fix
// @namespace    http://tampermonkey.net/
// @version      2.0
// @description  Revives lost first Unicode char + appends full word (without first letter) if Unikey mod char used
// @match        https://web.telegram.org/*
// @grant        none
// ==/UserScript==

(function () {
    'use strict';

    const isUnicode = (char) => char && char.charCodeAt(0) > 127;
    const isWeirdChar = (char) => char === '·' || char === '`';

    let lastChar = '';
    let watching = false;
    let cachedWord = '';
    let hasUnikeyMod = false;

    window.addEventListener('beforeinput', (e) => {
        const input = document.querySelector('div.input-message-input');
        if (!input) return;

        const content = input.textContent || '';

        // ✅ Store cached word when weird Unikey mark is typed
        if (isWeirdChar(e.data)) {
            const words = content.trim().split(/\s+/).filter(Boolean);
            if (words.length === 1) {
                cachedWord = words[0];
                hasUnikeyMod = true;
                //console.log('💾 Cached word:', JSON.stringify(cachedWord));
            }
            return;
        }

        // 🛠️ Only care about first unicode char AND empty box
        if (!e.data || content.length > 0) return;

        if (isUnicode(e.data)) {
            lastChar = e.data;
            //console.log('🔍 First char is unicode:', lastChar);

            if (watching) return;
            watching = true;

            const check = setInterval(() => {
                if (!input.isConnected) {
                    clearInterval(check);
                    watching = false;
                    return;
                }

                if ((input.textContent || '') === '') {
                    let finalText = lastChar;

                    if (hasUnikeyMod && cachedWord.length > 1) {
                        finalText += cachedWord.slice(1); // drop first char
                        //console.log('🧬 Appended from cache:', JSON.stringify(cachedWord.slice(1)));
                    }

                    input.textContent = finalText;
                    input.dispatchEvent(new InputEvent('input', { bubbles: true }));

                    const sel = window.getSelection();
                    sel.collapse(input.lastChild || input, input.textContent.length);

                    // 🔁 Reset flags
                    cachedWord = '';
                    hasUnikeyMod = false;
                    watching = false;
                    clearInterval(check);
                } else {
                    watching = false;
                    clearInterval(check);
                }
            }, 10);
        }
    });
})();