mirror of
https://github.com/MustangYM/OSXChatGpt.git
synced 2025-11-25 11:29:43 +08:00
optimize
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user