Markdown

Markdown是一種輕量級標記語言，創始人為約翰·格魯伯。它允許人們使用易讀易寫的純文本格式編寫文檔，然後轉換成有效的XHTML（或者HTML）文檔。這種語言吸收了很多在電子郵件中已有的純文本標記的特性。

由於Markdown的輕量化、易讀易寫特性，並且對於圖片、圖表都有支援，目前許多網站都廣泛使用Markdown來撰寫說明文件或是用於論壇上發表訊息。如GitHub、Reddit、Discord、Diaspora、Stack Exchange、OpenStreetMap、SourceForge、簡書等，甚至還能被用來撰寫電子書。許多大語言模型的輸出也採用了Markdown的格式以支援簡單的排版需求（如小節、粗體、數學公式等）。

## 歷史

約翰·格魯伯在2004年創造了Markdown語言，在語法上有很大一部分是跟亞倫·斯沃茨共同合作的。這個語言的目的是希望大家使用「易於閱讀、易於撰寫的純文字格式，並選擇性地轉換成有效的XHTML（或是HTML）」。

其中最重要的設計是可讀性，也就是說這個語言應該要能直接在字面上閱讀，而不用記憶格式化指令標記（像是RTF與HTML）。

因此，它是現行電子郵件標記格式的慣例，雖然它也借鑒了幾個早期的標記語言，如：、Textile (標記語言)、reStructuredText。格魯伯也編寫了的Perl腳本：Markdown.pl，用於把Markdown語法編寫的內容轉換成有效的、結構良好的XHTML或HTML內容，並將左尖括號`<`和`&`號替換成它們各自的字符實體引用。它可以用作單獨的腳本，Blosxom和Movable Type的插件又或者BBEdit的文本過濾器。Markdown也已經被其他人用Perl和別的程式語言重新實現，其中一個Perl模塊放在了CPAN(Text::Markdown)上。它基於一個BSD風格的許可證分發並可以作為幾個內容管理系統的插件。

### 標準化

Markdown已經成為典型的轉換為HTML的非正式規範和參考實現。隨著時間的推移，出現了許多Markdown實現。人們開發這些主要是由於在基本語法之上需要額外的功能 - 例如表格，腳註，定義列表（技術上的HTML描述列表）和HTML塊內的Markdown。其中一些行為偏離了最開始的參考實現。與此同時，非正式規範中的一些含糊不清引起了人們的注意。這些問題促使Markdown解析器的一些開發人員努力實現標準化。

Babelmark是一個可用於比較各種實現的輸出的工具，以促進關於如何以及是否應該闡明Markdown規範的某些模糊方面的討論。格魯伯認為不應完全標準化：「不同的網站（和人們）有不同的需求。沒有一種語法可以讓所有人滿意。」

2016年3月發布了RFC 7763和RFC 7764。RFC 7763 從原始變體引入了MIME類型 text/markdown。RFC 7764討論並註冊了MultiMarkdown、GitHub Flavored Markdown (GFM)、Pandoc、CommonMark及Markdown等變體。

從2012年開始，包括Jeff Atwood和John MacFarlane在內的一群人啟動了標準化工作。一個社區網站現在旨在記錄可用於文檔作者和開發人員的各種工具和資源，以及各種Markdown實現的實現者。2014年9月，格魯伯反對在這一工作中繼續使用「Markdown」這個名字，其被更名為CommonMark。CommonMark.org發布了規範、參考實現和測試套件的幾個版本，並計劃在2018年宣布最終的1.0規範和測試套件。

### GFM

2017年，GitHub發布了基於CommonMark的GitHub Flavored Markdown（GFM）的正式規範。除了表格、刪除線、自動連結和任務列表被GitHub規範作為擴展添加之外，它遵循CommonMark規範。GitHub還相應地更改了其站點上使用的解析器，這要求更改某些文檔 - 例如，GFM現在要求創建標題的哈希符號由空格字符分隔。

### Markdown Extra

Markdown Extra是一種輕量級標記語言，基於在PHP（最初）、Python和Ruby中實現的Markdown。它添加了普通Markdown語法不具備的功能。內容管理系統支持Markdown Extra，例如Drupal和TYPO3。

它為Markdown添加了以下功能：

- HTML塊內的Markdown標記
- 具有id / class屬性的元素
- 圍欄代碼塊
- 表格
- 定義清單
- 腳註
- 縮寫

## 示例

Markdown語法｜由Markdown處理器產生的HTML｜瀏覽器顯示效果

