From 763b059a45a6bcf1309b722dca4f89d19d3d8dcb Mon Sep 17 00:00:00 2001 From: Miwa / Ensan Date: Sun, 29 Jun 2025 14:16:25 +0900 Subject: [PATCH] feat: support roman version of pruning --- .../DicdataStore/TypoCorrection.swift | 16 ++++++++++++++-- .../KanaKanjiConverterModule/Roman2Kana.swift | 5 +++++ .../ConverterTests/ConverterTests.swift | 18 ++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/Sources/KanaKanjiConverterModule/DicdataStore/TypoCorrection.swift b/Sources/KanaKanjiConverterModule/DicdataStore/TypoCorrection.swift index aa2b865..d7bab77 100644 --- a/Sources/KanaKanjiConverterModule/DicdataStore/TypoCorrection.swift +++ b/Sources/KanaKanjiConverterModule/DicdataStore/TypoCorrection.swift @@ -52,9 +52,21 @@ struct TypoCorrectionGenerator { stablePrefix.append(contentsOf: item.string) case .roman2kana: // TODO: impl - break loop + var stableIndex = item.string.endIndex + for suffix in Roman2Kana.unstableSuffixes { + if item.string.hasSuffix(suffix) { + stableIndex = min(stableIndex, item.string.endIndex - suffix.count) + } + } + if stableIndex == item.string.endIndex { + stablePrefix.append(contentsOf: item.string) + } else { + // 全体が安定でない場合は、そこでbreakする + stablePrefix.append(contentsOf: item.string[0 ..< stableIndex]) + break loop + } } - // 安定なprefixが + // 安定なprefixがtargetをprefixに持つ場合、このstack内のアイテムについてもunreachableであることが分かるので、除去する if stablePrefix.hasPrefix(target) { return false } diff --git a/Sources/KanaKanjiConverterModule/Roman2Kana.swift b/Sources/KanaKanjiConverterModule/Roman2Kana.swift index 58e2a5c..2e0ea4e 100644 --- a/Sources/KanaKanjiConverterModule/Roman2Kana.swift +++ b/Sources/KanaKanjiConverterModule/Roman2Kana.swift @@ -10,6 +10,11 @@ import Foundation import SwiftUtils enum Roman2Kana { + static let unstableSuffixes: Set<[Character]> = hiraganaChanges.keys.flatMapSet { characters in + characters.indices.map { i in + Array(characters[...i]) + } + } static let katakanaChanges: [String: String] = Dictionary(uniqueKeysWithValues: hiraganaChanges.map { (String($0.key), String($0.value).toKatakana()) }) static let hiraganaChanges: [[Character]: [Character]] = Dictionary(uniqueKeysWithValues: [ "a": "あ", diff --git a/Tests/KanaKanjiConverterModuleWithDefaultDictionaryTests/ConverterTests/ConverterTests.swift b/Tests/KanaKanjiConverterModuleWithDefaultDictionaryTests/ConverterTests/ConverterTests.swift index 2935689..446078d 100644 --- a/Tests/KanaKanjiConverterModuleWithDefaultDictionaryTests/ConverterTests/ConverterTests.swift +++ b/Tests/KanaKanjiConverterModuleWithDefaultDictionaryTests/ConverterTests/ConverterTests.swift @@ -52,6 +52,24 @@ final class ConverterTests: XCTestCase { let results = await converter.requestCandidates(c, options: requestOptions()) XCTAssertEqual(results.mainResults.first?.text, "幼少期からテニス水泳野球少林寺拳法など様々なスポーツを経験しながら育ち小学校時代はロサンゼルス近郊に滞在しておりゴルフやテニスを習っていた") } + + } + + func testRoman2KanaFullConversion() async throws { + do { + let converter = await KanaKanjiConverter() + var c = ComposingText() + c.insertAtCursorPosition("azuーkiーhasinjidainokiーboーdoapuridesu", inputStyle: .roman2kana) + let results = await converter.requestCandidates(c, options: requestOptions()) + XCTAssertEqual(results.mainResults.first?.text, "azooKeyは新時代のキーボードアプリです") + } + do { + let converter = await KanaKanjiConverter() + var c = ComposingText() + c.insertAtCursorPosition("youshoukikaratenisusuieiyakyuushourinjikenpounadosamazamanasupoーtuwokeikennsinagarasodatishougakkouzidaiharosanzerusukinkounitaizaisiteorigoruhuyatenisuwonaratteita", inputStyle: .roman2kana) + let results = await converter.requestCandidates(c, options: requestOptions()) + XCTAssertEqual(results.mainResults.first?.text, "幼少期からテニス水泳野球少林寺拳法など様々なスポーツを経験しながら育ち小学校時代はロサンゼルス近郊に滞在しておりゴルフやテニスを習っていた") + } } // 1文字ずつ変換する