|
|
@@ -104,13 +104,80 @@
|
|
|
form.value.content = val
|
|
|
}
|
|
|
|
|
|
+ const removeEmptyParagraphs = (html) => {
|
|
|
+ const container = document.createElement('div')
|
|
|
+ container.innerHTML = html
|
|
|
+ container.querySelectorAll('p').forEach(paragraph => {
|
|
|
+ if (!paragraph.textContent.trim() && !paragraph.querySelector('img, video, iframe, table')) {
|
|
|
+ paragraph.remove()
|
|
|
+ }
|
|
|
+ })
|
|
|
+ container.querySelectorAll('br').forEach(lineBreak => {
|
|
|
+ let nextSibling = lineBreak.nextSibling
|
|
|
+ while (nextSibling?.nodeType === Node.TEXT_NODE && !nextSibling.textContent.trim()) {
|
|
|
+ const whitespaceNode = nextSibling
|
|
|
+ nextSibling = nextSibling.nextSibling
|
|
|
+ whitespaceNode.remove()
|
|
|
+ }
|
|
|
+ while (nextSibling?.nodeName === 'BR') {
|
|
|
+ const duplicateLineBreak = nextSibling
|
|
|
+ nextSibling = nextSibling.nextSibling
|
|
|
+ duplicateLineBreak.remove()
|
|
|
+ }
|
|
|
+ })
|
|
|
+ return container.innerHTML
|
|
|
+ }
|
|
|
+
|
|
|
+ const formatEditorContent = (content) => {
|
|
|
+ const normalizedContent = String(content || '').replace(/\r\n?/g, '\n')
|
|
|
+ if (!normalizedContent) {
|
|
|
+ return normalizedContent
|
|
|
+ }
|
|
|
+
|
|
|
+ const lineBreakPattern = /\\n|\n/g
|
|
|
+ if (/<\/?[a-z][^>]*>/i.test(normalizedContent)) {
|
|
|
+ const container = document.createElement('div')
|
|
|
+ container.innerHTML = normalizedContent
|
|
|
+ const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT)
|
|
|
+ const textNodes = []
|
|
|
+
|
|
|
+ while (walker.nextNode()) {
|
|
|
+ textNodes.push(walker.currentNode)
|
|
|
+ }
|
|
|
+
|
|
|
+ textNodes.forEach(textNode => {
|
|
|
+ if (!textNode.nodeValue.trim()) return
|
|
|
+
|
|
|
+ const lines = textNode.nodeValue.split(lineBreakPattern).filter(line => line.trim())
|
|
|
+ if (lines.length === 1) return
|
|
|
+
|
|
|
+ const fragment = document.createDocumentFragment()
|
|
|
+ lines.forEach((line, index) => {
|
|
|
+ if (line) fragment.append(document.createTextNode(line))
|
|
|
+ if (index < lines.length - 1) fragment.append(document.createElement('br'))
|
|
|
+ })
|
|
|
+ textNode.replaceWith(fragment)
|
|
|
+ })
|
|
|
+
|
|
|
+ return removeEmptyParagraphs(container.innerHTML)
|
|
|
+ }
|
|
|
+
|
|
|
+ const container = document.createElement('div')
|
|
|
+ container.textContent = normalizedContent
|
|
|
+ const formattedContent = container.innerHTML
|
|
|
+ .split(lineBreakPattern)
|
|
|
+ .map(line => `<p>${line || ' '}</p>`)
|
|
|
+ .join('')
|
|
|
+ return removeEmptyParagraphs(formattedContent)
|
|
|
+ }
|
|
|
+
|
|
|
const router = useRouter();
|
|
|
let queryData = router.currentRoute.value.query
|
|
|
const getData = () => {
|
|
|
getEmailById({ id: queryData.id }).then(res => {
|
|
|
form.value.recipient = res.result.recipient
|
|
|
form.value.subject = res.result.subject
|
|
|
- form.value.content = res.result.content
|
|
|
+ form.value.content = formatEditorContent(res.result.content)
|
|
|
})
|
|
|
}
|
|
|
|