Skip to content

Commit 6b89052

Browse files
authored
Merge pull request #193 from azooKey/feat/support_kana_input
feat: かな入力をサポート
2 parents 0cc9ae0 + 0b81426 commit 6b89052

10 files changed

Lines changed: 60 additions & 19 deletions

File tree

Core/Package.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ let package = Package(
1414
)
1515
],
1616
dependencies: [
17-
.package(url: "https://github.com/azooKey/AzooKeyKanaKanjiConverter", branch: "ee14c15ae9970c74a7a958aece64593ff1988141", traits: ["Zenzai"])
17+
.package(url: "https://github.com/azooKey/AzooKeyKanaKanjiConverter", branch: "5fe1f79ab7dec6dfba02d8c7c084523eb036fef9", traits: ["Zenzai"])
1818
],
1919
targets: [
2020
.executableTarget(
@@ -31,13 +31,15 @@ let package = Package(
3131
.product(name: "SwiftUtils", package: "AzooKeyKanaKanjiConverter"),
3232
.product(name: "KanaKanjiConverterModuleWithDefaultDictionary", package: "AzooKeyKanaKanjiConverter")
3333
],
34+
swiftSettings: [.interoperabilityMode(.Cxx)],
3435
plugins: [
3536
.plugin(name: "GitInfoPlugin")
3637
]
3738
),
3839
.testTarget(
3940
name: "CoreTests",
40-
dependencies: ["Core"]
41+
dependencies: ["Core"],
42+
swiftSettings: [.interoperabilityMode(.Cxx)]
4143
)
4244
]
4345
)

Core/Sources/Core/InputUtils/Actions/ClientAction.swift

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import InputMethodKit
2+
import KanaKanjiConverterModule
23

