This commit is contained in:
陈连辰
2023-03-13 23:10:38 +08:00
parent e532310d37
commit 760c28367b
2 changed files with 92 additions and 66 deletions

View File

@@ -11,74 +11,87 @@ import CoreData
public class Message: NSManagedObject {
var textArray: [MessageTextModel] {
var hasCode: Bool {
get {
guard let text = text else { return [] }
var array: [MessageTextModel] = []
if !text.contains("```") {
let model = MessageTextModel(type: .text, text: text)
array.append(model)
guard let text = text else { return false }
if text.contains("```") {
return true
}else {
let components = text.split(separator: "```")
var idx: Int = 0// 0: code 1: text
for (index, str) in components.enumerated() {
if index == 0 {
if (text.hasPrefix("```")) {
idx = 0
}else {
idx = 1
}
if idx == 0 {
let lines = str.components(separatedBy: "\n")
let secondLine = lines[0]
var content = String(str)
let startIndex = str.index(str.startIndex, offsetBy: 0)
let endIndex = str.index(str.startIndex, offsetBy: secondLine.count)
let range = startIndex..<endIndex
content = str.replacingCharacters(in: range, with: "")
var model = MessageTextModel(type: .code, text: content)
let head = secondLine.trimmingCharacters(in: .whitespacesAndNewlines)
model.headText = head
array.append(model)
}else {
let model = MessageTextModel(type: .text, text: String(str))
array.append(model)
}
if idx == 0 {
idx = 1
}else {
idx = 0
}
return false
}
}
}
lazy var textArray: [MessageTextModel] = {
if !hasCode {
return []
} else {
return createMessageTextArray(text: text)
}
}()
}
extension Message {
private func createMessageTextArray(text: String?) -> [MessageTextModel] {
guard let text = text else { return [] }
var array: [MessageTextModel] = []
if !text.contains("```") {
let model = MessageTextModel(type: .text, text: text)
array.append(model)
}else {
let components = text.split(separator: "```")
var idx: Int = 0// 0: code 1: text
for (index, str) in components.enumerated() {
if index == 0 {
if (text.hasPrefix("```")) {
idx = 0
}else {
if idx == 0 {
let lines = str.components(separatedBy: "\n")
let secondLine = lines[0]
var content = String(str)
let startIndex = str.index(str.startIndex, offsetBy: 0)
let endIndex = str.index(str.startIndex, offsetBy: secondLine.count)
let range = startIndex..<endIndex
content = str.replacingCharacters(in: range, with: "")
var model = MessageTextModel(type: .code, text: content)
let head = secondLine.trimmingCharacters(in: .whitespacesAndNewlines)
model.headText = head
array.append(model)
}else {
let model = MessageTextModel(type: .text, text: String(str))
array.append(model)
}
if idx == 0 {
idx = 1
}else {
idx = 0
}
idx = 1
}
if idx == 0 {
let model = createMessageCodeModel(text: String(str))
array.append(model)
}else {
let model = MessageTextModel(type: .text, text: String(str))
array.append(model)
}
if idx == 0 {
idx = 1
}else {
idx = 0
}
}else {
if idx == 0 {
let model = createMessageCodeModel(text: String(str))
array.append(model)
}else {
let model = MessageTextModel(type: .text, text: String(str))
array.append(model)
}
if idx == 0 {
idx = 1
}else {
idx = 0
}
}
}
return array
}
return array
}
private func createMessageCodeModel(text: String) -> MessageTextModel {
let lines = text.components(separatedBy: "\n")
let secondLine = lines[0]
var content = String(text)
let startIndex = text.index(text.startIndex, offsetBy: 0)
let endIndex = text.index(text.startIndex, offsetBy: secondLine.count)
let range = startIndex..<endIndex
content = text.replacingCharacters(in: range, with: "")
var model = MessageTextModel(type: .code, text: content)
let head = secondLine.trimmingCharacters(in: .whitespacesAndNewlines)
model.headText = head
return model
}
}

View File

@@ -155,17 +155,27 @@ struct ChatRoomCellView: View {
.padding(0)
Spacer()
}
VStack {
ForEach(message.textArray, id: \.self) { model in
ChatRoomCellTextView(textModel: model)
.fixedSize(horizontal: false, vertical: true)
if message.hasCode {
VStack {
ForEach(message.textArray, id: \.self) { model in
ChatRoomCellTextView(textModel: model)
.fixedSize(horizontal: false, vertical: true)
}
}
}
.padding(12)
.background(Color.gray.opacity(0.8))
.foregroundColor(.white)
.cornerRadius(6)
}else {
Text(message.text ?? "")
.padding(12)
.background(Color.gray.opacity(0.8))
.foregroundColor(.white)
.cornerRadius(6)
}
Spacer()
}
}
@@ -182,7 +192,9 @@ struct ChatRoomCellTextView: View {
Text(textModel.text)
.foregroundColor(.white)
Spacer()
}.contextMenu {
}
.fixedSize(horizontal: false, vertical: true)
.contextMenu {
Button(action: {
NSPasteboard.general.prepareForNewContents()
NSPasteboard.general.setString(textModel.text, forType: .string)
@@ -220,6 +232,7 @@ struct ChatRoomCellTextView: View {
.padding(.top, 0)
.background(Color.black.opacity(0.7))
.cornerRadius(5)
.frame(minWidth: 20)
.contextMenu {
Button(action: {
NSPasteboard.general.prepareForNewContents()