diff --git a/Sources/KanaKanjiConverterModule/Converter/KanaKanjiConverter.swift b/Sources/KanaKanjiConverterModule/Converter/KanaKanjiConverter.swift index e3d5ad0..10b14d8 100644 --- a/Sources/KanaKanjiConverterModule/Converter/KanaKanjiConverter.swift +++ b/Sources/KanaKanjiConverterModule/Converter/KanaKanjiConverter.swift @@ -156,6 +156,7 @@ import EfficientNGram result.append(contentsOf: self.unicodeCandidates(inputData)) } result.append(contentsOf: self.toVersionCandidate(inputData, options: options)) + result.append(contentsOf: self.convertToTimeExpression(inputData)) return result } diff --git a/Sources/KanaKanjiConverterModule/Converter/TimeExpression.swift b/Sources/KanaKanjiConverterModule/Converter/TimeExpression.swift new file mode 100644 index 0000000..630f7cf --- /dev/null +++ b/Sources/KanaKanjiConverterModule/Converter/TimeExpression.swift @@ -0,0 +1,43 @@ +import Foundation + +extension KanaKanjiConverter { + func convertToTimeExpression(_ inputData: ComposingText) -> [Candidate] { + var candidates: [Candidate] = [] + let numberString = inputData.convertTarget + + // Check if all chars are digit. + if numberString.contains(where: { !($0.isNumber && $0.isASCII) }) { + return [] + } + if numberString.count == 3 { + let firstDigit = Int(numberString.prefix(1))! + let lastTwoDigits = Int(numberString.suffix(2))! + if (0...9).contains(firstDigit) && (0...59).contains(lastTwoDigits) { + let timeExpression = "\(firstDigit):\(String(format: "%02d", lastTwoDigits))" + let candidate = Candidate( + text: timeExpression, + value: -10, + correspondingCount: numberString.count, + lastMid: MIDData.一般.mid, + data: [DicdataElement(word: timeExpression, ruby: numberString, cid: CIDData.固有名詞.cid, mid: MIDData.一般.mid, value: -10)] + ) + candidates.append(candidate) + } + } else if numberString.count == 4 { + let firstTwoDigits = Int(numberString.prefix(2))! + let lastTwoDigits = Int(numberString.suffix(2))! + if (0...24).contains(firstTwoDigits) && (0...59).contains(lastTwoDigits) { + let timeExpression = "\(String(format: "%02d", firstTwoDigits)):\(String(format: "%02d", lastTwoDigits))" + let candidate = Candidate( + text: timeExpression, + value: -10, + correspondingCount: numberString.count, + lastMid: MIDData.一般.mid, + data: [DicdataElement(word: timeExpression, ruby: numberString, cid: CIDData.固有名詞.cid, mid: MIDData.一般.mid, value: -10)] + ) + candidates.append(candidate) + } + } + return candidates + } +} diff --git a/Tests/KanaKanjiConverterModuleTests/ConverterTests/TimeExpressionTests.swift b/Tests/KanaKanjiConverterModuleTests/ConverterTests/TimeExpressionTests.swift new file mode 100644 index 0000000..34b6a12 --- /dev/null +++ b/Tests/KanaKanjiConverterModuleTests/ConverterTests/TimeExpressionTests.swift @@ -0,0 +1,53 @@ +import XCTest +@testable import KanaKanjiConverterModule + +final class TimeExpressionTests: XCTestCase { + private func makeDirectInput(direct input: String) -> ComposingText { + ComposingText( + convertTargetCursorPosition: input.count, + input: input.map {.init(character: $0, inputStyle: .direct)}, + convertTarget: input + ) + } + + func testConvertToTimeExpression() async throws { + let converter = await KanaKanjiConverter() + + let input1 = makeDirectInput(direct: "123") + let input2 = makeDirectInput(direct: "1234") + let input3 = makeDirectInput(direct: "999") + let input4 = makeDirectInput(direct: "1260") + let input5 = makeDirectInput(direct: "2440") + let input6 = makeDirectInput(direct: "") + let input7 = makeDirectInput(direct: "あいうえ") + let input8 = makeDirectInput(direct: "13122") + + let candidates1 = await converter.convertToTimeExpression(input1) + let candidates2 = await converter.convertToTimeExpression(input2) + let candidates3 = await converter.convertToTimeExpression(input3) + let candidates4 = await converter.convertToTimeExpression(input4) + let candidates5 = await converter.convertToTimeExpression(input5) + let candidates6 = await converter.convertToTimeExpression(input6) + let candidates7 = await converter.convertToTimeExpression(input7) + let candidates8 = await converter.convertToTimeExpression(input8) + + XCTAssertEqual(candidates1.count, 1) + XCTAssertEqual(candidates1.first?.text, "1:23") + + XCTAssertEqual(candidates2.count, 1) + XCTAssertEqual(candidates2.first?.text, "12:34") + + XCTAssertEqual(candidates3.count, 0) + + XCTAssertEqual(candidates4.count, 0) + + XCTAssertEqual(candidates5.count, 1) + XCTAssertEqual(candidates5.first?.text, "24:40") + + XCTAssertEqual(candidates6.count, 0) + + XCTAssertEqual(candidates7.count, 0) + + XCTAssertEqual(candidates8.count, 0) + } +}