fix vietnamese telex state
This commit is contained in:
1
dat.h
1
dat.h
@@ -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
1
fn.h
@@ -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*);
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
5212
map/telex.map
5212
map/telex.map
File diff suppressed because it is too large
Load Diff
24
strans.c
24
strans.c
@@ -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
27
vi.c
@@ -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;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user