md # 一級標題 ## 二級標題 段落以空白行分隔。行末兩個空格 產生斷行。文本屬性：*斜體*、 **粗體**、`等寬字型Monospace`。水平線： --- 列表： * 張三 * 李四 * 王二 編號列表： 1. 不論 2. 三七 3. 二十一 [連結](http://example.com)。｜[圖](Icon-pictures.png "icon") > Markdown使用「>」字元來引用。行間HTML亦受支援。`｜一級標題 二級標題 段落以空白行分隔。行末兩個空格 產生斷行。文本屬性：斜體、粗體、`等寬字型Monospace`。水平線：列表：、張三、李四、王二 編號列表： # 不論 # 三七 # 二十一 http://example.com。 Markdown使用「>」字元來引用。行間HTML亦受支持。

```html
<h1>一級標題</h1>

<h2>二級標題</h2>

<p>段落以空白行分隔。</p>

<p>行末兩個空格<br />
產生斷行。</p>

<p>文本屬性：<em>斜體</em>。
<strong>粗體</strong>、<code>等寬字型Monospace</code>。</p>

<p>水平線：</p>

<hr />

<p>列表：</p>

<ul>
<li>張三</li>
<li>李四</li>
<li>王二</li>
</ul>

<p>編號列表：</p>

<ol>
<li>不論</li>
<li>三七</li>
<li>二十一</li>
</ol>

<p><a href="http://example.com">連結</a>。</p>

<p><img alt="圖" title="icon" src="Icon-pictures.png" /></p>

<blockquote>
<p>Markdown使用「&gt;」字元來引用。</p>
</blockquote>

<p>行間<abbr title="Hypertext Markup Language">HTML</abbr>亦受支援。</p>
```

```html
<h1>一级标题</h1>

<h2>二级标题</h2>

<p>段落以空白行分隔。</p>

<p>行末两个空格<br />
产生断行。</p>

<p>文本属性：<em>斜体</em>。
<strong>粗体</strong>、<code>等宽字体Monospace</code>。</p>

<p>水平线：</p>

<hr />

<p>列表：</p>

<ul>
<li>张三</li>
<li>李四</li>
<li>王二</li>
</ul>

<p>编号列表：</p>

<ol>
<li>不论</li>
<li>三七</li>
<li>二十一</li>
</ol>

<p><a href="http://example.com">链接</a>。</p>

<p><img alt="图" title="icon" src="Icon-pictures.png" /></p>

<blockquote>
<p>Markdown使用“&gt;”字符来引用。</p>
</blockquote>

<p>行间<abbr title="Hypertext Markup Language">HTML</abbr>亦受支持。</p>
```

## 實現

Markdown的實現可用於十幾種程式語言；此外，許多平台和框架都支持Markdown。例如，Markdown插件適用於每個主要的部落格平台。

雖然Markdown是一種最小標記語言，並且使用普通文本編輯器進行讀取和編輯，但是有專門設計的編輯器可以預覽具有樣式的文件，這些樣式可用於所有主要平台。許多通用文本和代碼編輯器都具有內置於其中的Markdown的語法高亮插件，或者可用作可選下載。編輯器可以具有並排預覽窗口或直接以所見即所得的方式呈現代碼。

- 原始碼文檔生成器Doxygen支持Markdown的額外功能。
- RStudio是一個用於R的IDE，為稱為sundown的Markdown變體提供了C++包裝函數。
- GitHub Flavored Markdown（GFM）忽略單詞中的下劃線，並添加語法高亮顯示、任務列表和表格。
- Discount – 一個C語言實現。
- MarkAPL是一個用Dyalog APL編寫的轉換器。它支持隔離塊，智能排版，連結引用和特殊屬性，並可以生成目錄。
- PHP Markdown - 一個庫包，包含PHP Markdown解析器及其有額外功能的兄弟PHP Markdown Extra。
- Markdig - 遵循CommonMark規範的.NET庫，包括一組擴展和使用者創建自己擴展的能力。
- WP Githuber MD - 一個WordPress 插件，實現了所見即所得的 Markdown 編輯器及增強語法。
- Visual Studio Code 對 Markdown 的支援度極高。
- MarkItDown - 一個Python庫，用於將各種文件轉換為Markdown，如PDF、PPT、Word等

## 外部連結

- https://daringfireball.net/projects/markdown/ for original John Gruber markup
- Markdown Guide: Tools – an independent source review of software that support Markdown

## 基本資料

- 擴展名：on
- 擴展名：`.md`, `.markdown`
- _nomimecode：on
- mime：`text/markdown`
- 統一類型標識：`net.daringfireball.markdown`
- 所有者：約翰·格魯伯（與亞倫·斯沃茨在語法上合作）
- 發行日期：2004年3月19日
- 最新版本：1.0.1
- 最新版本：2004年12月17日
- 類型：標記語言
- 擴展為：MultiMarkdown, Markdown Extra, CommonMark
- 免費在線檔案：是