三個步驟把 Markdown 轉成 HTML

重點摘要
  • 你拿到的是語意化片段:只有標籤,沒有 class、沒有 CSS、沒有 <head>
  • 可以複製進 CMS 的 HTML 區塊,或下載成 .html 檔。
  • 由 marked.js 解析、DOMPurify 淨化,兩者都在你的分頁裡執行。
  • GitHub 風格 Markdown 以外的語法,會原樣變成純文字。

輸出框已經有內容了,工具的部分就完成了。接下來要說的是:那些標籤代表什麼、為什麼有些語法被忽略,以及這段標記最後該貼到哪裡。

從 Markdown 到標記的三個步驟

  1. 把 Markdown 貼進輸入框。來源可以是 GitHub 的 README、Obsidian 或 Notion 筆記、AI 聊天的回答,或你當場打的字。整份文件沒問題,只想確認一小段語法也沒問題。
  2. 在輸出框讀 HTML。結果會立刻出現,每個結構元素獨立成行,方便你掃過去檢查。在左邊改 Markdown,右邊的標籤跟著變,這是搞懂每個符號會產生什麼的最快方法。
  3. 複製或下載結果。「複製」把原始碼放進剪貼簿,可以貼進 CMS 區塊、電子報範本或靜態網站;「下載」則存成 .html 檔,任何瀏覽器都打得開。

在你分頁裡跑的東西

幕後有兩個函式庫在工作:marked.js 負責解析 Markdown,DOMPurify 負責淨化結果,兩者都是這個頁面載入的一般 JavaScript。

全程沒有任何資料傳到伺服器,所以尚未發佈的文章、公司內部文件、客戶專案都可以放心貼上。想讓寫作和轉換在同一個地方完成?首頁的免費 Markdown 編輯器有即時預覽和同樣的匯出按鈕。

插圖:純文字的 Markdown 符號穿過轉換器,變成整齊巢狀的 HTML 標籤

實例:Markdown 進去,HTML 出來

實際跑一次,勝過再多的抽象說明。下面是一段用 Markdown 寫的版本更新說明,就是你會貼進輸入框的樣子:

# Release Notes

We shipped **dark mode** and fixed the *export* bug.

- Faster preview
- Smaller bundle

