把貼上來的髒 HTML(尤其 Word Safari)轉成乾淨、可控的內容 - daniel-qa/Vue GitHub Wiki

現代寫法核心思路

👉 不再用「整串 regex 處理 HTML」
👉 改成「AST / DOM pipeline」
👉 regex = hack
👉 DOMParser = engineering
👉 AST = architecture

✨ 範例(重構 normalizeSpacing)

function normalizeSpacing(html) {
  const parser = new DOMParser()
  const doc = parser.parseFromString(html, 'text/html')

  // 1️⃣ 移除 Word VML / 垃圾註解
  removeComments(doc)

  // 2️⃣ 處理 mso-spacerun
  doc.querySelectorAll('[style*="mso-spacerun"]').forEach(el => {
    if (!el.textContent.trim()) {
      el.remove()
    } else {
      el.textContent = el.textContent.replace(/\r?\n/g, '')
    }
  })

  // 3️⃣ 移除 <o:p>
  doc.querySelectorAll('o\\:p').forEach(el => {
    if (!el.textContent.trim() || el.innerHTML === '&nbsp;') {
      el.remove()
    }
  })

  // 4️⃣ 修正空白(保留 visually correct)
  fixSpaces(doc.body)

  // 5️⃣ 移除多餘空白節點
  removeWhitespaceNodes(doc.body)

  return doc.body.innerHTML
}
⚠️ **GitHub.com Fallback** ⚠️