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; Lang *l;
Str pre; Str pre;
Str raw; /* physical keys for the current Telex preedit */
Str kouho[Maxkouho]; Str kouho[Maxkouho];
int nkouho; int nkouho;
int sel; int sel;

1
fn.h
View File

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

View File

@@ -1,5 +1,9 @@
#!/usr/bin/env python3 #!/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 marks: s=rising f=falling r=hook x=tilde j=dot
tone = { tone = {
's': str.maketrans("aăâeêioôơuưy", "áắấéếíóốớúứý"), 's': str.maketrans("aăâeêioôơuưy", "áắấéếíóốớúứý"),
@@ -24,24 +28,21 @@ modcons = [
("dd", "đ"), ("dd", "đ"),
] ]
upper = str.maketrans(
"aăâeêioôơuưyđáắấéếíóốớúứýàằầèềìòồờùừỳảẳẩẻểỉỏổởủửỷãẵẫẽễĩõỗỡũữỹạặậẹệịọộợụựỵ",
"AĂÂEÊIOÔƠUƯYĐÁẮẤÉẾÍÓỐỚÚỨÝÀẰẦÈỀÌÒỒỜÙỪỲẢẲẨẺỂỈỎỔỞỦỬỶÃẴẪẼỄĨÕỖỠŨỮỸẠẶẬẸỆỊỌỘỢỤỰỴ")
def addtone(v, t): def addtone(v, t):
return v.translate(tone[t]) return v.translate(tone[t])
entries = [] entries = []
def emit(input, output): def initialupper(s):
entries.append((input, output)) return s[0].upper() + s[1:]
print(f"{input}\t{output}")
def up(s): def emit(src, dst):
c = s[0].translate(upper) entries.append((src, dst))
if c == s[0]: print(f"{src}\t{dst}")
c = s[0].upper() usrc = initialupper(src)
return c + s[1:] udst = initialupper(dst)
print(f"{up(input)}\t{up(output)}") if (usrc, udst) != (src, dst):
print(f"{usrc}\t{udst}")
def vowel1(): def vowel1():
for v in "aeiouy": for v in "aeiouy":
@@ -97,14 +98,6 @@ def mod1tone():
for t in tone: for t in tone:
emit(i+t, addtone(o, t)) emit(i+t, addtone(o, t))
modvowel = [
("aw", "ă"),
("aa", "â"),
("ee", "ê"),
("oo", "ô"),
("ow", "ơ"),
("uw", "ư"),
]
def tone1mod(): def tone1mod():
# a+s+w -> ắ # a+s+w -> ắ
for i, o in modvowel: for i, o in modvowel:
@@ -178,4 +171,5 @@ tone1mod()
tone2mod() tone2mod()
escape() escape()
final() final()
emit("\\", "\\")
onsets() 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}, {LangJPK, "kata", "kanji", transmap, backmap, dictqmap, nil, nil},
{LangKO, "hangul", nil, transko, backko, dictqmap, nil, nil}, {LangKO, "hangul", nil, transko, backko, dictqmap, nil, nil},
{LangEMOJI, "emoji", "emoji", transmap, backmap, 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); int nlang = nelem(langs);
@@ -65,6 +65,7 @@ static void
reset(void) reset(void)
{ {
sclear(&im.pre); sclear(&im.pre);
sclear(&im.raw);
clearkouho(); clearkouho();
show(); show();
} }
@@ -115,6 +116,7 @@ commit(Str *com)
else else
sappend(com, &im.pre); sappend(com, &im.pre);
sclear(&im.pre); sclear(&im.pre);
sclear(&im.raw);
} }
static int static int
@@ -122,8 +124,24 @@ dotrans(Rune c, Str *com)
{ {
Emit e; Emit e;
Dictreq req; Dictreq req;
Str mapped;
e = im.l->trans(&im, c); 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) if(e.s.n > 0)
sappend(com, &e.s); sappend(com, &e.s);
sclear(&im.pre); sclear(&im.pre);
@@ -151,7 +169,7 @@ getlang(int lang)
static int static int
maplookup(Trie *t, Str *key, Str *out) maplookup(Trie *t, Str *key, Str *out)
{ {
char buf[256], *v; char buf[Maxutf], *v;
int klen, vlen; int klen, vlen;
if(key->n == 0) if(key->n == 0)
@@ -341,7 +359,7 @@ imthread(void*)
int int
mapget(Trie *t, Str *key, Str *out) mapget(Trie *t, Str *key, Str *out)
{ {
char buf[256], *v; char buf[Maxutf], *v;
int klen, vlen; int klen, vlen;
if(key->n == 0) if(key->n == 0)

27
vi.c
View File

@@ -117,13 +117,16 @@ onsetglide(Str *m)
Emit Emit
transvi(Im *im, Rune c) transvi(Im *im, Rune c)
{ {
Emit e; Emit e, mappedkey;
Str mapped, pre; Str mapped, pre;
int i, tidx, vi, last, penult, glide; int i, tidx, vi, last, penult, glide;
Rune v, b1, b2; Rune v, b1, b2;
if(!istone(c) && c != 'z') if(!istone(c) && c != 'z')
return transmap(im, c); return transmap(im, c);
mappedkey = transmap(im, c);
if(mappedkey.eat)
return mappedkey;
memset(&e, 0, sizeof e); memset(&e, 0, sizeof e);
if(im->pre.n == 0) if(im->pre.n == 0)
@@ -182,3 +185,25 @@ transvi(Im *im, Rune c)
e.next = mapped; e.next = mapped;
return e; 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;
}