mirror of
https://github.com/mii443/AzooKeyKanaKanjiConverter.git
synced 2025-12-03 02:58:27 +00:00
Merge pull request #171 from azooKey/ensan-hcl/feat/add_time_expression
feat: Add time expression conversion function
This commit is contained in:
@@ -156,6 +156,7 @@ import EfficientNGram
|
|||||||
result.append(contentsOf: self.unicodeCandidates(inputData))
|
result.append(contentsOf: self.unicodeCandidates(inputData))
|
||||||
}
|
}
|
||||||
result.append(contentsOf: self.toVersionCandidate(inputData, options: options))
|
result.append(contentsOf: self.toVersionCandidate(inputData, options: options))
|
||||||
|
result.append(contentsOf: self.convertToTimeExpression(inputData))
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user