Skip to content

Commit 67dffc2

Browse files
committed
PR #31 を個人的な好みで調整
* 消せない baseRomajiMap の上にカスタムを重ねるのではなく、ゼロベースで設定 * 個人的には dhi のようなローマ字を使わないので、dh の時点で d を捨ててほしいから * ローマ字かな変換ルールはハードウェアキーボードのための機能なので少し隠す * 設定を一気に確認できるよう EditText で表示・編集 - app/build.gradle: テストが asset 内の skk-kana-rule.conf を使用できるようにする - app/src/androidTest/.../SKKSettingsActivityUITest.kt: ソフトウェアキーボード設定が画面の下に隠れていたのでスワイプしておく - app/src/main/AndroidManifest.xml: SKKKanaRuleManager ダークテーマ対応 - assets/azik-kana-rule.conf: - リンク切れに archive.org で対応 - 途中ぽい文書にブツ切りで対応 - 実装に合わせて説明を調整 - 2要素のみ対応 - 未確定ローマ字の残しは非対応 - okuri 非対応 - ; は対応 - `z,,‥` は `z&comma;,‥` の誤り - SKKKanaRule.kt: - 既定で skk-kana-rule.conf を読む - 関数直前のコメントの行頭が # だとホバーツールチップで大きく表示されるので括弧に - SKKKanaRuleManager.kt: - レイアウト調整 (新しめの Android 用?) - ルールを TextEdit にして、onPause で保存 - engine/RomajiConverter.kt: - mBaseRomajiMap を廃止して外部 asset の skk-kana-rule.conf に - それに合わせて mEffectiveMap は mRomajiMap という名前に戻す - skkPrefs.useSmallK は既定で false なので skkPrefs==null でも false 動作に (よく分かっていない) - engine/SKKHiraganaState.kt: rule.conf の `キー,<shift>別キー` 書式に対応 - layout/activity_kana_rule_manager.xml: 常に conf を使用するので TextView を廃止、EditText 追加 - xml/prefs_hard_key.xml, xml/prefs_main.xml: かなルール管理をハードキー部門下に移動 - test/RomajiConverterTest.kt: - tearDown で skk-kana-rule.conf を読むように (これでいいのか分かっていない) - useSmallK は false 前提 - 設定されていないと何も変換しない
1 parent bab3cfd commit 67dffc2

16 files changed

Lines changed: 356 additions & 154 deletions

File tree

app/build.gradle

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ android {
3737

3838
testOptions {
3939
unitTests.returnDefaultValues = true
40+
unitTests.includeAndroidResources = true
4041
}
4142
}
4243

