From b524feb9ceb06c1e7119138e159f72c641bdd0ba Mon Sep 17 00:00:00 2001 From: mtgto Date: Tue, 15 Aug 2023 22:02:42 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=AD=E3=83=BC=E3=83=9E=E5=AD=97=E3=81=AE?= =?UTF-8?q?=E5=AD=90=E9=9F=B3=E3=81=AE=E3=81=82=E3=81=A8=E3=81=AB=E3=83=8F?= =?UTF-8?q?=E3=82=A4=E3=83=95=E3=83=B3=E3=82=92=E6=89=93=E3=81=A4=E3=81=A8?= =?UTF-8?q?=E5=8D=8A=E8=A7=92=E3=81=AE=E3=83=8F=E3=82=A4=E3=83=95=E3=83=B3?= =?UTF-8?q?=E3=81=8C=E5=85=A5=E5=8A=9B=E3=81=95=E3=82=8C=E3=82=8B=E3=83=90?= =?UTF-8?q?=E3=82=B0=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 未確定文字列入力中 (Shift押しながら子音) のあとに、 Romaji.symbolTableにあるハイフンやピリオドなどの文字を打っても symbolTableを参照してなかったのでASCIIのまま入力されていた。 --- macSKK/Romaji.swift | 8 +++++--- macSKKTests/RomajiTests.swift | 3 +++ macSKKTests/StateMachineTests.swift | 18 ++++++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/macSKK/Romaji.swift b/macSKK/Romaji.swift index f7d47a1c..7ec77038 100644 --- a/macSKK/Romaji.swift +++ b/macSKK/Romaji.swift @@ -260,7 +260,7 @@ struct Romaji: Equatable { * * - "ka" が入力されたら確定文字 "か" と残りのローマ字文字列 "" を返す * - "k" が入力されたら確定文字はnil, 残りのローマ字文字列 "k" を返す - * - "kt" のように連続できない子音が連続したinputの場合は"t"だけをローマ字文字列として返す + * - "kt" のように連続できない子音が連続したinputの場合は"t"をinput引数としたときのconvertの結果を返す * - "kya" のように確定した文字が複数の場合がありえる * - "aiueo" のように複数の確定が可能な場合は最初に確定できた文字だけを確定文字として返し、残りは(確定可能だが)inputとして返す * - ",", "." は"、", "。"にする (将来設定で切り変えられるようにするかも) @@ -292,9 +292,11 @@ struct Romaji: Equatable { } else if array.contains(input) { return ConvertedMoji(input: input, kakutei: nil) } else if let firstIndex = array.firstIndex(where: { input.hasPrefix($0) }) { - return ConvertedMoji(input: String(input.dropFirst(array[firstIndex].utf8.count)), kakutei: nil) + return convert(String(input.dropFirst(array[firstIndex].utf8.count))) + } else if input.count == 1 { + return ConvertedMoji(input: input, kakutei: nil) } else if let c = input.last { - return ConvertedMoji(input: String(c), kakutei: nil) + return convert(String(c)) } return ConvertedMoji(input: input, kakutei: nil) } diff --git a/macSKKTests/RomajiTests.swift b/macSKKTests/RomajiTests.swift index fa9a0291..5bde00bd 100644 --- a/macSKKTests/RomajiTests.swift +++ b/macSKKTests/RomajiTests.swift @@ -26,5 +26,8 @@ class RomajiTests: XCTestCase { Romaji.convert("tsh"), Romaji.ConvertedMoji(input: "h", kakutei: nil), "続けられない子音が連続した場合は最後の子音だけ残る (shじゃなくてhだけ残す)") XCTAssertEqual(Romaji.convert("nf"), Romaji.ConvertedMoji(input: "f", kakutei: Romaji.n)) + XCTAssertEqual(Romaji.convert("s-"), Romaji.ConvertedMoji(input: "", kakutei: Romaji.symbolTable["-"]), "二文字目が一文字目に続けられないRomaji.symbolTableの文字のときは一文字目を捨てる") + XCTAssertEqual(Romaji.convert("ty,"), Romaji.ConvertedMoji(input: "", kakutei: Romaji.symbolTable[","])) + XCTAssertEqual(Romaji.convert("xts["), Romaji.ConvertedMoji(input: "", kakutei: Romaji.symbolTable["["])) } } diff --git a/macSKKTests/StateMachineTests.swift b/macSKKTests/StateMachineTests.swift index 63fb0e4d..2c8d18e7 100644 --- a/macSKKTests/StateMachineTests.swift +++ b/macSKKTests/StateMachineTests.swift @@ -769,6 +769,24 @@ final class StateMachineTests: XCTestCase { wait(for: [expectation], timeout: 1.0) } + func testHandleComposingPrintableSymbol() { + let expectation = XCTestExpectation() + stateMachine.inputMethodEvent.collect(5).sink { events in + XCTAssertEqual(events[0], .markedText(MarkedText(text: "▽s", cursor: nil))) + XCTAssertEqual(events[1], .markedText(MarkedText(text: "▽ー", cursor: nil)), "Romaji.symbolTableに対応") + XCTAssertEqual(events[2], .markedText(MarkedText(text: "▽ーt", cursor: nil))) + XCTAssertEqual(events[3], .markedText(MarkedText(text: "▽ーty", cursor: nil))) + XCTAssertEqual(events[4], .markedText(MarkedText(text: "▽ー、", cursor: nil))) + expectation.fulfill() + }.store(in: &cancellables) + XCTAssertTrue(stateMachine.handle(printableKeyEventAction(character: "s", withShift: true))) + XCTAssertTrue(stateMachine.handle(printableKeyEventAction(character: "-"))) + XCTAssertTrue(stateMachine.handle(printableKeyEventAction(character: "t"))) + XCTAssertTrue(stateMachine.handle(printableKeyEventAction(character: "y"))) + XCTAssertTrue(stateMachine.handle(printableKeyEventAction(character: ","))) + wait(for: [expectation], timeout: 1.0) + } + func testHandleComposingCancel() { let expectation = XCTestExpectation() stateMachine.inputMethodEvent.collect(6).sink { events in