diff --git a/Makefile b/Makefile index 25ac649..949fd26 100644 --- a/Makefile +++ b/Makefile @@ -89,6 +89,7 @@ check-stress: $(PROG) test: check verify-map: + test "$$(cut -f1 map/hira.map)" = "$$(cut -f1 map/kata.map)" python3 map/mktelex.py | cmp - map/telex.map python3 -B map/mkemoji | cmp - map/emoji.dict python3 -B map/mkhanja | cmp - map/hanja.dict diff --git a/map/README b/map/README index 8083b45..21a0636 100644 --- a/map/README +++ b/map/README @@ -38,6 +38,14 @@ are omitted. The import preserves the upstream license header and row order. The retained data is BSD 3-Clause licensed by Choe Hwanjin; the complete text is in `LICENSES/BSD-3-Clause-libhangul-hanja.txt`. +## Japanese romaji + +`hira.map` and `kata.map` are Mozc's default romaji table, one row per key, +in gojūon order; `kata.map` is the same table in Katakana, and +`make verify-map` checks that the two have the same keys. A doubled +consonant, or `tch`, maps to っ and keeps the consonant pending; the engine +knows that rule, the table only lists the rows. + ## Japanese dictionary data `kanji.dict` is the historical dictionary bundled with strans. Its own header diff --git a/map/hira.map b/map/hira.map index 3b6e8a6..418615c 100644 --- a/map/hira.map +++ b/map/hira.map @@ -1,152 +1,321 @@ a あ -- ー i い u う e え o お -ka か -ga が -ki き kya きゃ +kyi きぃ kyu きゅ +kye きぇ kyo きょ -gi ぎ -gya ぎゃ -gyu ぎゅ -gyo ぎょ +ka か +ki き ku く -gu ぐ ke け -ge げ ko こ +kwa くぁ +kwi くぃ +kwu くぅ +kwe くぇ +kwo くぉ +gya ぎゃ +gyi ぎぃ +gyu ぎゅ +gye ぎぇ +gyo ぎょ +ga が +gi ぎ +gu ぐ +ge げ go ご -sa さ -za ざ -si し -shi し +gwa ぐぁ +gwi ぐぃ +gwu ぐぅ +gwe ぐぇ +gwo ぐぉ +sya しゃ +syi しぃ +syu しゅ +sye しぇ +syo しょ sha しゃ +shi し shu しゅ she しぇ sho しょ -syo しょ -zi ぢ +sa さ +si し +su す +se せ +so そ +swa すぁ +swi すぃ +swu すぅ +swe すぇ +swo すぉ +z/ ・ +z. … +z, ‥ +zh ← +zj ↓ +zk ↑ +zl → +z- 〜 +z[ 『 +z] 』 +zya じゃ +zyi じぃ +zyu じゅ +zye じぇ +zyo じょ +zwa ずぁ +zwi ずぃ +zwu ずぅ +zwe ずぇ +zwo ずぉ +za ざ +zi じ +zu ず +ze ぜ +zo ぞ ja じゃ +ji じ ju じゅ je じぇ jo じょ -su す -zu ず -se せ -ze ぜ -so そ -zo ぞ -ta た -da だ -di ぢ -ti ち -chi ち -cha ちゃ -chu ちゅ -che ちぇ +jya じゃ +jyi じぃ +jyu じゅ +jye じぇ +jyo じょ +tya ちゃ +tyi ちぃ tyu ちゅ -cho ちょ -ji じ +tye ちぇ +tyo ちょ +tsa つぁ +tsi つぃ +tse つぇ +tso つぉ +tha てゃ +thi てぃ +t'i てぃ +thu てゅ +the てぇ +tho てょ +t'yu てゅ +twa とぁ +twi とぃ +twu とぅ +twe とぇ +two とぉ +t'u とぅ +ta た +ti ち tu つ tsu つ -du づ te て -de で to と +dya ぢゃ +dyi ぢぃ +dyu ぢゅ +dye ぢぇ +dyo ぢょ +dha でゃ +dhi でぃ +d'i でぃ +dhu でゅ +dhe でぇ +dho でょ +d'yu でゅ +dwa どぁ +dwi どぃ +dwu どぅ +dwe どぇ +dwo どぉ +d'u どぅ +da だ +di ぢ +du づ +de で do ど +cha ちゃ +chi ち +chu ちゅ +che ちぇ +cho ちょ +cya ちゃ +cyi ちぃ +cyu ちゅ +cye ちぇ +cyo ちょ +ca か +ci し +cu く +ce せ +co こ +nya にゃ +nyi にぃ +nyu にゅ +nye にぇ +nyo にょ +n' ん +nn ん +n ん na な ni に -nya にゃ -nyu にゅ -nyo にょ nu ぬ ne ね no の -ha は -ba ば -va ば -pa ぱ -hi ひ hya ひゃ +hyi ひぃ hyu ひゅ +hye ひぇ hyo ひょ -bi び -bya びゃ -byu びゅ -byo びょ -vi び -pi ぴ -pya ぴゃ -pyu ぴゅ -pyo ぴょ +hwa ふぁ +hwi ふぃ +hwe ふぇ +hwo ふぉ +hwyu ふゅ +ha は +hi ひ hu ふ -fu ふ +he へ +ho ほ fa ふぁ fi ふぃ +fu ふ fe ふぇ fo ふぉ +fya ふゃ +fyu ふゅ +fyo ふょ +bya びゃ +byi びぃ +byu びゅ +bye びぇ +byo びょ +ba ば +bi び bu ぶ -vu ぶ -pu ぷ -he へ be べ -ve べ -pe ぺ -ho ほ bo ぼ -vo ぼ +pya ぴゃ +pyi ぴぃ +pyu ぴゅ +pye ぴぇ +pyo ぴょ +pa ぱ +pi ぴ +pu ぷ +pe ぺ po ぽ +mya みゃ +myi みぃ +myu みゅ +mye みぇ +myo みょ ma ま mi み -mya みゃ -myu みゅ -myo みょ mu む me め mo も +ye いぇ ya や yu ゆ yo よ +rya りゃ +ryi りぃ +ryu りゅ +rye りぇ +ryo りょ ra ら ri り -rya りゃ -ryu りゅ -ryo りょ ru る re れ ro ろ +wu う +wyi ゐ +wye ゑ wa わ -wi ゐ -we ゑ +wi うぃ +we うぇ wo を -n ん +wha うぁ +whi うぃ +whu う +whe うぇ +who うぉ +va ゔぁ +vi ゔぃ +vu ゔ +ve ゔぇ +vo ゔぉ +vya ゔゃ +vyi ゔぃ +vyu ゔゅ +vye ゔぇ +vyo ゔょ +qa くぁ +qi くぃ +qu く +qe くぇ +qo くぉ xn ん xa ぁ xi ぃ xu ぅ xe ぇ xo ぉ +xyi ぃ +xye ぇ +xka ヵ +xke ヶ +xtu っ +xtsu っ +xya ゃ +xyu ゅ +xyo ょ +xwa ゎ +la ぁ +li ぃ +lu ぅ +le ぇ +lo ぉ +lyi ぃ +lye ぇ +lka ヵ +lke ヶ +ltu っ +ltsu っ +lya ゃ +lyu ゅ +lyo ょ +lwa ゎ +qq っ +vv っ +ll っ +xx っ kk っ -ss っ -tt っ -pp っ -cc っ gg っ +ss っ zz っ jj っ +tt っ +tch っ dd っ -bb っ hh っ ff っ +bb っ +pp っ mm っ yy っ rr っ ww っ -vv っ -tch っ +cc っ +- ー +~ 〜 . 。 , 、 +[ 「 +] 」 diff --git a/map/kata.map b/map/kata.map index 1b54903..5f75147 100644 --- a/map/kata.map +++ b/map/kata.map @@ -1,153 +1,321 @@ a ア -- ー i イ u ウ e エ o オ -ka カ -ga ガ -ki キ kya キャ +kyi キィ kyu キュ +kye キェ kyo キョ -gi ギ -gya ギャ -gyu ギュ -gyo ギョ +ka カ +ki キ ku ク -gu グ ke ケ -ge ゲ ko コ +kwa クァ +kwi クィ +kwu クゥ +kwe クェ +kwo クォ +gya ギャ +gyi ギィ +gyu ギュ +gye ギェ +gyo ギョ +ga ガ +gi ギ +gu グ +ge ゲ go ゴ -sa サ -za ザ -si シ -shi シ -ji ジ -sha シャ -she シェ -shu シュ -je ジェ -sho ショ +gwa グァ +gwi グィ +gwu グゥ +gwe グェ +gwo グォ +sya シャ +syi シィ +syu シュ +sye シェ syo ショ -ja ジャ -ju ジュ -jo ジョ +sha シャ +shi シ +shu シュ +she シェ +sho ショ +sa サ +si シ su ス -zu ズ se セ -ze ゼ so ソ +swa スァ +swi スィ +swu スゥ +swe スェ +swo スォ +z/ ・ +z. … +z, ‥ +zh ← +zj ↓ +zk ↑ +zl → +z- 〜 +z[ 『 +z] 』 +zya ジャ +zyi ジィ +zyu ジュ +zye ジェ +zyo ジョ +zwa ズァ +zwi ズィ +zwu ズゥ +zwe ズェ +zwo ズォ +za ザ +zi ジ +zu ズ +ze ゼ zo ゾ -ta タ -da ダ -ti ティ -chi チ -zi ヂ -cha チャ -chu チュ +ja ジャ +ji ジ +ju ジュ +je ジェ +jo ジョ +jya ジャ +jyi ジィ +jyu ジュ +jye ジェ +jyo ジョ +tya チャ +tyi チィ tyu チュ -che チェ -cho チョ +tye チェ +tyo チョ +tsa ツァ +tsi ツィ +tse ツェ +tso ツォ +tha テャ +thi ティ +t'i ティ +thu テュ +the テェ +tho テョ +t'yu テュ +twa トァ +twi トィ +twu トゥ +twe トェ +two トォ +t'u トゥ +ta タ +ti チ tu ツ tsu ツ -du ヅ te テ -de デ to ト +dya ヂャ +dyi ヂィ +dyu ヂュ +dye ヂェ +dyo ヂョ +dha デャ +dhi ディ +d'i ディ +dhu デュ +dhe デェ +dho デョ +d'yu デュ +dwa ドァ +dwi ドィ +dwu ドゥ +dwe ドェ +dwo ドォ +d'u ドゥ +da ダ +di ヂ +du ヅ +de デ do ド +cha チャ +chi チ +chu チュ +che チェ +cho チョ +cya チャ +cyi チィ +cyu チュ +cye チェ +cyo チョ +ca カ +ci シ +cu ク +ce セ +co コ +nya ニャ +nyi ニィ +nyu ニュ +nye ニェ +nyo ニョ +n' ン +nn ン +n ン na ナ ni ニ -nya ニャ -nyu ニュ -nyo ニョ nu ヌ ne ネ no ノ -ha ハ -ba バ -pa パ -hi ヒ hya ヒャ +hyi ヒィ hyu ヒュ +hye ヒェ hyo ヒョ -bi ビ -bya ビャ -byu ビュ -byo ビョ -pi ピ -pya ピャ -pyu ピュ -pyo ピョ +hwa ファ +hwi フィ +hwe フェ +hwo フォ +hwyu フュ +ha ハ +hi ヒ hu フ -fu フ -bu ブ -pu プ he ヘ -be ベ -pe ペ ho ホ +fa ファ +fi フィ +fu フ +fe フェ +fo フォ +fya フャ +fyu フュ +fyo フョ +bya ビャ +byi ビィ +byu ビュ +bye ビェ +byo ビョ +ba バ +bi ビ +bu ブ +be ベ bo ボ +pya ピャ +pyi ピィ +pyu ピュ +pye ピェ +pyo ピョ +pa パ +pi ピ +pu プ +pe ペ po ポ +mya ミャ +myi ミィ +myu ミュ +mye ミェ +myo ミョ ma マ mi ミ -mya ミャ -myu ミュ -myo ミョ mu ム me メ mo モ +ye イェ ya ヤ yu ユ yo ヨ +rya リャ +ryi リィ +ryu リュ +rye リェ +ryo リョ ra ラ ri リ -rya リャ -ryu リュ -ryo リョ ru ル re レ ro ロ +wu ウ +wyi ヰ +wye ヱ wa ワ -wi ヰ -we ヱ +wi ウィ +we ウェ wo ヲ -n ン -xn ン -v ヴ -xa ァ -xi ィ -xu ゥ -xe ェ -xo ォ -cc ッ -dd ッ -kk ッ -pp ッ -tt ッ -tch ッ -ss ッ -gg ッ -zz ッ -jj ッ -bb ッ -hh ッ -ff ッ -mm ッ -yy ッ -rr ッ -ww ッ -vv ッ -di ディ -fa ファ -fi フィ -fe フェ -fo フォ +wha ウァ +whi ウィ +whu ウ +whe ウェ +who ウォ va ヴァ vi ヴィ vu ヴ ve ヴェ vo ヴォ +vya ヴャ +vyi ヴィ +vyu ヴュ +vye ヴェ +vyo ヴョ +qa クァ +qi クィ +qu ク +qe クェ +qo クォ +xn ン +xa ァ +xi ィ +xu ゥ +xe ェ +xo ォ +xyi ィ +xye ェ +xka ヵ +xke ヶ +xtu ッ +xtsu ッ +xya ャ +xyu ュ +xyo ョ +xwa ヮ +la ァ +li ィ +lu ゥ +le ェ +lo ォ +lyi ィ +lye ェ +lka ヵ +lke ヶ +ltu ッ +ltsu ッ +lya ャ +lyu ュ +lyo ョ +lwa ヮ +qq ッ +vv ッ +ll ッ +xx ッ +kk ッ +gg ッ +ss ッ +zz ッ +jj ッ +tt ッ +tch ッ +dd ッ +hh ッ +ff ッ +bb ッ +pp ッ +mm ッ +yy ッ +rr ッ +ww ッ +cc ッ +- ー +~ 〜 . 。 , 、 +[ 「 +] 」 diff --git a/strans.c b/strans.c index 5712855..1e77344 100644 --- a/strans.c +++ b/strans.c @@ -285,10 +285,15 @@ backjp(Im *p) spopr(&p->pre); } +/* + * kk and the like are a sokuon: っ, and the consonant stays pending, as + * ch does after tch. xtu and ltu are っ itself. + */ static int -issmalltsu(Str *s) +issokuon(Str *key, Str *mapped) { - return s->n == 1 && (s->r[0] == L'っ' || s->r[0] == L'ッ'); + return mapped->n == 1 && (mapped->r[0] == L'っ' || mapped->r[0] == L'ッ') && + (key->r[0] == key->r[1] || (key->r[0] == 't' && key->r[1] == 'c')); } static void @@ -312,17 +317,11 @@ transjp(Im *p, Rune c) e.eat = 1; e.next = p->pre; e.raw = p->raw; - if(c == '\'' && e.raw.n == 1 && e.raw.r[0] == 'n'){ - if(mapget(p->l->map, &e.raw, &mapped)) - sappend(&e.next, &mapped); - sclear(&e.raw); - return e; - } key = e.raw; sputr(&key, c); if(mapmatch(p->l->map, &key, &mapped) != TrieMiss){ e.raw = key; - if(issmalltsu(&mapped)){ + if(issokuon(&key, &mapped)){ sappend(&e.next, &mapped); keeptail(&e.raw); } diff --git a/tests/engine_test.c b/tests/engine_test.c index 7dcf3ec..eb949b0 100644 --- a/tests/engine_test.c +++ b/tests/engine_test.c @@ -451,7 +451,7 @@ engine_commit_contract(struct ct *t) return; im.nkouho = 1; im.sel = -1; - CT_CHECK(t, !keystroke('q', 0, &com)); + CT_CHECK(t, !keystroke('!', 0, &com)); checkstr(t, "uneaten-key commit", "か", &com); CT_EQ_INT(t, 0, im.pre.n); CT_EQ_INT(t, 0, im.raw.n); @@ -1061,7 +1061,17 @@ engine_japanese_readings(struct ct *t) } cases[] = { { "nya", "にゃ" }, { "n'ya", "んや" }, - { "nnya", "んにゃ" }, + { "nnya", "んや" }, + { "nnnya", "んにゃ" }, + { "konnnichiha", "こんにちは" }, + { "wi", "うぃ" }, + { "vu", "ゔ" }, + { "xtu", "っ" }, + { "axtu", "あっ" }, + { "lla", "っぁ" }, + { "matcha", "まっちゃ" }, + { "zi", "じ" }, + { "[", "「" }, { "kin'youbi", "きんようび" }, }; static const struct {