Jak stworzyć edytor, który nie psuje składania znaków koreańskich
Kiedy długo piszesz po koreańsku, przychodzi moment, w którym ostatnia sylaba znika albo słowo zostaje rozdzielone. To nie literówka, lecz kwestia tego, gdzie edytor obsługuje składanie znaków.

# jest delikatnie widoczny, a litery zachowują rozmiar i grubość tytułu.Podczas pisania po koreańsku zdarzają się dziwne sytuacje. Na końcu wiersza znika znak, a po przejściu do innego okna i powrocie ostatnia sylaba zostaje wpisana dwukrotnie. Czasami podczas pisania kursor przeskakuje też w zupełnie inne miejsce.
Na początku łatwo pomyśleć, że to nasz błąd. Jednak najczęściej problem nie leży w naszych rękach. Dzieje się tak, ponieważ edytor nie radzi sobie prawidłowo ze „składaniem” znaków koreańskich.
Aby wpisać jeden znak koreański, trzeba kilkakrotnie nacisnąć klawisze odpowiadające spółgłoskom i samogłoskom. Zanim sylaba zostanie ukończona, jest widoczna na ekranie, ale nie jest jeszcze zatwierdzonym znakiem. Ten stan nazywa się składaniem.
W języku angielskim taki stan występuje rzadko, ale podczas pisania po koreańsku trwa niemal cały czas. Dlatego nawet drobny problem z obsługą składania staje się dla koreańskich użytkowników dużym utrudnieniem.
Wystarczy spojrzeć na publicznie zgłoszone problemy. W Typorze występuje problem z rozdzielaniem koreańskich słów podczas wpisywania w systemie macOS (#4251) oraz problem z przeskakiwaniem karetki podczas składania (#788). W Obsidianie zgłoszono losowe pomijanie znaków koreańskich w Ubuntu (#79528), brak możliwości wpisywania po koreańsku w środowisku Wayland (#84391), a także wpis na forum o ignorowaniu tekstu wpisywanego w miejscu łamania wiersza (#114224).
Aplikacje były różne, ale miejsce występowania problemu podobne. Edytor ponownie interpretował zdarzenia składania na poziomie silnika przeglądarki.
Nie umieszczamy niezatwierdzonych znaków w dokumencie
Linuksowa powłoka mote nie interpretuje samodzielnie składania znaków koreańskich. Tworzenie sylab ze spółgłosek i samogłosek pozostawia metodzie wprowadzania systemu operacyjnego.
Składany znak jest widoczny wyłącznie na ekranie. Trafia do dokumentu dopiero po zatwierdzeniu sylaby.
Ta jedna zasada usunęła wiele problemów.
Przy każdej zmianie podczas składania nie powstaje nowy wpis w historii cofania. Automatyczny zapis nie zapisuje w pliku nieukończonej sylaby. Funkcje Markdown nie próbują też formatować znaku, który nie został jeszcze zatwierdzony.
Różnica staje się jeszcze wyraźniejsza, gdy pomyślimy o automatycznym zapisie. Podczas pisania po koreańsku sylaba może nadal być składana nawet w chwili krótkiej przerwy. Gdyby składany znak trafiał do dokumentu, mogłaby zostać zapisana tylko połowa sylaby. Po jednokrotnym użyciu funkcji cofania mógłby też zniknąć tylko jeden jamo.
Jeśli składanie pozostaje poza dokumentem, nie trzeba osobno obsługiwać takich wyjątków. Niezatwierdzony znak nie jest jeszcze częścią dokumentu.
Ekran pozostaje stabilny także podczas pisania
Początkowo podczas składania usuwaliśmy całe formatowanie Markdown z bieżącego wiersza. Wydawało się to bezpieczne, ale spowodowało nowy problem.
Kiedy wpisywano koreański tekst w tytule, wiersz nagle zmniejszał się do rozmiaru tekstu głównego. Dopiero po zakończeniu wpisywania ponownie stawał się tytułem. Ponieważ użytkownicy języka koreańskiego niemal bez przerwy składają znaki podczas pisania, wysokość wiersza przez cały czas rosła i malała.
Teraz obliczamy wygląd wiersza tak, jakby składany znak znajdował się już w jego wnętrzu. Podczas wpisywania tytułu styl tytułu zachowuje również składana sylaba. Podczas pisania wewnątrz pogrubionego tekstu jego grubość także się nie zmienia. Ukryte znaczniki Markdown nie zasłaniają składanego znaku.
Usunęliśmy również niebieskie podkreślenie wyświetlane pod składanym znakiem. Sprawiało ono wrażenie, jakby podczas pisania po koreańsku tekst przez cały czas migał od spodu. Funkcja składania działa tak samo również bez podkreślenia.
Nie jest to zwykły efekt wizualny. Nawet jeśli wszystkie znaki zostają wpisane, ciągłe poruszanie się wiersza zakłóca rytm pisania. Ekran musi pozostać spokojny, aby można było skupić się na zdaniu.

** są widoczne na szaro, a znajdujące się między nimi słowo „굵게” zachowuje pogrubienie.Zamiast deklarować „obsługę języka koreańskiego”, sprawdzamy rzeczywiste działanie
Samo stwierdzenie „obsługujemy język koreański” nie wystarcza.
Nie wiadomo, czy wystarczy, aby znaki dało się wpisać, czy również ekran powinien pozostać stabilny podczas pisania. Trudno też stwierdzić, czy po przejściu do innego okna i powrocie ostatnia sylaba nie zniknie lub nie zostanie wpisana dwukrotnie.
Dlatego mote zastąpił ogólną obietnicę konkretnymi punktami kontroli. Przy każdym wydaniu wpisujemy tekst koreański za pomocą prawdziwej metody wprowadzania i na prawdziwym ekranie. Sprawdzamy 12 warunków w 9 sytuacjach, a skrypt zapisuje wyniki w pliku. Podczas ostatniego uruchomienia wszystkie 12 warunków zostało spełnionych.
Punkty kontroli również nie powstały na podstawie wyobrażeń. Ustaliliśmy je na podstawie publicznie zgłoszonych problemów z wpisywaniem tekstu koreańskiego w innych edytorach oraz widoków, w których rzeczywiście mogą wystąpić problemy w mote.
Sprawdzamy, czy podczas pisania wewnątrz wyróżnienia kursor pozostaje na miejscu. Kontrolujemy również, czy po przejściu do innego okna i powrocie ostatnia sylaba zostaje zatwierdzona dokładnie jeden raz. Testujemy też sytuację, w której po wpisaniu koreańskiego tekstu w oknie wyszukiwania wracamy do widoku edycji. Ten sam proces powtarzamy w komórkach tabeli, w wierszu następującym po elemencie listy oraz w tytule.
Testy są konkretne. Jeśli na przykład podczas składania sylaby naciśniemy Enter, ukończona sylaba musi pozostać w pierwszym wierszu, a do drugiego powinien przejść wyłącznie nowo wpisany jamo. Jeśli podczas składania znaku „한” jednokrotnie naciśniemy Backspace, zamiast zniknąć w całości znak powinien zmienić się w „하”.
Pomylenie jamo z ukończonym znakiem natychmiast powoduje niepowodzenie testu.

Nie deklarujemy obsługi środowisk, których nie sprawdziliśmy
Środowisko sprawdzane bezpośrednio przy każdym wydaniu to połączenie X11 i ibus w linuksowej powłoce.
Podstawowe działanie składania w środowiskach Wayland i fcitx5 sprawdzamy w 8 osobnych konfiguracjach testowych. Zakres testów nie jest jednak taki sam. Powłoki dla systemów macOS i Windows również są nadal w trakcie tworzenia. Nie deklarujemy obsługi sposobu wprowadzania tekstu w żadnym systemie operacyjnym, dopóki nie zakończymy jego weryfikacji.
Istnieją też problemy, których mote nie może naprawić. Typowym przykładem jest zachowanie metody wprowadzania, która po otwarciu każdego nowego pola tekstowego uruchamia się w trybie angielskim. Po zamknięciu okna wyszukiwania i powrocie do widoku edycji może być konieczne ponowne naciśnięcie klawisza przełączającego między językiem koreańskim a angielskim.
Ten problem występuje wspólnie w aplikacjach GTK i można go zmienić w ustawieniach metody wprowadzania. Nie opisujemy jako naszego błędu czegoś, co nim nie jest. Zamiast tego wskazujemy, gdzie znajduje się odpowiednie ustawienie.
Edytor, w którym można wpisywać po koreańsku, i edytor, w którym dobrze pisze się po koreańsku, to dwie różne rzeczy.
W pierwszym znaki pojawiają się w tekście. W drugim tekst pozostaje stabilny również podczas pisania.