diff --git a/Sources/KanaKanjiConverterModule/InputManagement/ComposingText.swift b/Sources/KanaKanjiConverterModule/InputManagement/ComposingText.swift index 3c1a16b..9e90b16 100644 --- a/Sources/KanaKanjiConverterModule/InputManagement/ComposingText.swift +++ b/Sources/KanaKanjiConverterModule/InputManagement/ComposingText.swift @@ -213,31 +213,6 @@ public struct ComposingText: Sendable { return (oldString.count - common.count, String(newString.dropFirst(common.count))) } - /// inputの更新における特殊処理を扱う - /// TODO: アドホックな対処なのでどうにか一般化したい。 - private mutating func updateInput(_ string: String, at inputCursorPosition: Int, inputStyle: InputStyle) { - if inputCursorPosition == 0 { - self.input.insert(contentsOf: string.map {InputElement(character: $0, inputStyle: inputStyle)}, at: inputCursorPosition) - return - } - let prev = self.input[inputCursorPosition - 1] - if inputStyle == .roman2kana && prev.inputStyle == inputStyle, let first = string.first, String(first).onlyRomanAlphabet { - if prev.character == first && !["a", "i", "u", "e", "o", "n"].contains(first) { - self.input[inputCursorPosition - 1] = InputElement(character: "っ", inputStyle: .direct) - self.input.insert(contentsOf: string.map {InputElement(character: $0, inputStyle: inputStyle)}, at: inputCursorPosition) - return - } - let n_prefix = self.input[0 ..< inputCursorPosition].suffix {$0.character == "n" && $0.inputStyle == .roman2kana} - if n_prefix.count % 2 == 1 && !["n", "a", "i", "u", "e", "o", "y"].contains(first) - && self.input.dropLast(n_prefix.count).last != .init(character: "x", inputStyle: .roman2kana) { - self.input[inputCursorPosition - 1] = InputElement(character: "ん", inputStyle: .direct) - self.input.insert(contentsOf: string.map {InputElement(character: $0, inputStyle: inputStyle)}, at: inputCursorPosition) - return - } - } - self.input.insert(contentsOf: string.map {InputElement(character: $0, inputStyle: inputStyle)}, at: inputCursorPosition) - } - /// 現在のカーソル位置に文字を追加する関数 public mutating func insertAtCursorPosition(_ string: String, inputStyle: InputStyle) { if string.isEmpty { @@ -246,7 +221,7 @@ public struct ComposingText: Sendable { let inputCursorPosition = self.forceGetInputCursorPosition(target: self.convertTarget.prefix(convertTargetCursorPosition)) // input, convertTarget, convertTargetCursorPositionの3つを更新する // inputを更新 - self.updateInput(string, at: inputCursorPosition, inputStyle: inputStyle) + self.input.insert(contentsOf: string.map {InputElement(character: $0, inputStyle: inputStyle)}, at: inputCursorPosition) let oldConvertTarget = self.convertTarget.prefix(self.convertTargetCursorPosition) let newConvertTarget = Self.getConvertTarget(for: self.input.prefix(inputCursorPosition + string.count)) diff --git a/Tests/KanaKanjiConverterModuleTests/ComposingTextTests.swift b/Tests/KanaKanjiConverterModuleTests/ComposingTextTests.swift index 4050aa0..40197ba 100644 --- a/Tests/KanaKanjiConverterModuleTests/ComposingTextTests.swift +++ b/Tests/KanaKanjiConverterModuleTests/ComposingTextTests.swift @@ -75,7 +75,7 @@ final class ComposingTextTests: XCTestCase { sequentialInput(&c, sequence: "itte", inputStyle: .roman2kana) XCTAssertEqual(c.input, [ ComposingText.InputElement(character: "i", inputStyle: .roman2kana), - ComposingText.InputElement(character: "っ", inputStyle: .direct), + ComposingText.InputElement(character: "t", inputStyle: .roman2kana), ComposingText.InputElement(character: "t", inputStyle: .roman2kana), ComposingText.InputElement(character: "e", inputStyle: .roman2kana) ]) @@ -88,7 +88,7 @@ final class ComposingTextTests: XCTestCase { sequentialInput(&c, sequence: "anta", inputStyle: .roman2kana) XCTAssertEqual(c.input, [ ComposingText.InputElement(character: "a", inputStyle: .roman2kana), - ComposingText.InputElement(character: "ん", inputStyle: .direct), + ComposingText.InputElement(character: "n", inputStyle: .roman2kana), ComposingText.InputElement(character: "t", inputStyle: .roman2kana), ComposingText.InputElement(character: "a", inputStyle: .roman2kana) ]) @@ -223,9 +223,6 @@ final class ComposingTextTests: XCTestCase { sequentialInput(&c, sequence: "kyouhaiitenkida", inputStyle: .roman2kana) let map = c.inputIndexToSurfaceIndexMap() - // Note: 現在の実装では、アドホックな対処によってnが"ん"に切り替わる - XCTAssertEqual(c.input[10], .init(character: "ん", inputStyle: .direct)) - XCTAssertEqual(map[0], 0) // "" XCTAssertEqual(map[1], nil) // k XCTAssertEqual(map[2], nil) // y @@ -237,7 +234,7 @@ final class ComposingTextTests: XCTestCase { XCTAssertEqual(map[8], 6) // i XCTAssertEqual(map[9], nil) // t XCTAssertEqual(map[10], 7) // e - XCTAssertEqual(map[11], 8) // n // アドホックな対処の影響。nの場合はnilであるべき。 + XCTAssertEqual(map[11], nil) // n XCTAssertEqual(map[12], nil) // k XCTAssertEqual(map[13], 9) // i XCTAssertEqual(map[14], nil) // d