[CustardKit] しっぽり明朝の濁点付き仮名を簡単に入力できるiOS用のキーボードを作る
私が開発しているazooKeyでは、カスタムタブ機能によって任意のキーボードを作成して利用することができます。そこでこの記事では「しっぽり明朝の濁点付き仮名」を簡単に入力できるキーボードを作ってみます。
↓azooKeyのダウンロード(iOSのみ)
↓CustardKit
しっぽり明朝の濁点付き仮名
まずはしっぽり明朝の仕様を確認します。フォントを配布サイトからダウンロードします。
濁点付き仮名が私用領域に定義されているということなので、これをチェックします。
ありました。美しいですね。
このままでも良いのですが、今後の見やすさのために表にしておきます。
よく見ると「ヷ」のような文字がないように見えるかもしれませんが、これについては心配ありません。実はU+30F7から「ヷヸヹヺ」が存在しているため、これらの文字は私用領域ではなくこの位置に登録されています。
「小書きが」「小書きげ」「か゜き゜く゜け゜こ゜」については、今回は扱いません。また「小書きプ」のひらがな版がありません。これはアイヌ語表記に用いられることのある仮名「ㇷ゚」のために用意されているものと考え、こちらも今回は扱わないことにします。
なお、このコードポイントは「源暎こぶり明朝」「源暎ちくご明朝」でも共有されているため、これらのフォントでも同様に使えるようです。
では、作っていきましょう。
設計
濁点付きかなを入力する都合上、ローマ字入力は難しそうです。フリックにしましょう。
清音仮名を入力し、「か」を「が」にするのと同様の操作で「あ」を「あ゙」にできるのが良さそうです。
しかし、濁点付き小書き仮名などになってくると順序が微妙です。今回は「通常の並び」に加えて「濁点付き仮名」→「濁点付き小書き仮名」の順で変換していくことにしましょう。
また、ひらがな用タブとカタカナ用タブを切り替えることで入力する方式にしようと思います。
完成図
イメージの話だけだと分かりにくいのでとりあえず完成図です。日本語変換は行わないことにしておきます。
出来上がったファイルをGitHub Gistで公開しておきます。URLを読み込めばazooKeyで使えます。
制作
今回はazooKeyのカスタムタブを作成するツールであるCustardKitを用いてPythonで作成してみます。Swiftでも作成が可能です。
必要なのは兎にも角にもキーのデータです。これは手動で作るより仕方がないので、やっていきましょう。
簡単な入力用のキーを作るには、flickSimpleInputs
というユーティリティを使うのが簡単な方法です。中心と周囲の文字を指定すると自動で入力用のキーを作成します。
key_あ = CustomKey.flickSimpleInputs(
center = "あ",
subs = list("いうえお")
)
これを他の文字にも作っておくことで、入力用のキーはほとんど完成です。
もう1つ「濁点キーを押したら文字を置換する」というキーも必要になります。CustardKitではReplaceLastCharacters
というアクションを使うことで、カーソル文頭方向の文字を置換することができます。そこで置換用のテーブルを作ります。
置換用のテーブルは辞書型で変換前の文字: 変換後の文字
で指定します。そこで
replaceAction = ReplaceLastCharactersAction({
"か": "が",
"が": "か"
})
というアクションをキーに指定すれば、キーを押すたびに「か→が→か→が→・・・」と交互に置換できるようになります。
例えば最初に挙げた「あ」の変換は以下のように指定することになります。
replaceAction = ReplaceLastCharactersAction({
"あ": "ぁ",
"ぁ": chr(0xE082),
chr(0xE082): chr(0xE0B0),
chr(0xE0B0): "あ"
})
他の文字についても同様に指定していけば良いです。
さて、これを使って濁点化用のキーを作りましょう。今回は複雑なアクションを指定するので手書きします。せっかくなので左右のフリックに「ゐ・ゑ」の入力を追加し、上フリックでカタカナ版濁点タブに移動できるようにしておきます。
key_dakuten = CustomKey(
design=KeyDesign(
label=TextLabel("小゙゚"),
color=KeyColor.normal
),
press_actions=[replaceAction],
variations=[
FlickVariationData(
direction=FlickDirection.left,
key=Variation(
design=VariationDesign(TextLabel("ゐ")),
press_actions=[InputAction("ゐ")],
)
),
FlickVariationData(
direction=FlickDirection.top,
key=Variation(
design=VariationDesign(TextLabel("ア゙イ゙ヴ")),
press_actions=[MoveTabAction(tab_type = TabType.custom, text = "sippori_dakuten_katakana")],
)
),
FlickVariationData(
direction=FlickDirection.right,
key=Variation(
design=VariationDesign(TextLabel("ゑ")),
press_actions=[InputAction("ゑ")],
)
)
]
)
)
ここまでくれば、あとはキーを並べるだけです。
#キーを一覧する
keys = [
KeyData(specifier=GridFitSpecifier(0, 0), key=SystemKey(SystemKeyType.flick_star123_tab)),
KeyData(specifier=GridFitSpecifier(0, 1), key=SystemKey(SystemKeyType.flick_abc_tab)),
KeyData(specifier=GridFitSpecifier(0, 2), key=SystemKey(SystemKeyType.flick_hira_tab)),
KeyData(specifier=GridFitSpecifier(0, 3), key=SystemKey(SystemKeyType.change_keyboard)),
KeyData(specifier=GridFitSpecifier(1, 0), key=key_あ),
KeyData(specifier=GridFitSpecifier(2, 0), key=key_か),
KeyData(specifier=GridFitSpecifier(3, 0), key=key_さ),
KeyData(specifier=GridFitSpecifier(1, 1), key=key_た),
KeyData(specifier=GridFitSpecifier(2, 1), key=key_な),
KeyData(specifier=GridFitSpecifier(3, 1), key=key_は),
KeyData(specifier=GridFitSpecifier(1, 2), key=key_ま),
KeyData(specifier=GridFitSpecifier(2, 2), key=key_や),
KeyData(specifier=GridFitSpecifier(3, 2), key=key_ら),
KeyData(specifier=GridFitSpecifier(1, 3), key=key_dakuten),
KeyData(specifier=GridFitSpecifier(2, 3), key=key_わ),
KeyData(specifier=GridFitSpecifier(3, 3), key=SystemKey(SystemKeyType.flick_kutoten)),
KeyData(specifier=GridFitSpecifier(4, 0), key=CustomKey.flickDelete()),
KeyData(specifier=GridFitSpecifier(4, 1), key=CustomKey.flickSpace()),
KeyData(specifier=GridFitSpecifier(4, 2, width=1, height=2), key=SystemKey(SystemKeyType.enter)),
]
キーを並べ終えたらキーボードを作成します。
#カスタードオブジェクトを作成
sippori_dakuten_hiragana = Custard(
identifier="sippori_dakuten_hiragana",
language=Language.none,
input_style=InputStyle.direct,
metadata=Metadata(
custard_version="1.0",
display_name="しっぽり明朝濁点ひらがな",
),
interface=Interface(
key_style=KeyStyle.tenkey_style,
key_layout=GridFitLayout(5, 4),
keys=keys
)
)
カタカナ版のタブも同様に作っておきます。
#カスタードオブジェクトを作成
sippori_dakuten_katakana = Custard(
identifier="sippori_dakuten_katakana",
language=Language.none,
input_style=InputStyle.direct,
metadata=Metadata(
custard_version="1.0",
display_name="しっぽり明朝濁点カタカナ",
),
interface=Interface(
key_style=KeyStyle.tenkey_style,
key_layout=GridFitLayout(5, 4),
keys=keys
)
)
あとは書き出すだけです。Custard
オブジェクトのままでも書き出せますが、2つ一度に書き出したいのでCustardList
で包みます。こうすることでアプリ側でも2つ同時に読み込むことができます。
#カスタードオブジェクトを書き出し
CustardList([sippori_dakuten_hiragana, sippori_dakuten_katakana]).write(name="sippori_dakuten")
コードの全体は以下に置いてあります。
使ってみる
出来上がったファイルは「sippori_dakuten.json」という名前です。iPhoneに転送して試してみましょう。方法はなんでもいいです。iCloudにファイルを置いてそれを読み込むのが手っ取り早いと思います。
AirDropができるなら、azooKeyを開いた状態でファイルをAirDropすれば読み込めます。
おっと、そういえばiPhoneにはまだしっぽり明朝をインストールしていませんでした。今回はFontInstall.appを利用してインストールします。このアプリはライセンス上配布して問題のないフォントをiOS上でインストール可能にしたものです。
インストールしました。残念ながらiOSのフォント周りは致命的に弱いので、インストールしたフォントは限られた場所でしか使えません。とりあえず無料で使えるPagesで試すことにします。
うまくいきました。
終わりに
この記事ではしっぽり明朝の濁点付き仮名を入力するためのキーボードを作成しました。
Unicode私用領域に外字を登録するフォントがしばしばありますが、入力が簡単でないためにあまり活用されていないものもあります。カスタムタブはそうした課題も解決できると考えています。ぜひ使ってみてください。
Discussion