diff --git a/map/kata.map b/map/kata.map index d7d2de3..5b2ea62 100644 --- a/map/kata.map +++ b/map/kata.map @@ -33,7 +33,6 @@ sho ショ syo ショ ja ジャ ju ジュ -je ジェ jo ジョ su ス zu ズ @@ -119,6 +118,7 @@ xn ン v ヴ xa ァ xi ィ +xu ゥ xe ェ xo ォ cc ッ @@ -128,7 +128,6 @@ pp ッ tt ッ tch ッ ss ッ -xn ン di ディ fa ファ fi フィ @@ -136,6 +135,7 @@ fe フェ fo フォ va ヴァ vi ヴィ +vu ヴ ve ヴェ vo ヴォ . 。 diff --git a/strans.c b/strans.c index 353eacc..a137409 100644 --- a/strans.c +++ b/strans.c @@ -27,7 +27,7 @@ backmap(Im *im) Lang langs[] = { {LangEN, "english", nil, transmap, backmap, dictqmap, nil, nil}, {LangJP, "hira", "kanji", transmap, backjp, dictqjp, nil, nil}, - {LangJPK, "kata", "kanji", transmap, backjp, dictqjp, nil, nil}, + {LangJPK, "kata", nil, transmap, backjp, dictqjp, nil, nil}, {LangKO, "hangul", nil, transko, backko, dictqmap, nil, nil}, {LangEMOJI, nil, "emoji", nil, nil, nil, nil, nil}, {LangVI, "telex", nil, transvi, backvi, dictqmap, nil, nil}, @@ -213,6 +213,23 @@ backjp(Im *im) spopr(&im->pre); } +static int +issmalltsu(Str *s) +{ + return s->n == 1 && (s->r[0] == L'っ' || s->r[0] == L'ッ'); +} + +static void +keeptail(Str *s) +{ + int i; + + for(i = 1; i < s->n; i++) + s->r[i-1] = s->r[i]; + if(s->n > 0) + s->n--; +} + static int dotransjp(Rune c, Str *com) { @@ -228,8 +245,13 @@ dotransjp(Rune c, Str *com) key = im.raw; if(key.n < Maxrunes) sputr(&key, c); + sclear(&mapped); if(maplookup(im.l->map, &key, &mapped)){ im.raw = key; + if(issmalltsu(&mapped)){ + sappend(&im.pre, &mapped); + keeptail(&im.raw); + } dictqjp(&im); return 1; } diff --git a/tests/engine_test.c b/tests/engine_test.c index b7da9d4..e75306b 100644 --- a/tests/engine_test.c +++ b/tests/engine_test.c @@ -481,6 +481,41 @@ engine_japanese_backspace_and_boundaries(struct ct *t) } } +void +engine_katakana_sequences(struct ct *t) +{ + static const struct { + char *keys; + char *want; + } cases[] = { + { "kitte", "キッテ" }, + { "katta", "カッタ" }, + { "gakkou", "ガッコウ" }, + { "matcha", "マッチャ" }, + { "xu", "ゥ" }, + { "vu", "ヴ" }, + }; + Dictreq req; + Str com, shown; + int i; + + newestrequest(&req); + for(i = 0; i < nelem(cases); i++){ + init(); + im.l = getlang(LangJPK); + sclear(&com); + if(!typekeys(t, cases[i].keys, &com)) + continue; + checkstr(t, cases[i].keys, "", &com); + shown = shownpre(&im); + checkstr(t, cases[i].keys, cases[i].want, &shown); + CT_CHECK(t, keystroke(Kret, 0, &com)); + checkstr(t, "committed Katakana", cases[i].want, &com); + } + CT_EQ_INT(t, 0, newestrequest(&req)); + CT_EQ_PTR(t, nil, getlang(LangJPK)->dictname); +} + void engine_emoji_single_candidate(struct ct *t) { diff --git a/tests/test.h b/tests/test.h index f944a01..00832f5 100644 --- a/tests/test.h +++ b/tests/test.h @@ -36,6 +36,7 @@ void engine_telex_history_bound(struct ct*); void engine_japanese_readings(struct ct*); void engine_japanese_candidates(struct ct*); void engine_japanese_backspace_and_boundaries(struct ct*); +void engine_katakana_sequences(struct ct*); void engine_emoji_single_candidate(struct ct*); void engine_emoji_queries(struct ct*); void engine_emoji_digit_aliases(struct ct*); diff --git a/tests/unit_test.c b/tests/unit_test.c index 62e3654..97662db 100644 --- a/tests/unit_test.c +++ b/tests/unit_test.c @@ -85,6 +85,7 @@ static const struct ct_test tests[] = { { "engine/japanese-readings", engine_japanese_readings }, { "engine/japanese-candidates", engine_japanese_candidates }, { "engine/japanese-backspace-boundaries", engine_japanese_backspace_and_boundaries }, + { "engine/katakana-sequences", engine_katakana_sequences }, { "engine/emoji-single-candidate", engine_emoji_single_candidate }, { "engine/emoji-queries", engine_emoji_queries }, { "engine/emoji-digit-aliases", engine_emoji_digit_aliases },