一踩一個(gè)準(zhǔn)之Markdown

Markdown是一個(gè)輕量級(jí)的文本標(biāo)記語(yǔ)言,通過(guò)簡(jiǎn)單直觀的語(yǔ)法,追求編輯時(shí)的酣暢淋漓和閱讀時(shí)的美觀大方。MD設(shè)計(jì)的初衷主要為以下三點(diǎn):

  1. 純文本的文件易于保存和傳輸,跨平臺(tái)支持好;
  2. 通過(guò)一些有意義的標(biāo)記,使得純文本的閱讀也直觀明了,如**表示著重、加粗;
  3. 通過(guò)簡(jiǎn)單的語(yǔ)法標(biāo)記來(lái)輸出美觀的排版和樣式。
Markdown

MD最近越來(lái)越流行,對(duì)于程序員群體,更是近乎“標(biāo)配”。對(duì)于排版樣式要求不高的場(chǎng)景,配合合適的軟件,MD用起來(lái)的確比平時(shí)的富文本要來(lái)的酸爽!

很多人剛開(kāi)始認(rèn)識(shí)MD的時(shí)候,第一感覺(jué)估計(jì)是:寫(xiě)個(gè)文檔都這么折騰,還需要記啥語(yǔ)法,我小白一個(gè)可不大懂。好不容易鼓起勇氣嘗試,卻可能因?yàn)镸D的一些坑坑洼洼而不斷受挫。

本人重度使用MD已經(jīng)有四五年了,在這方面嘗試了很多,也總結(jié)了自己的一些經(jīng)驗(yàn)。本文將會(huì)分享一些MD方面的小知識(shí)和使用經(jīng)驗(yàn),希望能幫助大家。其中錯(cuò)漏欠缺之處,也懇請(qǐng)大家不吝斧正,互相交流。

語(yǔ)法

MD剛出來(lái)的時(shí)候,其實(shí)是作為一個(gè)實(shí)現(xiàn)上的標(biāo)準(zhǔn),而不是一個(gè)文檔的標(biāo)準(zhǔn)。因此,和其他語(yǔ)言不一樣,MD其實(shí)是沒(méi)有一個(gè)語(yǔ)法標(biāo)準(zhǔn)的。這是因?yàn)镸D是由一個(gè)程序員想出來(lái)的,然后程序員說(shuō)搞就搞,三兩下就實(shí)現(xiàn)了一個(gè)將MD轉(zhuǎn)為HTML排版的渲染引擎,然后告訴大家這就是MD。

后面大家覺(jué)得這樣的確方便,所以也自己實(shí)現(xiàn)了一個(gè)引擎。這些不同的實(shí)現(xiàn),雖然大體都差不多,但某些細(xì)小的地方就有各個(gè)作者的不同考慮。

目前,MD語(yǔ)法還是沒(méi)有一個(gè)統(tǒng)一的標(biāo)準(zhǔn),但是有一些比較流行的實(shí)現(xiàn)標(biāo)準(zhǔn),如GFMCommonMark。有人專門(mén)弄了一個(gè)在線網(wǎng)站展示各種流行渲染引擎的效果;不過(guò)網(wǎng)址一時(shí)忘了,只能有緣再見(jiàn)啦~

所以,不同的編輯器可能使用不同的渲染引擎來(lái)將MD文檔進(jìn)行渲染排版,從而可能會(huì)有不同的效果。這是MD很多坑的源頭。使用的時(shí)候,大家要留意。

軟件

支持MD的軟件很多,這里大概分為兩類吧:

  • 編輯器
  • 筆記軟件

其中,流行的MD編輯器目前有很多。顧名思義,該類軟件大概就是一個(gè)對(duì)MD語(yǔ)法有一些額外支持的文本編輯器。也可以進(jìn)一步細(xì)分為離線和在線兩種。比較流行的如MarkdownPad, StackEdit, CMD作業(yè)部落等等,這里就不一一貼鏈接了,有興趣的自行搜索一下也就“手到擒來(lái)”了。另外,也有部分程序員覺(jué)得應(yīng)該將寫(xiě)代碼和寫(xiě)筆記兩項(xiàng)運(yùn)動(dòng)結(jié)合在一起做,于是使用一些代碼編輯器來(lái)編輯MD筆記,如Vim, SublimeText, Atom等等。如果對(duì)這方面感興趣,可以參考Vim與Markdown,實(shí)現(xiàn)鍵不離手這篇文章。

MD編輯器雖然能夠提供足夠溜的編輯體驗(yàn),但是筆記管理之類的功能則稍微雞肋,一旦筆記多了以后,往往就容易讓人懷念一個(gè)普通的筆記軟件了。筆記軟件當(dāng)然也有支持MD的啦,如有道云筆記、為知筆記等等。一般這些軟件都會(huì)提供編輯和閱讀兩種模式,編輯的時(shí)候是純文本,閱讀的時(shí)候則展示渲染后的效果。這樣,既有全面的筆記管理功能,也支持MD渲染。到此,好像一切都完美了。然而,很多筆記軟件提供的編輯體驗(yàn)卻是遠(yuǎn)遠(yuǎn)落后于一些MD編輯器軟件的。