See the [changelog](https://example.com/changelog).

> Upgrade before 1 March.

另一端出來的東西

九行 Markdown 變成十一行標記,沒有多加東西,也沒有任何裝飾:

<h1>Release Notes</h1>
<p>We shipped <strong>dark mode</strong> and fixed the <em>export</em> bug.</p>
<ul>
<li>Faster preview</li>
<li>Smaller bundle</li>
</ul>
<p>See the <a href="https://example.com/changelog">changelog</a>.</p>
<blockquote>
<p>Upgrade before 1 March.</p>
</blockquote>

三個值得注意的細節

再看一次那段輸出,有三件事是刻意做成這樣的:

  • 沒有 class、沒有行內樣式、沒有多餘的 div。這是最精簡的語意化標記,也正是 CMS 或版型範本最想收到的東西。
  • 引用區塊裡包了一層 <p>,而不是裸文字。這是符合規範的正確寫法,任何標準解析器都會這樣產出。
  • 清單是乾淨的 <ul> 帶兩個 <li>中間沒有多餘空白,也沒有硬塞進來的空段落。

所謂「乾淨的 HTML」就是這個意思:標記只承載結構,外觀交給你自己的 CSS 決定。還在猶豫該用哪一種格式寫作?Markdown 與 HTML 比較把取捨完整攤開來談。

每個 Markdown 元素會變成什麼 HTML

語言裡的每個結構都對應到特定標籤。把這張表放在手邊,你在按下轉換之前就能預測輸出:

你寫的 Markdown產生的 HTML說明
# 標題<h1>標題</h1>一到六個 # 分別對應 <h1><h6>
空行隔開的文字區塊<p>…</p>段落的分隔靠空行,單純換行不算
**粗體**<strong>粗體</strong>__粗體__ 產生相同標籤
*斜體*<em>斜體</em>底線也可以,但字中間無效
~~刪除線~~<del>刪除線</del>GitHub 風格 Markdown 的擴充語法
- 項目<ul><li>項目</li></ul>*+ 同樣可以當項目符號
1. 項目<ol><li>項目</li></ol>從 3 開始編號會加上 start="3"
[文字](網址)<a href="網址">文字</a>括號內加引號標題會變成 title 屬性
![替代文字](pic.jpg)<img src="pic.jpg" alt="替代文字">沒有寬高參數,需要就改寫成 HTML 標籤
`程式碼`<code>程式碼</code>裡面的角括號會自動跳脫
標註語言的圍籬程式碼區塊<pre><code class="language-js">語言標記會變成 class,供語法高亮套件使用
> 引言<blockquote><p>引言</p></blockquote>規範要求內層必須包段落
管線符號表格<table><thead><tbody>對齊用的冒號會變成 style="text-align:…"
- [ ] 待辦<li><input type="checkbox" disabled>GFM 待辦清單,核取方塊會顯示但不能點
獨立一行的 ---<hr>三個以上的減號、星號或底線都可以
行尾兩個空白再換行<br>GFM 裡行尾加反斜線效果相同
原始碼中的內嵌 HTML原樣通過,再經過淨化安全標籤會保留,script 與事件屬性會被移除

整個語言差不多就這麼大

十七列幾乎就是全部的詞彙量,這也是為什麼一個下午就能學會 Markdown。Markdown 語法速查表是這張表的可列印版本。

想看每一列背後的細節,完整 Markdown 指南逐一深入每個元素,表格指南則專門處理最容易出錯的那一項。

哪些東西轉不乾淨,該怎麼處理

誠實的工具會告訴你界線在哪裡。以下五件事最常讓人意外,而且每一件都有簡短的解法。

你拿到的是片段,不是完成的網頁

  • 輸出沒有任何樣式。你拿到的是 <h1><p>,不是字體、顏色或間距。這是刻意的,因為外觀應該由 CMS 或網站版型的 CSS 決定。
  • 沒有網頁外殼。沒有 <!DOCTYPE html>、沒有 <head>、沒有編碼宣告,因為那些屬於你要貼進去的那個頁面。

真的需要獨立檔案?把輸出貼進一份最小範本的 <body> 之間,並記得加上 <meta charset="utf-8">,漏掉這一行正是中文變成亂碼最常見的原因。更快的做法是用編輯器.html 匯出,它會把同樣的標記包進一份附帶樣式表的完整文件。

轉換器會改動或丟掉的三件事

  • 相對路徑仍然是相對路徑。![圖表](img/q3.png) 會變成 src="img/q3.png",它相對於 HTML 最後存放的位置解析,而不是你原本的資料夾。標記要搬家的話,轉換前先改成絕對網址。
  • 不安全的內嵌 HTML 會被移除。DOMPurify 會清掉 <script>onclick 之類的事件屬性,以及 javascript: 開頭的網址。影片用的 <iframe> 也可能依淨化設定被拿掉。
  • 非 GFM 的語法不會生效。某些方言的註腳、定義清單、Pandoc 的 ::: 區塊、數學式,都會原封不動變成純文字。

最後一項要補一句說明,因為預覽看起來好像跟它矛盾。預覽窗格確實會替標了語言代碼的圍欄上色、用 KaTeX 排版 $數學式$、把 mermaid 圍欄畫成圖表,但這三項都是轉換完成之後、只加在預覽上的顯示強化。輸出框裡的 HTML 是轉換本身的結果,所以公式貼進 CMS 之後,仍然是錢字號加文字。

這裡對齊的範圍是 GitHub 風格 Markdown,所以 GFM 指南就是「哪些語法會生效」的權威清單。至於為什麼會冒出這麼多互相競爭的方言,什麼是 Markdown 說了這段來龍去脈。

小提醒:影片嵌入碼和追蹤程式碼建議貼進 CMS 之後再補,不要寫在 Markdown 裡。這樣它們不會被淨化掉,你的原始檔也保持乾淨好搬。

轉出來的 HTML 最後要放到哪裡

會來到這一頁的理由其實就那幾種。先認出自己屬於哪一種,就能最快找到該按的按鈕。

四種常見的去處

  • 貼進 CMS。WordPress、Ghost、Webflow、Shopify 和多數客服系統都接受原始 HTML 區塊。轉換、複製、貼上,標題和清單就能保住結構,而不是變成一整片灰色文字。
  • 電子郵件與電子報。郵件軟體至今仍需要真正的標記。把草稿轉出來,就得到一個乾淨的起點,再交給發信工具套樣式。
  • 靜態網站與舊頁面。有時候頁面就是得是一個檔案。下載 .html 丟進專案,剩下的交給網站的樣式表。
  • 檢查語法。清單在 GitHub 上死活不肯渲染時,把同一份原始碼丟進來轉一次,馬上就知道問題出在你的 Markdown 還是那個平台。

旁邊的幾個工具

反方向,從既有標記變回純文字,是 HTML 轉 Markdown 轉換器負責的事。那個方向會流失細節,而那一頁會誠實告訴你流失了什麼。

如果目標是要寄出去的文件而不是要發佈的網頁,請改用 Markdown 轉 PDF,需要自動化路線的話就讀把 Markdown 轉成 PDF 的詳細說明。

還有兩個小幫手。Markdown 檢視器可以直接渲染別人寄來的 .md 檔,中間不隔著編輯窗格;表格產生器則幫你排好管線符號表格,不必自己數減號。

想了解轉換本身的原理,常見問題裡的如何把 Markdown 轉成 HTML 用文字說明了整個流程,常見問題總覽則收錄了其餘大家會問的題目。

相容性資料驗證日期

常見問題

這個 Markdown 轉 HTML 轉換器免費嗎?

完全免費。沒有帳號、沒有付費方案、沒有文件數量限制,輸出也不加浮水印。不管是一行片段還是上百頁的手冊,想轉幾次都可以。

我的 Markdown 會被上傳嗎?

不會。解析由 marked.js 在你的分頁內完成,結果再用 DOMPurify 在本機淨化。文字不會傳到任何伺服器,所以機密草稿可以放心使用,頁面載入後即使斷網也照常運作。

為什麼輸出的 HTML 沒有 CSS 樣式?

因為片段不該自帶設計。你拿到的是語意化標籤,外觀交給你網站的樣式表控制。想要完成品,請用編輯器.html 下載,它會把標記包成一份含樣式的完整文件。

它支援哪一種 Markdown 方言?

GitHub 風格 Markdown(GFM),所以表格、待辦清單、刪除線和圍籬程式碼區塊都能用,原始語法當然也全部支援。細節請見 GFM 指南

可以把 HTML 轉回 Markdown 嗎?

可以,用另一個工具:HTML 轉 Markdown 轉換器。但要有心理準備,那個方向會失真,因為 Markdown 無法表達 class、行內樣式或巢狀表格。

延伸閱讀

立即使用編輯器

開啟編輯器