chat-pc/src/components/editor/util.ts

176 lines
3.4 KiB
TypeScript
Raw Normal View History

2024-12-24 08:14:21 +00:00
import { Delta } from '@vueup/vue-quill'
interface Item {
type: number
content: string
}
interface AnalysisResp {
items: Item[]
mentions: any[]
mentionUids: number[]
msgType: number // 1 文本2图片3图文混合消息
quoteId: string // 引用的消息ID
}
function removeLeadingNewlines(str: string) {
return str.replace(/^[\n\s]+/, '')
}
function removeTrailingNewlines(str: string) {
return str.replace(/[\n\s]+$/, '')
}
export function deltaToMessage(delta: Delta): AnalysisResp {
const resp: AnalysisResp = {
items: [],
mentions: [],
mentionUids: [],
quoteId: '',
msgType: 1
}
for (const iterator of delta.ops) {
const insert: any = iterator.insert
let node: any = null
if (resp.items.length) {
node = resp.items[resp.items.length - 1]
}
if (typeof insert === 'string') {
if (!insert || insert == '\n') continue
if (node && node.type == 1) {
node.content = node.content + insert
continue
}
resp.items.push({
type: 1,
content: insert
})
continue
}
// @好友
if (insert && insert.mention) {
const mention = insert.mention
resp.mentions.push({
name: `${mention.denotationChar}${mention.value}`,
atid: parseInt(mention.id)
})
if (node && node.type == 1) {
node.content = node.content + ` ${mention.denotationChar}${mention.value}`
continue
}
resp.items.push({
type: 1,
content: `${mention.denotationChar}${mention.value}`
})
continue
}
// 图片
if (insert && insert.image) {
resp.items.push({
type: 3,
content: insert.image
})
continue
}
// 表情
if (insert && insert.emoji) {
const { emoji } = insert
if (node && node.type == 1) {
node.content = node.content + emoji.alt
continue
}
resp.items.push({
type: 1,
content: emoji.alt
})
continue
}
if (insert && insert.quote) {
resp.quoteId = insert.quote.id
continue
}
}
// 去除前后多余空格
if (resp.items.length) {
if (resp.items[0].type == 1) {
resp.items[0].content = removeLeadingNewlines(resp.items[0].content)
}
if (resp.items[resp.items.length - 1].type == 1) {
resp.items[resp.items.length - 1].content = removeTrailingNewlines(
resp.items[resp.items.length - 1].content
)
}
}
if (resp.items.length > 1) {
resp.msgType = 12
}
if (resp.items.length == 1) {
resp.msgType = resp.items[0].type
}
resp.mentionUids = resp.mentions.map((item) => item.atid)
return resp
}
export function deltaToString(delta: Delta): string {
let content = ''
for (const o of delta.ops) {
const insert: any = o.insert
if (typeof insert === 'string') {
if (!insert || insert == '\n') continue
content += insert
continue
}
// @好友
if (insert && insert.mention) {
const { mention } = insert
content += ` ${mention.denotationChar}${mention.value} `
continue
}
// 图片
if (insert && insert.image) {
content += '[图片]'
continue
}
// 表情
if (insert && insert.emoji) {
content += insert.emoji.alt
continue
}
}
return content
}
export function isEmptyDelta(delta: Delta): boolean {
return delta.ops.length == 1 && delta.ops[0].insert == '\n'
}