@@ -147,6 +147,33 @@ public extension CandidateSelection {
147147 }
148148}
149149
150+ public struct ReplaceBehavior : Hashable , Sendable {
151+ public init ( type: ReplaceBehavior . ReplaceType , fallbacks: [ ReplaceBehavior . ReplaceType ] = [ ] ) {
152+ self . type = type
153+ self . fallbacks = fallbacks
154+ }
155+
156+ public static let `default` = Self ( type: . default, fallbacks: [ ] )
157+ public enum ReplaceType : String , Codable , Hashable , Sendable {
158+ /// デフォルト。
159+ /// - a→A→a
160+ /// - あ→ぁ→あ
161+ /// - は→ば→ぱ→は
162+ /// - つ→っ→づ→つ
163+ case `default`
164+ /// 濁点化のみ行う
165+ case dakuten
166+ /// 半濁点化のみ行う
167+ case handakuten
168+ /// 小書き化のみ行う
169+ case kogaki
170+ }
171+ /// 置換の振る舞い
172+ public var type : ReplaceType
173+ /// 置換が行われなかった場合、次に試す置換
174+ public var fallbacks : [ ReplaceType ]
175+ }
176+
150177/// - アクション
151178/// - actions done in key pressing
152179public enum CodableActionData : Codable , Hashable , Sendable {
@@ -158,7 +185,7 @@ public enum CodableActionData: Codable, Hashable, Sendable {
158185 case paste
159186
160187 /// - exchange character "あ→ぁ", "は→ば", "a→A"
161- case replaceDefault
188+ case replaceDefault( ReplaceBehavior )
162189
163190 /// - replace string at the trailing of cursor following to specified table
164191 case replaceLastCharacters( [ String : String ] )
@@ -220,6 +247,7 @@ public extension CodableActionData {
220247 case direction, targets
221248 case scheme_type, target
222249 case selection
250+ case replace_type, fallbacks
223251 }
224252
225253 private enum ValueType : String , Codable {
@@ -311,6 +339,14 @@ public extension CodableActionData {
311339 switch self {
312340 case let . input( value) :
313341 try container. encode ( value, forKey: . text)
342+ case let . replaceDefault( value) :
343+ // デフォルト値以外の場合のみ明示的にエンコード
344+ if value. type != . default {
345+ try container. encode ( value. type, forKey: . replace_type)
346+ }
347+ if !value. fallbacks. isEmpty {
348+ try container. encode ( value. fallbacks, forKey: . fallbacks)
349+ }
314350 case let . replaceLastCharacters( value) :
315351 try container. encode ( value, forKey: . table)
316352 case let . delete( value) , let . moveCursor( value) :
@@ -325,7 +361,7 @@ public extension CodableActionData {
325361 try container. encode ( value, forKey: . selection)
326362 case let . moveTab( value) :
327363 try CodableTabArgument ( tab: value) . containerEncode ( container: & container)
328- case . dismissKeyboard, . enableResizingMode, . toggleTabBar, . toggleCursorBar, . toggleCapsLockState, . complete, . smartDeleteDefault, . replaceDefault , . paste: break
364+ case . dismissKeyboard, . enableResizingMode, . toggleTabBar, . toggleCursorBar, . toggleCapsLockState, . complete, . smartDeleteDefault, . paste: break
329365 }
330366 }
331367
@@ -337,7 +373,9 @@ public extension CodableActionData {
337373 let value = try container. decode ( String . self, forKey: . text)
338374 self = . input( value)
339375 case . replace_default:
340- self = . replaceDefault
376+ let replaceType = try container. decodeIfPresent ( ReplaceBehavior . ReplaceType. self, forKey: . replace_type) ?? . default
377+ let fallbacks = try container. decodeIfPresent ( [ ReplaceBehavior . ReplaceType ] . self, forKey: . fallbacks) ?? [ ]
378+ self = . replaceDefault( . init( type: replaceType, fallbacks: fallbacks) )
341379 case . replace_last_characters:
342380 let value = try container. decode ( [ String : String ] . self, forKey: . table)
343381 self = . replaceLastCharacters( value)
0 commit comments