34
public enum ClientAction {
45
case `consume`
56
case `fallthrough`
67
case showCandidateWindow
78
case hideCandidateWindow
89
case appendToMarkedText(String)
10+
case appendPieceToMarkedText(InputPiece)
911

1012
/// Marked Textを経由せずにインサートするコマンド。InputStateがnoneの場合のみ有効
1113
case insertWithoutMarkedText(String)
@@ -30,11 +32,7 @@ public enum ClientAction {
3032

3133
/// MarkedTextを確定して、さらに追加で入力する
3234
case commitMarkedTextAndAppendToMarkedText(String)
33-
34-
/// 現在選ばれている候補を確定して、さらに追加で入力する
35-
/// - note:`commitMarkedTextAndAppendToMarkedText`はMarkedText全体を一度に確定するが、`submitSelectedCandidateAndAppendToMarkedText`の場合は部分的に確定されることがあるという違いがある
36-
case submitSelectedCandidateAndAppendToMarkedText(String)
37-
case submitSelectedCandidateAndEnterFirstCandidatePreviewMode
35+
case commitMarkedTextAndAppendPieceToMarkedText(InputPiece)
3836

3937
/// デバッグウィンドウを表示するコマンド
4038
case enableDebugWindow

Core/Sources/Core/InputUtils/Actions/UserAction.swift

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import KanaKanjiConverterModule
12
public enum UserAction {
23
case input(String)
34
case backspace
@@ -26,7 +27,7 @@ public enum UserAction {
2627
}
2728

2829
public enum Number: Sendable, Equatable, Hashable {
29-
case one, two, three, four, five, six, seven, eight, nine, zero
30+
case one, two, three, four, five, six, seven, eight, nine, zero, shiftZero
3031
public var intValue: Int {
3132
switch self {
3233
case .one: 1
@@ -39,6 +40,23 @@ public enum UserAction {
3940
case .eight: 8
4041
case .nine: 9
4142
case .zero: 0
43+
case .shiftZero: 0
44+
}
45+
}
46+
47+
public var inputPiece: InputPiece {
48+
switch self {
49+
case .one: .character("1")
50+
case .two: .character("2")
51+
case .three: .character("3")
52+
case .four: .character("4")
53+
case .five: .character("5")
54+
case .six: .character("6")
55+
case .seven: .character("7")
56+
case .eight: .character("8")
57+
case .nine: .character("9")
58+
case .zero: .character("0")
59+
case .shiftZero: .key(intention: "0", modifiers: [.shift])
4260
}
4361
}
4462

@@ -54,6 +72,7 @@ public enum UserAction {
5472
case .eight: "8"
5573
case .nine: "9"
5674
case .zero: "0"
75+
case .shiftZero: "0"
5776
}
5877
}
5978
}

Core/Sources/Core/InputUtils/InputState.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public enum InputState: Sendable, Hashable {
7373
case .number(let number):
7474
switch inputLanguage {
7575
case .japanese:
76-
return (.appendToMarkedText(number.inputString), .transition(.composing))
76+
return (.appendPieceToMarkedText(number.inputPiece), .transition(.composing))
7777
case .english:
7878
return (.insertWithoutMarkedText(number.inputString), .fallthrough)
7979
}
@@ -124,7 +124,7 @@ public enum InputState: Sendable, Hashable {
124124
case .input(let string):
125125
return (.appendToMarkedText(string), .fallthrough)
126126
case .number(let number):
127-
return (.appendToMarkedText(number.inputString), .fallthrough)
127+
return (.appendPieceToMarkedText(number.inputPiece), .fallthrough)
128128
case .backspace:
129129
return (.removeLastMarkedText, .basedOnBackspace(ifIsEmpty: .none, ifIsNotEmpty: .composing))
130130
case .enter:
@@ -181,7 +181,7 @@ public enum InputState: Sendable, Hashable {
181181
case .input(let string):
182182
return (.commitMarkedTextAndAppendToMarkedText(string), .transition(.composing))
183183
case .number(let number):
184-
return (.appendToMarkedText(number.inputString), .transition(.composing))
184+
return (.commitMarkedTextAndAppendPieceToMarkedText(number.inputPiece), .transition(.composing))
185185
case .backspace:
186186
return (.removeLastMarkedText, .transition(.composing))
187187
case .enter:
@@ -282,8 +282,8 @@ public enum InputState: Sendable, Hashable {
282282
switch num {
283283
case .one, .two, .three, .four, .five, .six, .seven, .eight, .nine:
284284
return (.selectNumberCandidate(num.intValue), .basedOnSubmitCandidate(ifIsEmpty: .none, ifIsNotEmpty: .previewing))
285-
case .zero:
286-
return (.submitSelectedCandidateAndAppendToMarkedText(num.inputString), .transition(.composing))
285+
case .zero, .shiftZero:
286+
return (.commitMarkedTextAndAppendPieceToMarkedText(num.inputPiece), .transition(.composing))
287287
}
288288
case .editSegment(let count):
289289
return (.editSegment(count), .transition(.selecting))

Core/Sources/Core/KeyMap/KeyMap+hankaku2zenkaku.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ extension KeyMap {
1212
"!": "",
1313
"\"": "",
1414
"#": "",
15+
"$": "",
1516
"%": "",
1617
"&": "",
1718
"'": "",

azooKeyMac/Configs/CustomCodableConfigItem.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ extension Config {
149149
enum Value: String, Codable, Equatable, Hashable {
150150
case `default`
151151
case defaultAZIK
152+
case defaultKanaJIS
153+
case defaultKanaUS
152154
}
153155
static var `default`: Value = .default
154156
static var key: String = "dev.ensan.inputmethod.azooKeyMac.preference.input_style"

azooKeyMac/InputController/SegmentsManager.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,15 @@ final class SegmentsManager {
218218
self.updateRawCandidate()
219219
}
220220

221+
@MainActor
222+
func insertAtCursorPosition(piece: InputPiece, inputStyle: InputStyle) {
223+
self.composingText.insertAtCursorPosition([.init(piece: piece, inputStyle: inputStyle)])
224+
self.lastOperation = .insert
225+
// ライブ変換がオフの場合は変換候補ウィンドウを出したい
226+
self.shouldShowCandidateWindow = !self.liveConversionEnabled
227+
self.updateRawCandidate()
228+
}
229+
221230
@MainActor
222231
func editSegment(count: Int) {
223232
// 現在選ばれているprefix candidateが存在する場合、まずそれに合わせてカーソルを移動する
@@ -508,6 +517,7 @@ final class SegmentsManager {
508517
switch $0.piece {
509518
case .compositionSeparator: nil
510519
case .character(let c): c
520+
case .key(intention: let c, modifiers: _): c
511521
}
512522
})
513523
let candidateText = transform(inputString)

azooKeyMac/InputController/UserAction+getUserAction.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,9 @@ extension UserAction {
236236
29: .zero
237237
][event.keyCode]!
238238
return .number(number)
239+
} else if event.keyCode == 29 && event.modifierFlags.contains(.shift) && event.characters == "0" {
240+
// JISキーボードにおいてShift+0の場合は特別な処理になる
241+
return .number(.shiftZero)
239242
} else {
240243
// go default
241244
fallthrough

azooKeyMac/InputController/azooKeyMacInputController.swift

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,10 @@ class azooKeyMacInputController: IMKInputController { // swiftlint:disable:this
204204
.roman2kana
205205
case .defaultAZIK:
206206
.mapped(id: .defaultAZIK)
207+
case .defaultKanaUS:
208+
.mapped(id: .defaultKanaUS)
209+
case .defaultKanaJIS:
210+
.mapped(id: .defaultKanaJIS)
207211
}
208212
}
209213

@@ -224,6 +228,8 @@ class azooKeyMacInputController: IMKInputController { // swiftlint:disable:this
224228
self.segmentsManager.update(requestRichCandidates: true)
225229
case .appendToMarkedText(let string):
226230
self.segmentsManager.insertAtCursorPosition(string, inputStyle: self.inputStyle)
231+
case .appendPieceToMarkedText(let piece):
232+
self.segmentsManager.insertAtCursorPosition(piece: piece, inputStyle: self.inputStyle)
227233
case .insertWithoutMarkedText(let string):
228234
client.insertText(string, replacementRange: NSRange(location: NSNotFound, length: 0))
229235
case .editSegment(let count):
@@ -235,14 +241,12 @@ class azooKeyMacInputController: IMKInputController { // swiftlint:disable:this
235241
let text = self.segmentsManager.commitMarkedText(inputState: self.inputState)
236242
client.insertText(text, replacementRange: NSRange(location: NSNotFound, length: 0))
237243
self.segmentsManager.insertAtCursorPosition(string, inputStyle: self.inputStyle)
244+
case .commitMarkedTextAndAppendPieceToMarkedText(let piece):
245+
let text = self.segmentsManager.commitMarkedText(inputState: self.inputState)
246+
client.insertText(text, replacementRange: NSRange(location: NSNotFound, length: 0))
247+
self.segmentsManager.insertAtCursorPosition(piece: piece, inputStyle: self.inputStyle)
238248
case .submitSelectedCandidate:
239249
self.submitSelectedCandidate()
240-
case .submitSelectedCandidateAndAppendToMarkedText(let string):
241-
self.submitSelectedCandidate()
242-
self.segmentsManager.insertAtCursorPosition(string, inputStyle: self.inputStyle)
243-
case .submitSelectedCandidateAndEnterFirstCandidatePreviewMode:
244-
self.submitSelectedCandidate()
245-
self.segmentsManager.requestSetCandidateWindowState(visible: false)
246250
case .removeLastMarkedText:
247251
self.segmentsManager.deleteBackwardFromCursorPosition()
248252
self.segmentsManager.requestResettingSelection()

azooKeyMac/Windows/ConfigWindow.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,8 @@ struct ConfigWindow: View {
167167
Divider()
168168
Picker("入力方式", selection: $inputStyle) {
169169
Text("デフォルト").tag(Config.InputStyle.Value.default)
170+
Text("かな入力(JIS)").tag(Config.InputStyle.Value.defaultKanaJIS)
171+
Text("かな入力(US)").tag(Config.InputStyle.Value.defaultKanaUS)
170172
Text("AZIK(β版)").tag(Config.InputStyle.Value.defaultAZIK)
171173
}
172174
Divider()

0 commit comments

Comments
 (0)