Closed windchime-yk closed 9 months ago
https://support.apple.com/ja-jp/guide/japanese-input-method/jpim10211/mac
品詞なし(!?)
interface ImeConfig {
name: string // ex. "Google IME"
lang: string // ex. "ja-JP"
encoding: "" // ex. "UTF-16LE"
dataType: "" // ex. "CSV"
hasWordClass: boolean // ユーザー辞書内に品詞欄があるか
hasWordIgnore?: boolean // 抑制単語を品詞に持っているか
}
当初は、ImeConfig
配下にsupportedWordclasses
というプロパティを置き、そこで対応する予定だった。
ただ、これだと以下の問題が出る。
undefined
になる懸念があるそこで、統一的に品詞ラベルを提供する品詞ラベル辞書を内部で持ち、その中に各IMEの品詞ラベルを記載することでundefined
の発生を抑止する。
bId側の品詞ラベルはなるべく詳細なものを採用し、そのラベルを持っていない各IMEはフォールバックとして抽象的な品詞を使う方針とする。
また、ユーザーによっては独自の品詞マッピングを使いたいという人もいると思うので、そこの拡張性も検討する。
GBoardは品詞を設定する欄が存在しないので省く。
基本的に日本語のみ対応を目指したモジュールなのに英語なので、ここからIssueは日本語で書く方針に切り替える
Google IMEやATOKなど、一部のIMEは抑制単語という品詞を持ち、これによって検索候補に表示しないよう制御している。 これはIME制御の品詞でありフォールバックでなんとかなるものでもないため、品詞辞書とは別の対応が必要。
まず、抑制単語に対応しているIMEはImeConfig
に記載することで判別可能にする。
次に、抑制単語にしたい単語はignore
プロパティをtrueにすることで、それを抑制単語として登録するように制御する。
かみつばき 神椿 組織
かみつばき 噛み椿 名詞
かふ 花譜 人名
かみつばきけんせつちゅう 神椿建設中。 固有名詞
https://support.apple.com/ja-jp/guide/japanese-input-method/jpim10228/mac
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<dict>
<key>phrase</key>
<string>雲母坂</string>
<key>shortcut</key>
<string>きららざか</string>
</dict>
<dict>
<key>phrase</key>
<string>Props</string>
<key>shortcut</key>
<string>こどうぐ</string>
</dict>
</array>
</plist>
ことえり時代のCSV形式でも導入可能なため、bIdではCSV形式のみサポートする。
きららざか, 雲母坂, 普通名詞
こどうぐ, Props, 普通名詞
冒頭数行にわたる!
で始まる部分は省いた。
あああああ あいえうえ 姓名接頭語
ええええ あいえい あわ行五段
tttt ああああああ ま行五段
てすと テスト 短縮よみ あああああ
てすと テスト2 短縮よみ あああああ
てすと テスト3 姓 えええええ
てすと テスト4 短縮よみ うううううう
てすと テスト6 人名
てすと てすと さ行五段
# Gboard Dictionary version:1
たんこ 単語 ja-JP
どろ 吐露 ja-JP
以下をquicktypeでJSONスキーマにする想定
/** 対応しているIME */
type ImeType = "Google IME" | "macOS IME" | "Microsoft IME" | "GBoard";
/** bIdで利用可能な品詞名 */
type Wordclass = "" | "";
/**
* ユーザー辞書の型定義
*/
type UserDictionary = {
/** 品詞 */
type: Wordclass;
/** 対象文言 */
word: string;
/** 読み方 */
reading: string;
/** 抑制単語かどうか */
isSuppress?: boolean;
/** サジェストのみに表示するかどうか */
isSuggest?: boolean;
/** 対象文言についての説明 */
description?: string;
}
/**
* 品詞マッピングの型定義
*/
type WordclassMapping = {
/** bIdで利用する品詞 */
[word in Wordclass]: {
/** 各IMEの対応品詞 */
[ime in Exclude<ImeType, "GBoard">]: string;
}
}
sequenceDiagram
participant user as ユーザー
participant app as アプリ画面
participant core as コア機能
user ->> app: JSONないしCSVをファイルで渡す
app ->> core: ファイルからデータを抜き出して渡す
core ->> core: ファイル拡張子を確認
break ファイルが.jsonや.csv以外の場合
core -->> app: "detail: file-type-error"を返却
app -->> user: ファイル形式エラーとして画面に表示
end
core ->> core: ファイルデータをJSONに変換
break JSONデータに想定外のプロパティが含まれていた場合
core -->> app: "detail: json-property-error"を返却
app -->> user: データ形式エラーとして画面に表示
end
loop
core ->> core: JSONデータを各IMEのテキストデータに整形
core ->> core: テキストデータをファイルに出力
end
core -->> app: ファイルを圧縮し、圧縮ファイルを返却
app -->> user: 圧縮ファイルのダウンロードリンクを生成
コア機能をDenoで書いてdntでNode.jsモジュールに変換、それをElectronで使う形にしたい
Electronはパッケージングが充実しており、各OS認証も標準で持っている。 webview_denoはその辺りのサポートがないので、バックオフィスなどで利用することを想定すると、選定しづらい
アプリをダウンロードせずに使いたい需要もあると思っているので、作成予定。
アプリについては重いタスクになるので、別のIssueで作成する
現在のbIdは拡張が難しいため、拡張性を高めるために再構築する。
目標
今後、ここも拡張できるように考える多言語化はきりがないので、一旦日本語のみ)ImeConfig
に集約するImeConfig[]
に項目を追加するだけで、簡単に新規IMEに対応できるようにするタスク
設計
構築