那么,問(wèn)題來(lái)了,有沒(méi)有提供一級(jí)棒的MD編輯體驗(yàn)的筆記軟件呢?還真的有:

震驚!最舒適的Markdown筆記軟件竟是它
VNote: 一個(gè)舒適的Markdown筆記軟件

VNote目前支持三種渲染引擎:Hoedown, Marked和Markdown-it。后面將會(huì)使用VNote輔助講講MD的一些具體的坑。

相對(duì)于 所見(jiàn)即所得,MD天生就是編輯和閱讀兩個(gè)樣兒。目前大多數(shù)會(huì)采用兩種方式來(lái)處理這種與生俱來(lái)的割裂感:

  1. 不聞不問(wèn)
    完全不管,類似于普通富文本編輯一樣進(jìn)行處理。
  2. 實(shí)時(shí)預(yù)覽
    將屏幕一分為二,一邊編輯,一邊預(yù)覽渲染后的效果。這種方法有以下幾點(diǎn)不好:
  • 眼珠子左右顧盼;
  • 屏幕相對(duì)變窄了;
  • 經(jīng)常需要分心將兩邊的內(nèi)容對(duì)照起來(lái)。

當(dāng)然,還有一種以Typora為代表的將MD實(shí)時(shí)渲染為富文本的做法。個(gè)人覺(jué)得,這種方法矯枉過(guò)正,和MD的設(shè)計(jì)理念背道而馳。

VNote采用相對(duì)折中的方案:

  • 通過(guò)MD語(yǔ)法高亮幫助用戶在編輯時(shí)追蹤文章脈絡(luò);
  • 編輯時(shí)實(shí)時(shí)預(yù)覽圖片;

如下是寫(xiě)這篇文章的時(shí)候,簡(jiǎn)書(shū)編輯器的一個(gè)效果:

JianShu Edit

對(duì)應(yīng)在VNote中的效果:

VNote Edit

標(biāo)題

標(biāo)題的語(yǔ)法就比較簡(jiǎn)單啦,多個(gè)#后面一個(gè)空格,然后是標(biāo)題的內(nèi)容。但是,當(dāng)標(biāo)題遇上下劃線,那么就有點(diǎn)小問(wèn)題了。

直接上圖說(shuō)明。

渲染前的文本如下:

# Simple Title

# Title with **Bold**

# Title with *Italic*

# Title with_Dash_

# Title with `code`

三個(gè)不同引擎渲染的效果分別如下:

Hoedown
Marked
Markdown-it

可見(jiàn),只有Markdown-it的下劃線是沒(méi)有被“吃”掉的。標(biāo)題中出現(xiàn)下劃線的場(chǎng)景還是很常見(jiàn)的,特別是對(duì)于程序員而言,比如某個(gè)函數(shù)名字。

列表

列表分為無(wú)序列表和有序列表。當(dāng)需要嵌套列表,或者在列表中插入代碼塊之類的時(shí)候,也是比較多坑的。

列表末尾空兩格換行

寫(xiě)列表的時(shí)候,我們往往很容易寫(xiě)出這樣的列表。

1. First
This is the first item in the list.
2. Second
This is the second item in the list.

渲染出來(lái),感覺(jué)就不是那么回事了:

List Without Trailing Spaces

我們還需要在每個(gè)列表序號(hào)所在行后面添加至少兩個(gè)空格,告訴MD引擎“在這需要換行”:

Text with Trailing Spaces

這時(shí)候就差不多了:

List With Trailing Spaces

嵌套列表縮進(jìn)四個(gè)空格

嵌套列表的寫(xiě)法如下:

1. First
2. Second
    - Unordered list first    
    Description text in the nested list.
    - Unordered list second
3. Third

渲染后的結(jié)果如下(注意第三行末尾有兩個(gè)空格哦):

Nested List

列表中插入圖片

如下:

1. First    
![Image](https://github.com/tamlok/vnote/raw/master/screenshots/vnote.png)
2. Second
    - Unordered list first    
    Description text in the nested list.
    - Unordered list second    
    ![Image in Nested List](https://github.com/tamlok/vnote/raw/master/screenshots/vnote.png)
3. Third

注意第二幅圖片的縮進(jìn),以及每幅圖片前的那一行的末尾兩個(gè)空格。

Image in List

列表中插入代碼塊

這個(gè)就有點(diǎn)復(fù)雜了,我只能說(shuō)說(shuō)我自己的一個(gè)解決方法。

如下的MD文本:

MD Text with Code Block Within List

注意代碼塊每一行都必須縮進(jìn),而有些引擎要求代碼塊前必須空一行。渲染后如下:

Code Block Within List

一個(gè)錯(cuò)誤的例子:

Wrong MD Text With Code Block Within List

渲染后,代碼塊會(huì)與列表處于同一個(gè)等級(jí):

Wrong Code Block Within List

關(guān)于列表的其他

  1. 有序列表的序號(hào)其實(shí)并不重要,渲染后會(huì)自動(dòng)排序計(jì)數(shù)。
  2. 需要嵌套列表時(shí),推薦多使用無(wú)序列表,只使用一次有序列表。因?yàn)椴煌瑢蛹?jí)的無(wú)序列表前面的符號(hào)標(biāo)記是不一樣的,而不同層級(jí)的有序列表都是使用簡(jiǎn)單的一個(gè)數(shù)字。
  3. 列表嵌套的層數(shù)不宜過(guò)多,否則遲早會(huì)癡線的。一般以3層為宜,如果需要更深層級(jí)的嵌套,可以考慮是否能把頂級(jí)的列表轉(zhuǎn)為標(biāo)題層級(jí)。

