InputState // Let attributedString drawn as node segments when OK.

This commit is contained in:
ShikiSuen 2022-08-01 23:32:19 +08:00
parent e977694888
commit ebcc0a0479
2 changed files with 34 additions and 14 deletions

View File

@ -175,6 +175,8 @@ public enum InputState {
public var type: StateType { .ofNotEmpty }
private(set) var composingBuffer: String
private(set) var cursorIndex: Int = 0 { didSet { cursorIndex = max(cursorIndex, 0) } }
private(set) var reading: String = ""
private(set) var nodeValuesArray = [String]()
public var composingBufferConverted: String {
let converted = IME.kanjiConversionIfRequired(composingBuffer)
if converted.utf16.count != composingBuffer.utf16.count
@ -185,23 +187,39 @@ public enum InputState {
return converted
}
init(composingBuffer: String, cursorIndex: Int) {
init(composingBuffer: String, cursorIndex: Int, reading: String = "", nodeValuesArray: [String] = []) {
self.composingBuffer = composingBuffer
self.reading = reading
self.nodeValuesArray = nodeValuesArray
defer { self.cursorIndex = cursorIndex }
}
var attributedString: NSMutableAttributedString {
///
/// JIS
guard reading.isEmpty else {
let attributedString = NSMutableAttributedString(
string: composingBufferConverted,
attributes: [
.underlineStyle: NSUnderlineStyle.single.rawValue,
.underlineStyle: NSUnderlineStyle.thick.rawValue,
.markedClauseSegment: 0,
]
)
return attributedString
}
let attributedString = NSMutableAttributedString(string: composingBufferConverted)
var newBegin = 0
for (i, neta) in nodeValuesArray.enumerated() {
attributedString.setAttributes(
[
.underlineStyle: NSUnderlineStyle.thick.rawValue,
.markedClauseSegment: i,
], range: NSRange(location: newBegin, length: neta.utf16.count)
)
newBegin += neta.utf16.count
}
return attributedString
}
var description: String {
"<InputState.NotEmpty, composingBuffer:\(composingBuffer), cursorIndex:\(cursorIndex)>"
@ -216,8 +234,9 @@ public enum InputState {
var textToCommit: String = ""
var tooltip: String = ""
override init(composingBuffer: String, cursorIndex: Int) {
super.init(composingBuffer: composingBuffer, cursorIndex: cursorIndex)
override init(composingBuffer: String, cursorIndex: Int, reading: String = "", nodeValuesArray: [String] = []) {
super.init(
composingBuffer: composingBuffer, cursorIndex: cursorIndex, reading: reading, nodeValuesArray: nodeValuesArray)
}
override var description: String {

View File

@ -38,7 +38,7 @@ extension KeyHandler {
/// (Update the composing buffer)
/// NSAttributeString
var tooltipParameterRef: [String] = ["", ""]
var composingBuffer = ""
let nodeValuesArray: [String] = walkedAnchors.map(\.node.currentPair.value)
var composedStringCursorIndex = 0
var readingCursorIndex = 0
/// IMK UTF8 emoji
@ -47,7 +47,6 @@ extension KeyHandler {
for theAnchor in walkedAnchors {
let theNode = theAnchor.node
let strNodeValue = theNode.currentPair.value
composingBuffer += strNodeValue
let arrSplit: [String] = Array(strNodeValue).map { String($0) }
let codepointCount = arrSplit.count
///
@ -95,7 +94,7 @@ extension KeyHandler {
var arrHead = [String.UTF16View.Element]()
var arrTail = [String.UTF16View.Element]()
for (i, n) in composingBuffer.utf16.enumerated() {
for (i, n) in nodeValuesArray.joined().utf16.enumerated() {
if i < composedStringCursorIndex {
arrHead.append(n)
} else {
@ -121,7 +120,9 @@ extension KeyHandler {
}
/// 使
return InputState.Inputting(composingBuffer: cleanedComposition, cursorIndex: cursorIndex)
return InputState.Inputting(
composingBuffer: cleanedComposition, cursorIndex: cursorIndex, reading: reading, nodeValuesArray: nodeValuesArray
)
}
// MARK: -