說明:本文原載於圖靈社區網站,本次轉載時爲方便閱讀,並修改個別用語。shell
Markdown 的目標是實現「易讀易寫」。瀏覽器
不過最須要強調的即是它的可讀性。一份使用 Markdown 格式撰寫的文檔應該能夠直接以純文本發佈,而且看起來不會像是由許多標籤或是格式指令所構成。Markdown 語法受到一些既有 text-to-HTML 格式的影響,包括 [Setext] [1]、[atx] [2]、[Textile] [3]、[reStructuredText] [4]、[Grutatext] [5] 和 [EtText] [6],然而最大靈感來源實際上是純文本的電子郵件格式。markdown
所以 Markdown 的語法全由標點符號所組成,並通過嚴謹慎選,是爲了讓它們看起來就像所要表達的意思。像是在文字兩旁加上星號,看起來就像*強調*。Markdown 的列表看起來,嗯,就是列表。假如你用過電子郵件,區塊引言看起來就真的像是引用一段文字。網絡
Markdown 的語法有個主要的目的:用來做爲一種網絡內容的寫做用語言。app
Markdown 不是要來取代 HTML,甚至也沒有要和它類似,它的語法種類很少,只和 HTML 的一部分有關係,重點不是要創造一種更容易寫做 HTML 文檔的語法,我認爲 HTML 已經很容易寫了,Markdown 的重點在於,它能讓文檔更容易閱讀、編寫。HTML 是一種發佈的格式,Markdown 是一種編寫的格式,所以,Markdown 的格式語法只涵蓋純文本能夠涵蓋的範圍。編輯器
不在 Markdown 涵蓋範圍以外的標籤,均可以直接在文檔裏面用 HTML 撰寫。不須要額外標註這是 HTML 或是 Markdown;只要直接加標籤就能夠了。ide
只有區塊元素──好比 <div>
、<table>
、<pre>
、<p>
等標籤,必需在先後加上空白,以利與內容區隔。並且這些(元素)的開始與結尾標籤,不能夠用 tab 或是空白來縮排。Markdown 的產生器有智能判斷,能夠避免在區塊標籤先後加上沒有必要的 <p>
標籤。網站
舉例來講,在 Markdown 文檔里加上一段 HTML 表格:ui
This is a regular paragraph. <table> <tr> <td>Foo</td> </tr> </table> This is another regular paragraph.
請注意,Markdown 語法在 HTML 區塊標籤中將不會被進行處理。例如,沒法在 HTML 區塊內使用 Markdown 形式的*強調*
。this
HTML 的區段標籤如 <span>
、<cite>
、<del>
則不受限制,能夠在 Markdown 的段落、列表或是標題裏任意使用。依照我的習慣,甚至能夠不用Markdown 格式,而採用 HTML 標籤來格式化。舉例說明:若是比較喜歡 HTML 的 <a>
或 <img>
標籤,能夠直接使用這些標籤,而不用 Markdown 提供的連接或是圖片標示語法。
HTML 區段標籤和區塊標籤不一樣,在區段標籤的範圍內, Markdown 的語法是有效的。
在 HTML 文檔中,有兩個字符須要特殊處理: <
和 &
。 <
符號用於起始標籤,&
符號則用於標記 HTML 實體,若是隻是想要使用這些符號,必需要使用實體的形式,像是 <
和 &
。
&
符號其實很讓寫做網絡文檔的人很困擾,若是要輸入「AT&T」 ,必需要寫成「AT&T
」 ,還得轉換網址內的 &
符號,若是要連接到:
http://images.google.com/images?num=30&q=larry+bird
必需要把網址轉成:
http://images.google.com/images?num=30&q=larry+bird
才能放到連接標籤的 href
屬性裏。不用說也知道這很容易忘記,這也多是 HTML 標準檢查所檢查到的錯誤中,數量最多的。
Markdown 容許直接使用這些符號,可是要當心轉義字符的使用,若是是在HTML 實體中使用 &
符號的話,它不會被轉換,而在其它情形下,它則會被轉換成 &
。因此若是要在文檔中插入一個著做權的符號,能夠這樣寫:
©
Markdown 將不會對這段文字作修改,可是若是這樣寫:
AT&T
Markdown 就會將它轉爲:
AT&T
相似的情況也會發生在 <
符號上,由於 Markdown 支持 行內 HTML ,若是是使用 <
符號做爲 HTML 標籤使用,那 Markdown 也不會對它作任何轉換,可是若是是寫:
4 < 5
Markdown 將會把它轉換爲:
4 < 5
不過須要注意的是,code 範圍內,不管是行內仍是區塊, <
和 &
兩個符號都必定會被轉換成 HTML 實體,這項特性讓你能夠很容易地用 Markdown 寫 HTML code (和 HTML 相對而言, HTML 語法中,要把全部的 <
和 &
都轉換爲 HTML 實體,才能在 HTML 文檔裏面寫出 HTML code。)
一個段落是由一個以上相鏈接的行句組成,而一個以上的空行則會切分出不一樣的段落(空行的定義是顯示上看起來像是空行,便會被視爲空行。比方說,若某一行只包含空白和 tab,則該行也會被視爲空行),通常的段落不須要用空白或斷行縮排。
「一個以上相鏈接的行句組成」這句話其實暗示了 Markdown 容許段落內的強迫斷行,這個特性和其餘大部分的 text-to-HTML 格式不同(包括 MovableType 的「Convert Line Breaks」選項),其它的格式會把每一個斷行都轉成 <br />
標籤。
若是真的想要插入 <br />
標籤,在行尾加上兩個以上的空白,而後按 enter。
是的,這確實須要花比較多功夫來插入 <br />
,可是「每一個換行都轉換爲 <br />
」的方法在 Markdown 中並不適合, Markdown 中 email 式的 區塊引言 和多段落的 列表 在使用換行來排版的時候,不但更好用,還更好閱讀。
Markdown 支持兩種標題的語法,[Setext] [1] 和 [atx] [2] 形式。
Setext 形式是用底線的形式,利用 =
(一級標題)和 -
(二級標題),例如:
This is an H1 ============= This is an H2 -------------
任何數量的 =
和 -
均可以有效果。
Atx 形式則是在行首插入 1 到 6 個 #
,對應到標題 1 到 6 級,例如:
# This is an H1 ## This is an H2 ###### This is an H6
能夠選擇性地「關閉」atx 樣式的標題,這純粹只是美觀用的,如果以爲這樣看起來比較溫馨,就能夠在行尾加上 #
,而行尾的 #
數量也不用和開頭同樣(行首的井字數量決定標題的級別):
# This is an H1 # ## This is an H2 ## ### This is an H3 ######
Markdown 使用 email 形式的區塊引言,若是你很熟悉如何在 email 信件中引用,就知道怎麼在 Markdown 文檔中創建一個區塊引言,那會看起來像是強迫斷行,而後在每行的最前面加上 >
:
> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, > consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. > Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. > > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse > id sem consectetuer libero luctus adipiscing.
Markdown 也容許只在整個段落的第一行最前面加上 >
:
> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse id sem consectetuer libero luctus adipiscing.
區塊引言能夠有級別(例如:引言內的引言),只要根據級別加上不一樣數量的 >
:
> This is the first level of quoting. > > > This is nested blockquote. > > Back to the first level.
引言的區塊內也可使用其餘的 Markdown 語法,包括標題、列表、程序代碼區塊等:
> ## This is a header. > > 1. This is the first list item. > 2. This is the second list item. > > Here's some example code: > > return shell_exec("echo $input | $markdown_script");
任何標準的文本編輯器都能簡單地創建 email 樣式的引言,例如 BBEdit ,能夠選擇文字後,從菜單中選擇增長引言級別。
Markdown 支持有序列表和無序列表。
無序列表使用星號、加號或是減號做爲列表標記:
Red
Green
Blue
等同於:
Red
Green
Blue
也等同於:
Red
Green
Blue
有序列表則使用數字接着一個英文句點:
Bird
McHale
Parish
很重要的一點是,在列表標記上使用的數字並不會影響輸出的 HTML 結果,上面的列表所產生的 HTML 標記爲:
<ol> <li>Bird</li> <li>McHale</li> <li>Parish</li> </ol>
若是你的列表標記寫成:
Bird
McHale
Parish
或甚至是:
Bird
McHale
Parish
都會獲得徹底相同的 HTML 輸出。重點在於,你可讓 Markdown 文檔的列表數字和輸出的結果相同,或是懶一點,能夠徹底不用在乎數字的正確性。
若是使用懶惰的寫法,建議第一個項目最好仍是從 1. 開始,由於 Markdown 將來可能會支持有序列表的 start 屬性。
列表項目標記一般是放在最左邊,可是其實也能夠縮排,最多三個空白,項目標記後面則必定要接着至少一個空白或 tab。
要讓列表看起來更漂亮,能夠把內容用固定的縮排整理好:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
Suspendisse id sem consectetuer libero luctus adipiscing.
可是若是你很懶,那也不必定須要:
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,
nec, fringilla in, laoreet vitae, risus.
Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
Suspendisse id sem consectetuer libero luctus adipiscing.
若是列表項目間用空行分開, Markdown 會把項目的內容在輸出時用 <p>
標籤包起來,舉例來講:
Bird
Magic
會被轉換爲:
<ul> <li>Bird</li> <li>Magic</li> </ul>
可是這個:
Bird
Magic
會被轉換爲:
<ul> <li><p>Bird</p></li> <li><p>Magic</p></li> </ul>
列表項目能夠包含多個段落,每一個項目下的段落都必須縮排 4 個空白或是一個 tab :
This is a list item with two paragraphs. Lorem ipsum dolor
sit amet, consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
Suspendisse id sem consectetuer libero luctus adipiscing.
若是每行都有縮排,看起來會看好不少,固然,再次地,若是你很懶惰,Markdown 也容許:
This is a list item with two paragraphs.
This is the second paragraph in the list item. You're
required to indent the first line. Lorem ipsum dolor
amet, consectetuer adipiscing elit.
Another item in the same list.
若是要在列表項目內放進引言,那 >
就須要縮排:
A list item with a blockquote:
> This is a blockquote > inside a list item.
若是要放程序代碼區塊的話,該區塊就須要縮排兩次,也就是 8 個空白或是兩個 tab:
A list item with a code block:
<code goes here>
固然,項目列表極可能會不當心產生,像是下面這樣的寫法:
What a great season.
換句話說,也就是在行首出現數字-句點-空白,要避免這樣的情況,能夠在句點前面加上反斜槓。
1986\. What a great season.
和程序相關的寫做或是標籤語言原始代碼一般會有已經排版好的程序代碼區塊,一般這些區塊咱們並不但願它以通常段落文檔的方式去排版,而是照原來的樣子顯示,Markdown 會用 <pre>
和 <code>
標籤來把程序代碼區塊包起來。
要在 Markdown 中創建程序代碼區塊很簡單,只要簡單地縮排 4 個空白或是 1 個 tab 就能夠,例如,下面的輸入:
This is a normal paragraph: This is a code block.
Markdown 會轉換成:
<p>This is a normal paragraph:</p> <pre><code>This is a code block. </code></pre>
這個每行一級的縮排(4 個空白或是 1 個 tab),都會被移除,例如:
Here is an example of AppleScript: tell application "Foo" beep end tell
會被轉換爲:
<p>Here is an example of AppleScript:</p> <pre><code>tell application "Foo" beep end tell </code></pre>
一個程序代碼區塊會一直持續到沒有縮排的那一行(或是文檔結尾)。
在程序代碼區塊裏面, &
、 <
和 >
會自動轉成 HTML 實體,這樣的方式讓你很是容易使用 Markdown 插入範例用的 HTML 原始代碼,只須要複製貼上,再加上縮排就能夠了,剩下的 Markdown 都會幫你處理,例如:
<div class="footer"> © 2004 Foo Corporation </div>
會被轉換爲:
<pre><code><div class="footer"> &copy; 2004 Foo Corporation </div> </code></pre>
程序代碼區塊中,通常的 Markdown 語法不會被轉換,像是星號便只是星號,這表示你能夠很容易地以 Markdown 語法撰寫 Markdown 語法相關的文檔。
你能夠在一行中用三個或以上的星號、減號、底線來創建一個分隔線,行內不能有其餘東西。你也能夠在星號中間插入空白。下面每種寫法均可以創建分隔線:
*
-
Markdown 支持兩種形式的連接語法: 行內和參考兩種形式。
無論是哪種,連接的文字都是用 [方括號] 來標記。
要創建一個行內形式的連接,只要在方塊括號後面立刻接着括號並插入網址連接便可,若是你還想要加上連接的 title 文字,只要在網址後面,用雙引號把 title 文字包起來便可,例如:
This is [an example](http://example.com/ "Title") inline link. [This link](http://example.net/) has no title attribute.
會產生:
<p>This is <a href="http://example.com/" title="Title"> an example</a> inline link.</p> <p><a href="http://example.net/">This link</a> has no title attribute.</p>
若是是要連接到一樣主機的資源,可使用相對路徑:
See my [About](/about/) page for details.
參考形式的連接使用另一個方括號接在連接文字的括號後面,而在第二個方括號裏面要填入用以辨識連接的標籤:
This is [an example][id] reference-style link.
也能夠選擇性地在兩個方括號中間加上空白:
This is [an example] [id] reference-style link.
接着,在文檔的任意處,能夠把這個標籤的連接內容定義出來:
[id]: http://example.com/ "Optional Title Here"
連接定義的形式爲:
方括號,裏面輸入連接的辨識用標籤
接着一個冒號
接着一個以上的空白或 tab
接着連接的網址
選擇性地接着 title 內容,能夠用單引號、雙引號或是括號包着
下面這三種連接的定義都是相同:
[foo]: http://example.com/ "Optional Title Here" [foo]: http://example.com/ 'Optional Title Here' [foo]: http://example.com/ (Optional Title Here)
請注意:有一個已知的問題是 Markdown.pl 1.0.1 會忽略單引號包起來的連接 title。
連接網址也能夠用方括號包起來:
[id]: <http://example.com/> "Optional Title Here"
你也能夠把 title 屬性放到下一行,也能夠加一些縮排,網址太長的話,這樣會比較好看:
[id]: http://example.com/longish/path/to/resource/here "Optional Title Here"
網址定義只有在產生連接的時候用到,並不會直接出如今文檔之中。
連接辨識標籤能夠有字母、數字、空白和標點符號,可是並不區分大小寫,所以下面兩個連接是同樣的:
[link text][a] [link text][A]
默認的連接標籤功能讓你能夠省略指定連接標籤,這種情形下,連接標籤和連接文字會視爲相同,要用默認連接標籤只要在連接文字後面加上一個空的方括號,若是要讓 "Google" 連接到 google.com,能夠簡化成:
[Google][]
而後定義連接內容:
[Google]: http://google.com/
因爲連接文字可能包含空白,因此這種簡化的標籤內也能夠包含多個文字:
Visit [Daring Fireball][] for more information.
而後接着定義連接:
[Daring Fireball]: http://daringfireball.net/
連接的定義能夠放在文檔中的任何一個地方,我比較偏好直接放在連接出現段落的後面,也能夠把它放在文檔最後面,就像是批註同樣。
下面是一個參考式連接的範例:
I get 10 times more traffic from [Google] [1] than from [Yahoo] [2] or [MSN] [3]. [1]: http://google.com/ "Google" [2]: http://search.yahoo.com/ "Yahoo Search" [3]: http://search.msn.com/ "MSN Search"
若是改爲用連接名稱的方式寫:
I get 10 times more traffic from [Google][] than from [Yahoo][] or [MSN][]. [google]: http://google.com/ "Google" [yahoo]: http://search.yahoo.com/ "Yahoo Search" [msn]: http://search.msn.com/ "MSN Search"
上面兩種寫法都會產生下面的 HTML。
<p>I get 10 times more traffic from <a href="http://google.com/" title="Google">Google</a> than from <a href="http://search.yahoo.com/" title="Yahoo Search">Yahoo</a> or <a href="http://search.msn.com/" title="MSN Search">MSN</a>.</p>
下面是用行內形式寫的一樣一段內容的 Markdown 文檔,提供做爲比較之用:
I get 10 times more traffic from [Google](http://google.com/ "Google") than from [Yahoo](http://search.yahoo.com/ "Yahoo Search") or [MSN](http://search.msn.com/ "MSN Search").
參考式的連接其實重點不在於它比較好寫,而是它比較好讀,比較一下上面的範例,使用參考式的文章自己只有 81 個字符,可是用行內形式的連接卻會增長到 176 個字符,若是是用純 HTML 格式來寫,會有 234 個字符,在 HTML 格式中,標籤比文字還要多。
使用 Markdown 的參考式連接,可讓文檔更像是瀏覽器最後產生的結果,把一些標記相關的信息移到段落文字以外,這樣增長連接,文章的閱讀感也不會被打斷。
Markdown 使用星號(*
)和底線(_
)做爲標記強調字詞的符號,被 *
或 _
包圍的字詞會被轉成用 <em>
標籤包圍,用兩個 *
或 _
包起來的話,則會被轉成 <strong>
,例如:
*single asterisks* _single underscores_ **double asterisks** __double underscores__
會轉成:
<em>single asterisks</em> <em>single underscores</em> <strong>double asterisks</strong> <strong>double underscores</strong>
你能夠隨便用你喜歡的樣式,惟一的限制是,用什麼符號開啓標籤,就要用什麼符號結束。
強調也能夠直接差在文字中間:
un*frigging*believable
可是若是 *
和 _
兩邊都有空白的話,它們就只會被當成普通的符號。
若是要在文字先後直接插入普通的星號或底線,能夠用反斜槓:
\*this text is surrounded by literal asterisks\*
若是要標記一小段行內程序代碼,能夠用反引號把它包起來( `
),例如:
Use the `printf()` function.
會產生:
<p>Use the <code>printf()</code> function.</p>
若是要在程序代碼區段內插入反引號,能夠用多個反引號來開啓和結束程序代碼區段:
``There is a literal backtick (`) here.``
這段語法會產生:
<p><code>There is a literal backtick (`) here.</code></p>
程序代碼區段的起始和結束端均可以放入一個空白,起始端後面一個,結束端前面一個,這樣就能夠在區段的一開始就插入反引號:
A single backtick in a code span: `` ` `` A backtick-delimited string in a code span: `` `foo` ``
會產生:
<p>A single backtick in a code span: <code>`</code></p> <p>A backtick-delimited string in a code span: <code>`foo`</code></p>
在程序代碼區段內,&
和方括號都會被轉成 HTML 實體,這樣會比較容易插入 HTML 原始代碼,Markdown 會把下面這段:
Please don't use any `<blink>` tags.
轉爲:
<p>Please don't use any <code><blink></code> tags.</p>
也能夠這樣寫:
`—` is the decimal-encoded equivalent of `—`.
以產生:
<p><code>&#8212;</code> is the decimal-encoded equivalent of <code>&mdash;</code>.</p>
很明顯地,要在純文本應用中設計一個 「天然」的語法來插入圖片是有必定難度的。
Markdown 使用一種和連接很類似的語法來標記圖片,一樣也容許兩種樣式: 行內和參考。
行內圖片的語法看起來像是:
 
詳細敘述以下:
一個驚歎號 !
接着一個方括號,裏面放上圖片的替換文字
接着一個普通括號,裏面放上圖片的網址,最後還能夠用引號包住並加上
選擇性的 'title' 文字。
參考式的圖片語法則長得像這樣:
![Alt text][id]
「id」是圖片參考的名稱,圖片參考的定義方式則和連接參考同樣:
[id]: url/to/image "Optional title attribute"
到目前爲止, Markdown 尚未辦法指定圖片的寬高,若是須要的話,可使用普通的 <img>
標籤。
Markdown 支持比較簡短的自動連接形式來處理網址和電子郵件信箱,只要是用方括號包起來, Markdown 就會自動把它轉成連接,連接的文字就和連接位置同樣,例如:
<http://example.com/>
Markdown 會轉爲:
<a href="http://example.com/">http://example.com/</a>
自動的郵件連接也很相似,只是 Markdown 會先作一個編碼轉換的過程,把文字字符轉成 16 進位碼的 HTML 實體,這樣的格式能夠混淆一些很差的信箱地址收集機器人,例如:
<address@example.com>
Markdown 會轉成:
<a href="mailto:addre ss@example.co m">address@exa mple.com</a>
在瀏覽器裏面,這段字符串會變成一個能夠點擊的「address@example.com」連接。
(這種做法雖然能夠混淆很多的機器人,但並沒有法所有擋下來,不過這樣也比什麼都不作好些。不管如何,公開你的信箱終究會引來廣告信件的。)
<h3 id="backslash">轉義字符</h3>
Markdown 能夠利用反斜槓來插入一些在語法中有其它意義的符號,例如:若是想要用星號加在文字旁邊的方式來作出強調效果(但不用 <em>
標籤),能夠在星號的前面加上反斜槓:
\*literal asterisks\*
Markdown 支持在下面這些符號前面加上反斜槓來幫助插入普通的符號:
\ 反斜槓 ` 反引號 * 星號 _ 底線 {} 大括號 [] 方括號 () 括號 # 井字號 + 加號 - 減號 . 英文句點 ! 驚歎號