@@ -29,20 +29,17 @@ class UserDict: NSObject, DictProtocol {
2929 private let privateMode : CurrentValueSubject < Bool , Never >
3030 /// プライベートモード時に変換候補にユーザー辞書を無視するかどうか
3131 private let ignoreUserDictInPrivateMode : CurrentValueSubject < Bool , Never >
32- // ユーザー辞書だけでなくすべての辞書から補完候補を検索するか?
33- private let findCompletionFromAllDicts : CurrentValueSubject < Bool , Never >
3432 private var cancellables : Set < AnyCancellable > = [ ]
3533 let saveToUserDict = true
3634
3735 // MARK: NSFilePresenter
3836 let presentedItemURL : URL ?
3937 let presentedItemOperationQueue : OperationQueue = OperationQueue ( )
4038
41- init ( dicts: [ any DictProtocol ] , userDictEntries: [ String : [ Word ] ] ? = nil , privateMode: CurrentValueSubject < Bool , Never > , ignoreUserDictInPrivateMode: CurrentValueSubject < Bool , Never > , findCompletionFromAllDicts : CurrentValueSubject < Bool , Never > , dateYomis: [ DateConversion . Yomi ] , dateConversions: [ DateConversion ] ) throws {
39+ init ( dicts: [ any DictProtocol ] , userDictEntries: [ String : [ Word ] ] ? = nil , privateMode: CurrentValueSubject < Bool , Never > , ignoreUserDictInPrivateMode: CurrentValueSubject < Bool , Never > , dateYomis: [ DateConversion . Yomi ] , dateConversions: [ DateConversion ] ) throws {
4240 self . dicts = dicts
4341 self . privateMode = privateMode
4442 self . ignoreUserDictInPrivateMode = ignoreUserDictInPrivateMode
45- self . findCompletionFromAllDicts = findCompletionFromAllDicts
4643 self . dateYomis = dateYomis
4744 self . dateConversions = dateConversions
4845 dictionariesDirectoryURL = try FileManager . default. url (
@@ -207,6 +204,46 @@ class UserDict: NSObject, DictProtocol {
207204 }
208205
209206 /**
207+ * 保持する辞書を順に引き現在入力中のprefixに続く入力候補を返す。見つからなければ空配列を返す。
208+ *
209+ * ## skkservについて
210+ * skkservを辞書とする場合はすべてのファイル辞書の候補の末尾に付けて返す。
211+ * skkserv辞書の変換候補を末尾につけるのは仮の仕様で将来は利用者が選択可能にする可能性がある。
212+ *
213+ * skkservからの応答が一定時間なかった場合はTCP接続を切断する。
214+ * 実装を簡単にするためskkserv辞書が有効なまま再度このメソッドが呼ばれたら再接続から試みる。
215+ *
216+ * - Parameters:
217+ * - prefix: SKK辞書の見出しの接頭辞。複数のひらがな、もしくは複数のひらがな + ローマ字からなる文字列
218+ * - skkservDict: SKKServ辞書。nilのときはskkservを引かない
219+ * - findFromAllDicts: ユーザー辞書以外を検索するか
220+ */
221+ func findCompletionsDicts( prefix: String , skkservDict: SKKServDict ? , findFromAllDicts: Bool ) -> [ String ] {
222+ if prefix. isEmpty {
223+ return [ ]
224+ }
225+ var results : [ String ] = findCompletions ( prefix: prefix)
226+ if findFromAllDicts {
227+ for dict in dicts {
228+ for yomi in dict. findCompletions ( prefix: prefix) {
229+ if !results. contains ( yomi) {
230+ results. append ( yomi)
231+ }
232+ }
233+ }
234+ }
235+ if let skkservDict {
236+ for yomi in skkservDict. findCompletions ( prefix: prefix) {
237+ if !results. contains ( yomi) {
238+ results. append ( yomi)
239+ }
240+ }
241+ }
242+ return results
243+ }
244+
245+ /**
246+ * ユーザー辞書のみから検索して他のSKK辞書は参照しない。すべての辞書から参照する場合は ``referDicts(_:option:skkservDict:findFromAllDicts:)`` を使用すること。
210247 * プライベートモードで入力したエントリは参照しない。
211248 */
212249 func refer( _ yomi: String , option: DictReferringOption ? = nil ) -> [ Word ] {
@@ -316,15 +353,6 @@ class UserDict: NSObject, DictProtocol {
316353 results. append ( dateYomi. yomi)
317354 }
318355 }
319- if findCompletionFromAllDicts. value {
320- for dict in dicts {
321- for yomi in dict. findCompletions ( prefix: prefix) {
322- if !results. contains ( yomi) {
323- results. append ( yomi)
324- }
325- }
326- }
327- }
328356 return results
329357 }
330358
@@ -334,20 +362,20 @@ class UserDict: NSObject, DictProtocol {
334362 * asyncにするかも? (skkservとかで便利そう)
335363 * AsyncStreamにするかも?
336364 */
337- func candidatesForCompletion( prefix: String ) -> [ Candidate ] {
365+ func candidatesForCompletion( prefix: String , skkservDict : SKKServDict ? , findFromAllDicts : Bool ) -> [ Candidate ] {
338366 // 1文字のときは全探索するとめちゃくちゃ量が多いので完全一致だけ探す
339367 if prefix. count == 1 {
340- return referDicts ( prefix, option: nil , skkservDict: nil , findFromAllDicts: findCompletionFromAllDicts . value )
368+ return referDicts ( prefix, option: nil , skkservDict: skkservDict , findFromAllDicts: findFromAllDicts )
341369 . map { candidate in
342370 candidate. withOriginal ( Candidate . Original ( midashi: prefix, word: candidate. word) )
343371 }
344372 }
345373 // あとでいろいろ拡張するけどひとまずfindCompletionsの結果を[Candidate]にするだけ
346374 // 別スレッドから実行したいのでひとまずskkserv以外を検索する
347- return findCompletions ( prefix: prefix) . flatMap { midashi in
375+ return findCompletionsDicts ( prefix: prefix, skkservDict : skkservDict , findFromAllDicts : findFromAllDicts ) . flatMap { midashi in
348376 // NOTE: 多すぎても役に立たないだろうと思うのでひとまず先頭100件に制限。設定項目にしてもよさそう
349377 // FIXME: Candidateの配列じゃなくて、(String, Candidate) のように見出し語と変換候補のタプルの配列を返すほうがよさそう
350- referDicts ( midashi, option: nil , skkservDict: nil , findFromAllDicts: findCompletionFromAllDicts . value )
378+ referDicts ( midashi, option: nil , skkservDict: skkservDict , findFromAllDicts: findFromAllDicts )
351379 . prefix ( 100 )
352380 . map { candidate in
353381 candidate. withOriginal ( Candidate . Original ( midashi: midashi, word: candidate. word) )
0 commit comments