fix vietnamese telex state

This commit is contained in:
2026-08-11 19:34:14 +09:00
parent e70278a3d2
commit 7b40ef419f
6 changed files with 3930 additions and 1371 deletions

1
dat.h
View File

@@ -110,6 +110,7 @@ struct Im
{
Lang *l;
Str pre;
Str raw; /* physical keys for the current Telex preedit */
Str kouho[Maxkouho];
int nkouho;
int sel;

1
fn.h
View File

@@ -33,6 +33,7 @@ Emit transmap(Im*, Rune);
Emit transko(Im*, Rune);
Emit transvi(Im*, Rune);
void backko(Im*);
void backvi(Im*);
void dictsend(Im*, Str*);
void srvthread(void*);

View File

@@ -1,5 +1,9 @@
#!/usr/bin/env python3
import sys
sys.stdout.reconfigure(encoding="utf-8")
# tone marks: s=rising f=falling r=hook x=tilde j=dot
tone = {
's': str.maketrans("aăâeêioôơuưy", "áắấéếíóốớúứý"),
@@ -24,24 +28,21 @@ modcons = [
("dd", "đ"),
]
upper = str.maketrans(
"aăâeêioôơuưyđáắấéếíóốớúứýàằầèềìòồờùừỳảẳẩẻểỉỏổởủửỷãẵẫẽễĩõỗỡũữỹạặậẹệịọộợụựỵ",
"AĂÂEÊIOÔƠUƯYĐÁẮẤÉẾÍÓỐỚÚỨÝÀẰẦÈỀÌÒỒỜÙỪỲẢẲẨẺỂỈỎỔỞỦỬỶÃẴẪẼỄĨÕỖỠŨỮỸẠẶẬẸỆỊỌỘỢỤỰỴ")
def addtone(v, t):
return v.translate(tone[t])
entries = []
def emit(input, output):
entries.append((input, output))
print(f"{input}\t{output}")
def up(s):
c = s[0].translate(upper)
if c == s[0]:
c = s[0].upper()
return c + s[1:]
print(f"{up(input)}\t{up(output)}")
def initialupper(s):
return s[0].upper() + s[1:]
def emit(src, dst):
entries.append((src, dst))
print(f"{src}\t{dst}")
usrc = initialupper(src)
udst = initialupper(dst)
if (usrc, udst) != (src, dst):
print(f"{usrc}\t{udst}")
def vowel1():
for v in "aeiouy":
@@ -97,14 +98,6 @@ def mod1tone():
for t in tone:
emit(i+t, addtone(o, t))
modvowel = [
("aw", "ă"),
("aa", "â"),
("ee", "ê"),
("oo", "ô"),
("ow", "ơ"),
("uw", "ư"),
]
def tone1mod():
# a+s+w -> ắ
for i, o in modvowel:
@@ -178,4 +171,5 @@ tone1mod()
tone2mod()
escape()
final()
emit("\\", "\\")
onsets()

File diff suppressed because it is too large Load Diff

View File

@@ -17,7 +17,7 @@ Lang langs[] = {
{LangJPK, "kata", "kanji", transmap, backmap, dictqmap, nil, nil},
{LangKO, "hangul", nil, transko, backko, dictqmap, nil, nil},
{LangEMOJI, "emoji", "emoji", transmap, backmap, dictqmap, nil, nil},
// {LangVI, "telex", nil, transvi, backmap, dictqmap, nil, nil},
{LangVI, "telex", nil, transvi, backvi, dictqmap, nil, nil},
};
int nlang = nelem(langs);
@@ -65,6 +65,7 @@ static void
reset(void)
{
sclear(&im.pre);
sclear(&im.raw);
clearkouho();
show();
}
@@ -115,6 +116,7 @@ commit(Str *com)
else
sappend(com, &im.pre);
sclear(&im.pre);
sclear(&im.raw);
}
static int
@@ -122,8 +124,24 @@ dotrans(Rune c, Str *com)
{
Emit e;
Dictreq req;
Str mapped;
e = im.l->trans(&im, c);
if(im.l->lang == LangVI){
if(e.s.n > 0 || !e.eat)
sclear(&im.raw);
if(e.eat && e.next.n > 0){
if(im.raw.n >= Maxrunes){
if(!mapget(im.l->map, &e.next, &mapped))
mapped = e.next;
sappend(com, &mapped);
reset();
return e.eat;
}
sputr(&im.raw, c);
}
}
clearkouho();
if(e.s.n > 0)
sappend(com, &e.s);
sclear(&im.pre);
@@ -151,7 +169,7 @@ getlang(int lang)
static int
maplookup(Trie *t, Str *key, Str *out)
{
char buf[256], *v;
char buf[Maxutf], *v;
int klen, vlen;
if(key->n == 0)
@@ -341,7 +359,7 @@ imthread(void*)
int
mapget(Trie *t, Str *key, Str *out)
{
char buf[256], *v;
char buf[Maxutf], *v;
int klen, vlen;
if(key->n == 0)

27
vi.c
View File

@@ -117,13 +117,16 @@ onsetglide(Str *m)
Emit
transvi(Im *im, Rune c)
{
Emit e;
Emit e, mappedkey;
Str mapped, pre;
int i, tidx, vi, last, penult, glide;
Rune v, b1, b2;
if(!istone(c) && c != 'z')
return transmap(im, c);
mappedkey = transmap(im, c);
if(mappedkey.eat)
return mappedkey;
memset(&e, 0, sizeof e);
if(im->pre.n == 0)
@@ -182,3 +185,25 @@ transvi(Im *im, Rune c)
e.next = mapped;
return e;
}
void
backvi(Im *im)
{
Emit e;
Str raw;
int i;
if(im->raw.n == 0){
spopr(&im->pre);
return;
}
raw = im->raw;
spopr(&raw);
sclear(&im->pre);
for(i = 0; i < raw.n; i++){
e = transvi(im, raw.r[i]);
sclear(&im->pre);
sappend(&im->pre, &e.next);
}
im->raw = raw;
}