@@ -49,6 +50,7 @@ dependencies {
4950
implementation 'androidx.constraintlayout:constraintlayout:2.2.1'
5051
testImplementation 'androidx.test.ext:junit-ktx:1.3.0'
5152
testImplementation 'androidx.test:core-ktx:1.7.0'
53+
testImplementation 'org.robolectric:robolectric:4.16.1'
5254
androidTestImplementation 'androidx.test:runner:1.7.0'
5355
androidTestImplementation 'androidx.test.espresso:espresso-core:3.7.0'
5456
androidTestImplementation 'androidx.test.ext:junit-ktx:1.3.0'

app/src/androidTest/java/jp/deadend/noname/skk/SKKSettingsActivityUITest.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,8 @@ class SKKSettingsActivityUITest {
217217
@Test
218218
fun testSoftKeyFragment() {
219219
assert(skkPrefs.useSoftKey == "auto")
220+
// 下の方が見えないのでスワイプアップしておく
221+
onView(isRoot()).perform(swipeUp())
220222
onView(withText("ソフトウェアキーボードの設定")).perform(click())
221223
onView(withText("ソフトウェアキーボードの表示"))
222224
.check(matches(hasSibling(withText("自動"))))

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
<activity
6161
android:name=".SKKKanaRuleManager"
6262
android:label="@string/label_kana_rule_manager_activity"
63-
android:theme="@style/Theme.AppCompat.Light.DarkActionBar" />
63+
android:theme="@style/Theme.AppCompat.DayNight.NoActionBar" />
6464
<activity
6565
android:name=".SKKMushroom"
6666
android:label="@string/label_mushroom"

app/src/main/assets/azik-kana-rule.conf

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,21 @@
11
# -*- coding: utf-8 -*-
22
# AZIK (Automated Z-key Input method for Kana) for AndroidSKK
33
# 考案者: 木村 清 氏 (http://hp.vector.co.jp/authors/VA002116/azik/azikindex.html)
4+
# https://web.archive.org/web/19990427131147/http://hp.vector.co.jp:80/authors/VA002116/azikinfo.htm
5+
46
# CorvusSKKを元にしたAZIK入力ルール (https://github.com/nathancorvussolis/corvusskk/blob/3.3.0/installer/config-sample/config%20-%20azik-uskbd.xml) を元にした
57
# macSKK (https://github.com/mtgto/macSKK) の設定ファイルを参考に
6-
# AndroidSKK 用のサンプルとして構成したものですが、さらに元は
8+
# AndroidSKK 用のサンプルとして構成したものです
79

810
# ひらかな・カタカナ・半角カナ入力モードでのキー入力変換マップ
911
# UTF-8 + LF (BOMなし) で記述してください。
1012
# #で始まる行は無視されます。
1113

12-
# 各行はカンマ区切りで2-5要素記述する必要があります
14+
# 各行はカンマ区切りで2要素記述する必要があります
1315
# 各要素でカンマを使用したい場合は &comma; と記述してください。
1416
# 第一要素でシャープを使用したい場合は &sharp; と記述してください。
1517
# 1つ目: ローマ字入力で確定入力されるまでに入力される文字列を指定してください。
1618
# 2つ目: ひらがなモードで入力される文字を指定してください。
17-
# 3つ目: カタカナモードで入力される文字を指定してください。
18-
# 省略時はひらがなモードで入力される文字を自動でカタカナに変換します。
19-
# 記号などはカタカナに変換できないのでそのまま使用されます。
20-
# 4つ目: 半角カナ入力モードで入力される文字を指定してください。
21-
# 省略時はひらがなモードで入力される文字を自動で半角に変換します。
22-
# 5つ目: 未確定のローマ字として残す文字を指定してください。
23-
# 省略された場合は未確定文字として残るローマ字がないことを表します。
24-
# 例えば "tt,っ,ッ,ッ,t" という行がある場合、
25-
# "tt" と入力したときには "っ" をひらがなモードで入力し "t" が未確定のローマ字として残ります。
26-
#
27-
# 2つ目の要素に "<okuri>" を含めると、送り仮名付きのルールを定義できます。
28-
# 例えば "gq,が<okuri>い" という行がある場合:
29-
# - シフトなしで gq と入力すると "がい" がそのまま入力されます。
30-
# - シフトを押しながら入力すると "が" を読み部分、"い" を送り仮名として辞書変換を開始します。
31-
# AZIKなどで「願い(ねがい)」を NegQ (4打鍵) で変換開始できるようになります。
32-
33-
# qを「ん」、;を「っ」にするルールもそのまま記載しているためSKKのデフォルトキーバインドと衝突しています。
34-
# (衝突する場合はキーバインドが優先されます)
35-
# キーバインドを変更するか入力ルールを変更してください。
3619

3720
a,あ
3821
i,い
@@ -590,11 +573,13 @@ xxo,ぉ
590573
xxya,ゃ
591574
xxyu,ゅ
592575
xxyo,ょ
593-
# 二文字目だけシフトが必要な入力は現在のmacSKKではルールに記述できないためコメントアウト
576+
# 二文字目だけシフトが必要な入力は実装されていないためコメントアウト
594577
# kA,ゕ
595578
# kE,ゖ
596579

597580
# 促音、撥音、長音符
581+
# qを「ん」にするルールもそのまま記載していますがSKKのデフォルトキーバインドが優先されます
582+
# nnを使うか他の設定にしてください
598583

599584
;,っ
600585
q,ん
@@ -639,7 +624,7 @@ wr,われ
639624
?,?
640625
],」
641626
z , 
642-
z,,‥
627+
z&comma;,‥
643628
z-,~
644629
z~,〜
645630
z.,…
Lines changed: 206 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,206 @@
1+
a,あ
2+
i,い
3+
u,う
4+
e,え
5+
o,お
6+
ka,か
7+
ki,き
8+
ku,く
9+
ke,け
10+
ko,こ
11+
sa,さ
12+
si,し
13+
su,す
14+
se,せ
15+
so,そ
16+
ta,た
17+
ti,ち
18+
tu,つ
19+
te,て
20+
to,と
21+
na,な
22+
ni,に
23+
nu,ぬ
24+
ne,ね
25+
no,の
26+
ha,は
27+
hi,ひ
28+
hu,ふ
29+
he,へ
30+
ho,ほ
31+
ma,ま
32+
mi,み
33+
mu,む
34+
me,め
35+
mo,も
36+
ya,や
37+
yu,ゆ
38+
yo,よ
39+
ra,ら
40+
ri,り
41+
ru,る
42+
re,れ
43+
ro,ろ
44+
wa,わ
45+
wi,うぃ
46+
we,うぇ
47+
wo,を
48+
nn,ん
49+
ga,が
50+
gi,ぎ
51+
gu,ぐ
52+
ge,げ
53+
go,ご
54+
za,ざ
55+
zi,じ
56+
zu,ず
57+
ze,ぜ
58+
zo,ぞ
59+
da,だ
60+
di,ぢ
61+
du,づ
62+
de,で
63+
do,ど
64+
ba,ば
65+
bi,び
66+
bu,ぶ
67+
be,べ
68+
bo,ぼ
69+
pa,ぱ
70+
pi,ぴ
71+
pu,ぷ
72+
pe,ぺ
73+
po,ぽ
74+
va,う゛ぁ
75+
vi,う゛ぃ
76+
vu,う゛
77+
ve,う゛ぇ
78+
vo,う゛ぉ
79+
#va,ゔぁ
80+
#vi,ゔぃ
81+
#vu,ゔ
82+
#ve,ゔぇ
83+
#vo,ゔぉ
84+
#vyu,ゔゅ
85+
86+
xa,ぁ
87+
xi,ぃ
88+
xu,ぅ
89+
xe,ぇ
90+
xo,ぉ
91+
xtu,っ
92+
xke,ヶ
93+
cha,ちゃ
94+
chi,ち
95+
chu,ちゅ
96+
che,ちぇ
97+
cho,ちょ
98+
fa,ふぁ
99+
fi,ふぃ
100+
fu,ふ
101+
fe,ふぇ
102+
fo,ふぉ
103+
104+
xya,ゃ
105+
xyu,ゅ
106+
xyo,ょ
107+
xwa,ゎ
108+
kya,きゃ
109+
kyi,きぃ
110+
kyu,きゅ
111+
kye,きぇ
112+
kyo,きょ
113+
gya,ぎゃ
114+
gyi,ぎぃ
115+
gyu,ぎゅ
116+
gye,ぎぇ
117+
gyo,ぎょ
118+
sya,しゃ
119+
syi,しぃ
120+
syu,しゅ
121+
sye,しぇ
122+
syo,しょ
123+
sha,しゃ
124+
shi,し
125+
shu,しゅ
126+
she,しぇ
127+
sho,しょ
128+
ja,じゃ
129+
ji,じ
130+
ju,じゅ
131+
je,じぇ
132+
jo,じょ
133+
jya,じゃ
134+
jyi,じぃ
135+
jyu,じゅ
136+
jye,じぇ
137+
jyo,じょ
138+
zya,じゃ
139+
zyi,じぃ
140+
zyu,じゅ
141+
zye,じぇ
142+
zyo,じょ
143+
tya,ちゃ
144+
tyi,ちぃ
145+
tyu,ちゅ
146+
tye,ちぇ
147+
tyo,ちょ
148+
tha,てゃ
149+
thi,てぃ
150+
thu,てゅ
151+
the,てぇ
152+
tho,てょ
153+
dha,でゃ
154+
dhi,でぃ
155+
dhu,でゅ
156+
dhe,でぇ
157+
dho,でょ
158+
dya,ぢゃ
159+
dyi,ぢぃ
160+
dyu,ぢゅ
161+
dye,ぢぇ
162+
dyo,ぢょ
163+
nya,にゃ
164+
nyi,にぃ
165+
nyu,にゅ
166+
nye,にぇ
167+
nyo,にょ
168+
hya,ひゃ
169+
hyi,ひぃ
170+
hyu,ひゅ
171+
hye,ひぇ
172+
hyo,ひょ
173+
pya,ぴゃ
174+
pyi,ぴぃ
175+
pyu,ぴゅ
176+
pye,ぴぇ
177+
pyo,ぴょ
178+
bya,びゃ
179+
byi,びぃ
180+
byu,びゅ
181+
bye,びぇ
182+
byo,びょ
183+
mya,みゃ
184+
mya,みぃ
185+
myu,みゅ
186+
mye,みぇ
187+
myo,みょ
188+
rya,りゃ
189+
ryi,りぃ
190+
ryu,りゅ
191+
rye,りぇ
192+
ryo,りょ
193+
194+
z&comma;,‥
195+
z-,〜
196+
z.,…
197+
z/,・
198+
z[,『
199+
z],』
200+
zh,←
201+
zj,↓
202+
zk,↑
203+
zl,→
204+
#z , 
205+
#z(,(
206+
#z),)

app/src/main/java/jp/deadend/noname/skk/SKKKanaRule.kt

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,19 @@ import java.io.IOException
88

99
object SKKKanaRule {
1010
internal const val INTERNAL_FILE_NAME = "kana-rule.conf"
11+
internal const val DEFAULT_RULE_FILE = "skk-kana-rule.conf"
1112
private const val MAX_FILE_SIZE = 1 * 1024 * 1024 // 1MB
1213

13-
fun exists(context: Context): Boolean =
14-
getInternalFile(context).exists()
15-
16-
private fun getInternalFile(context: Context): File =
17-
File(context.filesDir, INTERNAL_FILE_NAME)
14+
fun getInternalFile(context: Context): File {
15+
val file = File(context.filesDir, INTERNAL_FILE_NAME)
16+
if (!file.exists()) clear(context)
17+
return file
18+
}
1819

1920
/**
2021
* kana-rule.conf テキストをパースして Map<入力列, ひらがな> を返す。
21-
* フォーマット: 入力,ひらがな[,カタカナ]
22-
* # で始まる行と空行は無視する。
22+
* フォーマット: 入力,ひらがな
23+
* (# で始まる行と空行は無視する。)
2324
*/
2425
fun parse(text: String): Map<String, String> {
2526
val result = mutableMapOf<String, String>()
@@ -29,6 +30,8 @@ object SKKKanaRule {
2930
val fields = trimmed.split(",")
3031
if (fields.size < 2) continue
3132
val input = fields[0].trim()
33+
.replace("&sharp;", "#", ignoreCase = true)
34+
.replace("&comma;", ",", ignoreCase = true)
3235
val hiragana = fields[1].trim()
3336
if (input.isNotEmpty() && hiragana.isNotEmpty()) {
3437
result[input] = hiragana
@@ -43,7 +46,6 @@ object SKKKanaRule {
4346
*/
4447
fun loadFromInternalStorage(context: Context): Map<String, String>? {
4548
val file = getInternalFile(context)
46-
if (!file.exists()) return null
4749
if (file.length() > MAX_FILE_SIZE) {
4850
Log.e("SKK", "SKKKanaRule#loadFromInternalStorage() Error: File is too large")
4951
return null
@@ -68,7 +70,10 @@ object SKKKanaRule {
6870
if (sizeIndex != -1 && cursor.moveToFirst()) {
6971
val size = cursor.getLong(sizeIndex)
7072
if (size > MAX_FILE_SIZE) {
71-
Log.e("SKK", "SKKKanaRule#saveFromUri() Error: File is too large ($size bytes)")
73+
Log.e(
74+
"SKK",
75+
"SKKKanaRule#saveFromUri() Error: File is too large ($size bytes)"
76+
)
7277
return false
7378
}
7479
}
@@ -93,9 +98,12 @@ object SKKKanaRule {
9398
}
9499

95100
/**
96-
* 内部ストレージの kana-rule.conf を削除する
101+
* 内部ストレージの kana-rule.conf を初期化する
97102
*/
98103
fun clear(context: Context) {
99-
getInternalFile(context).delete()
104+
val file = File(context.filesDir, INTERNAL_FILE_NAME)
105+
val defaultRule = context.resources.assets.open(DEFAULT_RULE_FILE)
106+
.bufferedReader().use { it.readText() }
107+
file.writeText(defaultRule)
100108
}
101109
}

0 commit comments

Comments
 (0)