Files
AzooKeyKanaKanjiConverter/Sources/KanaKanjiConverterModule/ConversionAlgorithms/RegisteredNodeProtocol.swift

107 lines
4.0 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// RegisteredNode.swift
// Keyboard
//
// Created by ensan on 2020/09/16.
// Copyright © 2020 ensan. All rights reserved.
//
import Foundation
/// `struct``RegisteredNode`Existential Type
/// - Note: `indirect enum`
protocol RegisteredNodeProtocol {
var data: DicdataElement {get}
var prev: (any RegisteredNodeProtocol)? {get}
var totalValue: PValue {get}
var range: Lattice.LatticeRange {get}
}
struct RegisteredNode: RegisteredNodeProtocol {
///
let data: DicdataElement
/// 1
let prev: (any RegisteredNodeProtocol)?
///
let totalValue: PValue
/// `composingText``input`
let range: Lattice.LatticeRange
init(data: DicdataElement, registered: RegisteredNode?, totalValue: PValue, range: Lattice.LatticeRange) {
self.data = data
self.prev = registered
self.totalValue = totalValue
self.range = range
}
///
/// - Returns:
static func BOSNode() -> RegisteredNode {
RegisteredNode(data: DicdataElement.BOSData, registered: nil, totalValue: 0, range: .zero)
}
///
/// - Returns:
static func fromLastCandidate(_ candidate: Candidate) -> RegisteredNode {
RegisteredNode(
data: DicdataElement(word: "", ruby: "", lcid: CIDData.BOS.cid, rcid: candidate.data.last?.rcid ?? CIDData.BOS.cid, mid: candidate.lastMid, value: 0),
registered: nil,
totalValue: 0,
range: .zero
)
}
}
extension RegisteredNodeProtocol {
/// `CandidateData`
/// - Returns:
func getCandidateData() -> CandidateData {
guard let prev else {
let unit = ClauseDataUnit()
unit.mid = self.data.mid
unit.range = self.range
return CandidateData(clauses: [(clause: unit, value: .zero)], data: [])
}
var lastcandidate = prev.getCandidateData() // registerd
if self.data.word.isEmpty {
return lastcandidate
}
guard let lastClause = lastcandidate.lastClause else {
return lastcandidate
}
if lastClause.text.isEmpty || !DicdataStore.isClause(prev.data.rcid, self.data.lcid) {
//
lastClause.text.append(self.data.word)
if let newRange = lastClause.range.merged(with: self.range) {
lastClause.range = newRange
} else {
fatalError("このケースは想定していません。")
}
//
if (lastClause.mid == 500 && self.data.mid != 500) || DicdataStore.includeMMValueCalculation(self.data) {
lastClause.mid = self.data.mid
}
lastcandidate.clauses[lastcandidate.clauses.count - 1].value = self.totalValue
lastcandidate.data.append(self.data)
return lastcandidate
}
//
else {
let unit = ClauseDataUnit()
unit.text = self.data.word
unit.range = self.range
if DicdataStore.includeMMValueCalculation(self.data) {
unit.mid = self.data.mid
}
//
lastClause.nextLcid = self.data.lcid
lastcandidate.clauses.append((clause: unit, value: self.totalValue))
lastcandidate.data.append(self.data)
return lastcandidate
}
}
}