代碼

代碼比較簡(jiǎn)單,如下:

Text With Code Blocks

渲染后效果如下:

Code Blocks

需要提出來(lái)的幾點(diǎn):

  1. 兩種形式的代碼塊都是可以的,但是我覺(jué)得第一種比較方便;
  2. 第一種形式可以通過(guò)在```之后指定高亮的語(yǔ)言,如cpp;而第二種形式也是可以指定語(yǔ)言的,但貌似比較麻煩;從渲染的效果來(lái)看,使用第二種形式時(shí),VNote所用的引擎無(wú)法語(yǔ)法高亮。
  3. 第二種形式中,注意代碼塊最后最好換行,如紫色那一行所示。
  4. 編輯的時(shí)候,這兩種形式的表現(xiàn)不一樣是因?yàn)閂Note目前只支持第一種形式的代碼塊編輯時(shí)語(yǔ)法高亮。
  5. 對(duì)于 行內(nèi)代碼,如果需要輸入反引號(hào),則可以使用兩個(gè)反引號(hào)作為標(biāo)記,如`` ` ``;以此類推。

圖片

圖片就比較簡(jiǎn)單了。一般有兩種方式:

  1. 上傳圖片到網(wǎng)上(如圖床之類),獲取圖片的URL地址;
  2. 使用本地圖片,可以使用絕對(duì)路徑或相對(duì)于MD文件的相對(duì)路徑;

一個(gè)例子:

Local Images

此時(shí),該圖片是保存于與MD文件同一個(gè)目錄下的images/目錄下。注意,該圖片是直接從剪切板粘貼到VNote中,由VNote自動(dòng)插入的。VNote會(huì)幫用戶自動(dòng)保存圖片到相應(yīng)的一個(gè)目錄下,并提供編輯時(shí)實(shí)時(shí)預(yù)覽圖片。

表格

表格是MD的一個(gè)硬傷,因?yàn)樵贛D里面插入一個(gè)表格基本上等同于要求用戶手動(dòng)輸入表格邊框。

| Column 1 | Column 2 | Column 3 |
| --- | --- | --- |
| Data 1 containing \| | Data 2 | Data 3 |
| Data 4 | Data 5 | Data 6 |

渲染如下:

Sheet

注意以下幾點(diǎn):

  1. | --- | --- | 一行可以添加:來(lái)表示對(duì)齊方式,如左對(duì)齊 | :--- | :--- |
  2. 如果表格中需要出現(xiàn)|,則 部分 渲染引擎允許通過(guò)\|轉(zhuǎn)義的方式來(lái)輸入|,如上圖所示;

其他

任務(wù)列表

部分引擎支持任務(wù)列表,如下:

- [ ] Undone;
- [x] Done;
- [x] Done;
Task List

大綱

部分引擎支持[TOC]語(yǔ)法顯示文章的大綱。當(dāng)然,VNote在編輯和閱讀的時(shí)候都支持一個(gè)更具交互性的大綱,所以[TOC]目前我比較少用。

VNote Outline

流程圖和數(shù)學(xué)公式

部分引擎支持流程圖和數(shù)學(xué)公式。VNote通過(guò)Mermaid和MathJax來(lái)分別支持流程圖和數(shù)學(xué)公式。個(gè)人的意見(jiàn)是,公式可以有,流程圖很多時(shí)候就不必了。

MD Text with Diagram and Math

渲染效果如下:

Diagram and Math

總結(jié)

以上就是一些個(gè)人在使用Markdown過(guò)程中的經(jīng)驗(yàn),希望對(duì)你有幫助~~

珍愛(ài)生命,使用Markdown,多用空行
舒適生活,使用VNote,少些折騰

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,045評(píng)論 25 709
  • 調(diào)研了一下目前的路由框架,ARouter(阿里的),ActivityRouter都使用了apt技術(shù) 編譯時(shí)注解,個(gè)...
    breaktian閱讀 610評(píng)論 0 0
  • 當(dāng)我發(fā)現(xiàn)那個(gè)并不起眼常常被我們視而不見(jiàn)的筷子并且被筷子的文化所折服的時(shí)候,我已經(jīng)三十五歲結(jié)婚十多年了,我經(jīng)歷著外面...
    福雅閱讀 485評(píng)論 0 0
  • 天空霧蒙蒙的,在上班路上,耳朵里塞著耳機(jī),不知道唱的是什么,心情不好不壞,想想我的生活,就像是這天空一樣,選擇遠(yuǎn)嫁...
    健康快樂(lè)解靠解靠閱讀 121評(píng)論 0 0

友情鏈接更多精彩內(nèi)容