Markdown 語法
紀錄 Markdown 語法,包括 GFM

Markdown 特色

易編寫

相對於 HTML 需要注意各種 tag、屬性、特殊字元,Markdown 是更容易編寫的方式,雖然無法像 HTML 那樣可以直接透過各種屬性,甚至 CSS 來達到各種效果,但純粹以書寫來說,Markdown 的功能已經相當夠用。

轉換 HTML

不過如果有需要的話,Markdown 可以用各種方式轉換成 HTML,以方便我們發布成網頁或部落格文章,網路上有相當多的程式可以達到這點;相對之下,從 HTML 轉換回 Markdown 就沒這麼方便了,主要原因就是 HTML 有相當多屬性等並不被 Markdown 支援,所以有轉換回 Markdown 的困難。

但還是有補救的辦法,在編寫 Markdown 文件的時候,其實還是可以使用 HTML 語法的,我使用過的轉換器都可以讀取 HTML 語法,並正常顯示以及轉換,所以真的有什麼 Markdown 找不到的 HTML 功能,就直接寫 HTML 吧!當然這就需要對 HTML 語法有更多認識了。

編寫/視覺

跟 HTML 一樣,在編寫 Markdown 的時候呈現的畫面,跟實際呈現的畫面其實是不一樣的。

例如我們編寫 Markdown 如下:

- ***This*** is a [sample](http://example.com/ "example.com").

實際呈現的畫面其實是這樣的:

所以在編寫 Markdown 的時候,最好找個可以隨時觀看實際畫面的編輯器來確認實際畫面。

區塊元素

換行

原則上按 Enter 鍵就是換行。

要注意的是有些轉換器會要求不同的換行字元,例如有些會要求在行尾加上兩個空白,再按 Enter 鍵,才代表換行;也有些會要求兩個空白加一個 tab 鍵等等,所以建議要找可以即時顯示畫面的編輯器,隨時確認實際畫面。

分段

Markdown 是以空白行來分段,原則上就是該行只有一個 Enter 就換行。

同樣的,要注意有些編輯器會要求不同的特殊字元來代表空白行。

標題

Markdown 支援 Setext 以及 atx 兩種形式的標題。一般都用 atx 語法,標題的階層較多,語法也比較好記。

Setex 形式

以底線的方式來表示標題,只有兩種如下:

This is an H1
=============
This is an H2
-------------

實際顯示就會變成這樣:

This is an H1

This is an H2

atx 形式

在標題前面加上 1 到 6 個 #,剛好對應到 HTML 的 h1h6,如:

# This is an H1
## This is an H2
### This is an H3

實際呈現:

This is an H1

This is an H2

This is an H3

若你寫完有考慮轉為 HTML 發布為網頁或部落格,確切使用標題是個好習慣。一是轉換完不用再花心思調整,只需要考慮 CSS 或 Javascript 做美化就好;二是良好的標題設定跟 SEO 優化有關。

清單

與 HTML 相同,也分為有序清單及無序清單。

有序清單

使用一個數字,加一個英文句點 .,再空一格。

注意 數字並不會影響實際畫面的排序,例如:

1.    First item
2.    Second item

實際上 Markdown 會自動排序:

  1. First item
  2. Second item

但建議還是照正常順序編排啦,自己編寫看得比較清楚,而且也不清楚什麼時候 Markdown 就改成一定要照順序排序(攤手)。

無序清單

使用 *+- 做無序清單的標記。例如:

* First item
* Second item
* Third item

會顯示成:

  • First item
  • Second item
  • Third item

巢狀清單

不論是有序還是無序清單,都可以使用縮排 tab 鍵來做出巢狀的清單。例如:

* First item
	* Second item
		* Third item

會顯示成:

  • First item
    • Second item
      • Third item

區塊引言

使用 > 來標記區塊引言。例如:

> This is a blockquote paragraph.

就會顯示成:

This is a blockquote paragraph.

區塊引言也可以巢狀分層,例如:

> This is a blockquote sentence 1.

> > This is a blockquote sentence 2.

會顯示成:

This is a blockquote sentence 1.

This is a blockquote sentence 2.

區塊引言也可以只在一個「段落」的第一行加入 > 標記區塊,記得「段落」是要以「空白行」做為區隔。

另外區塊內也支援 Markdown 語法。例如:

> *This* is a blockquote paragraph 1 sentence 1.
**This** is a blockquote paragraph 1 ***sentence 2***.
This is a blockquote paragraph 1 sentence 3.

> > - [ ] This is a blockquote paragraph 2 sentence 1.

會顯示成:

This is a blockquote paragraph 1 sentence 1.
This is a blockquote paragraph 1 sentence 2.
This is a blockquote paragraph 1 sentence 3.

  • This is a blockquote paragraph 2 sentence 2.

但注意區塊引言內常常會自動加上斜體屬性,所以強調的三種狀態在區塊引言內其實只會剩粗體一種。

程式碼區塊

在程式碼區塊內,Markdown 語法並不會被轉換,所以可以如實呈現實際寫的 Markdown 語法內容。若是其他種程式語言的程式碼,則會有限度的辨識,並標記出有支援的語法,這部分目前有很多擴充,容後再敘。

當然以 Markdown 語法要做程式碼區塊,有幾種辦法,一是用 ``` 將整段程式碼包起來,一是在開頭用縮排 tab鍵來做標記,直到沒有縮排的一行空白行為止。

例如:

```
This is a code block.
```

呈現起來會是這樣:

This is a code block.

分隔線

在同一行用三個以上的 *-_ 可以組成一個分隔線,同一行不可以有其他的文字或標記,但在三個 *-_中間可以插入空白。

以下幾種方式都可以組成分隔線:

- - -  
* * *  
______ ______ ______

都會顯示成同一種分隔線:


區段元素

連結

Markdown 的連結有兩種方式,一是行內,一是參考。兩種都是用 [] 來標記要形成超連結的文字。

行內連結

行內連結是用 [] 將文字包起來後,再加上 (),並在小括號內加上連結網址即可。若想幫連結加上標題,也就是滑鼠移動到連結文字上會顯示的標題,在小括號內的連結網址後,空一格,用 " 將標題文字包起來即可。

例如:

This is a [sample](http://example.com/ "example.com").

就會呈現為:

This is a sample.

參考連結

若你的文章內有多處要連結到同一個網址連結,則用參考連結是較好的方式。

參考連結一樣是用 [] 將文字包起來,後面再用一次 [] 將用來辨識連結的標籤包起來。例如:

Let me [Google][0] that for you.

同樣會呈現為:

Let me Google that for you.

然後在文件的任意處,對,「任意處」,放上標籤內的連結內容定義,例如:

[0]: http://www.google.com/ "Google"

但很抱歉,這個參考連結的內容定義並不會實際呈現出來,想檢查正確與否,就是直接點超連結的文字來測試。

而連結的內容定義,有一定的語法,所以有以下幾點需要注意:

  • [] 內輸入連結的辨識標籤,可以是字母、數字、空白和標點符號,但並無大小寫區分
  • [] 後必須接一個 :,再接著一個以上的空白或縮排 tab
  • 空白或縮排 tab 後再接連結網址,可以選擇用 <> 將網址包起來,但非必要
  • 網址後面可以選擇性地加上連結標題,也就是滑鼠游標移到超連結文字上後會顯示的標題,須用 ''""() 包住標題

強調

將想要強調的文字用 *_ 包起來,就可以呈現三種強調的方式。例如:

***粗斜體***  
__粗體__  
*斜體*

會呈現如下:

粗斜體
粗體
斜體

程式碼

這邊跟程式碼區塊的區別,是只用來標記一小段行內程式碼,直接用 ` 將程式碼包起來即可。例如:

`This is a code.`

就會顯示為:

This is a code.

若程式碼內有需要用到 ` 這個符號,可以用多個 ` 符號來包住程式碼以作區別,例如:

A single backtick in a code span: `` ` ``  
A bakctick-delimited string in a code span: `` `foo` ``

就會顯示為:

A single backtick in a code span: `
A bakctick-delimited string in a code span: `foo`

圖片

插入圖片的 Markdown 語法跟連結非常相似,幾乎只差在需要在開頭加上一個 ! 符號。例如:

![Markdown logo](https://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Markdown-mark.svg/208px-Markdown-mark.svg.png "Markdown")

就會顯示出圖片:

Markdown logo

行內圖片的語法注意如下:

  • 須以一個 ! 開頭
  • 接著以 [] 加入替代文字,也就是圖片路徑、網址失效的時候顯示的文字
  • 再以 () 加入圖片路徑或網址
  • () 內的網址後面,只可以 ''"" 包住可以選擇加上的標題

參考圖片的語法則像這樣:

![Evernote logo][1]

參考的定義方式則與連結的參考內容定義方式一模一樣:

[1]: https://upload.wikimedia.org/wikipedia/commons/a/a4/Evernote_Icon.png "Evernote"

同樣可以顯示出圖片:

Evernote logo

其他

自動連結

Markdown 也支援比較簡短的連結形式,可以用來表達連結網址及信箱,同時也能有超連結功能,只需要用 <> 包住網址即可。例如:

<http://example.com/>

就可以顯示為:

http://example.com/

跳脫字元

前面講了很多 Markdown 的語法,使用很多符號來達成指定功能的標記,那如果只是需要在文章中加入那些符號,但並不想使用相關的功能,就需要在該符號前面加上 \ 這個符號,以達成跳脫字元的功能。

例如:

If I want to \*\*emphasize\*\* something without making it **bold**.

就會顯示為:

If I want to **emphasize** something without making it bold.

以下是 Markdown 支援能在前面加上 \ 以形成跳脫字元的符號:

\ 反斜線
` 反引號
* 星號
_ 底線
{} 大括號
[] 中括號
() 小括號
# 井字號
+ 加號
- 減號
. 英文句點
! 驚嘆號

特殊功能

前面都是介紹 Markdown 原生支援的語法,其實有很多通用的寫法也能適用在 Markdown 當中。這邊列出我找到的一些語法,但請注意使用的編輯器或轉換器的支援度。

Checkbox

語法是先用一個 -,一個空格,再加上 [ ],空格後再加上敘述。注意 [ ] 當中必須有一個空格。若需要顯示的 checkbox 已經勾選,請將 [ ] 當中的空格替換成 xX

例如:

- [ ] First box

就會顯示為:

  • First box

Table

Markdown 也支援做表格,基本上需要三個部分,標題列、設定列、內容表格。基本上都是用 | 做為分隔符號。

例如:

No.|Pokemon|神奇寶貝
:---:|:---|---:
1|Bulbasaur|妙蛙種子
2|Ivysaur|妙蛙草
3|Venusaur|妙蛙花

會顯示為:

No. Pokemon 神奇寶貝
1 Bulbasaur 妙蛙種子
2 Ivysaur 妙蛙草
3 Venusaur 妙蛙花

在畫表格的時候,有幾項注意事項:

  • 左邊界跟右邊界的框線非必要
  • 標題列必須每欄都填入欄位名稱
  • 第二列設定列,每一欄都必須填入至少一個 - 符號,並用 : 設定對齊方式。預設是靠左對齊;:- 也代表靠左對齊;-: 代表靠右對齊;:-: 則代表置中
  • 內容表格必須至少一列

支援程式碼

這邊特指的是程式碼區塊。

其實大家應該注意到前面的程式碼區塊的文字有各種顏色,其實就是 Markdown 在做辨識程式語言的工作,並試圖將跟辨識出來的語言的關鍵字做顏色標記。

如果記錄在程式碼區塊的程式碼有確切的語言,不仿試用以下的辦法,讓 Markdown 能更好的辨認程式碼,並更好地標記。

首先必須使用三個 ` 來前後包住程式碼區塊,然後在第一排 ` 的後面加上程式語言名稱。

例如:

	```java  
	public static void main(String[] args) {  
		System.out.println("Hello World!");  
	}  
	```

就可以讓 Markdown 辨識如下:

public static void main(String[] args) {
	System.out.println("Hello World!");
}

另外,利用這個辨識的功能,還能延伸為繪製一些簡單的圖表,如流程圖。

詳細語法請上網搜尋 markdownflow。這邊僅舉例:

```flow
st=>start
op=>operation: operation
con=>condition: condition
e=>end

st->op(right)->con
con(yes)->e
con(no)->op
```

Markdown 辨識後,會自動繪圖如下:

st=>start  
op=>operation: operation  
con=>condition: yes or no?  
e=>end  

st->op(right)->con  
con(yes)->e  
con(no)->op  

(很顯然 Hugo 提供的轉換器並不支援這種擴充的繪圖功能)


Last modified on 2017-10-22