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

103 lines
3.9 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.ranges = [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)
lastClause.ranges.append(self.range)
//
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.ranges.append(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
}
}
}