前言
隨著 WordPress 和靜態網站的流行,Markdown 被用的越來越多。
Markdown 是一個面向寫作的語法引擎,Markdown 的最終目的都是解析成 HTML 用於網頁瀏覽,所以它相容 HTML 語法,即你可以在 Markdown 文件中使用原生的 HTML 標籤。
Markdown 解析器
開發靜態網站生成器的時候都會採用一種叫front matter的格式進行網站內容寫在類似下面的格式
1 2 3 4 5 6 7 8 9 |
--- title: 玩轉Markdown ,你需要用到這幾個工具 date: 2016-08-14 16:44:54 image: /img/pencils-762555_640.jpg --- ## 前言 隨著wordpress和靜態網站的流行,Markdown 被用的越來越多。... |
當進行網站生成的時候需要進行Markdown 解析,然後渲染成html頁面,那用什麼工具進行解析呢?
marked是最早用node.js開發的Markdown 解析器,同時提供CLI命令呼叫和node.js api呼叫。
CLI呼叫程式碼示例
1 2 3 4 5 |
$ marked -o hello.html hello world ^D $ cat hello.html <p>hello world</p> |
API呼叫示例
1 2 3 |
var marked = require('marked'); console.log(marked('I am using __Markdown __.')); // Outputs: <p>I am using <strong>Markdown </strong>.</p> |
這些都是一些通用的功能,但是marked還支援程式碼高亮,通過使用highlight.js。
使用highlight.js進行程式碼高亮相信大家都用到過,可能大家不知道是highlight.js還支援api方式呼叫,下面的程式碼會配置marked使用highlight.js進行程式碼高亮相信大家都用到過,可能大家不知道是highlight
1 2 3 4 5 6 7 8 9 10 11 |
marked.setOptions({ highlight: function (code, lang) { var res; if (lang) { res = hljs.highlight(lang, code, true).value; } else { res = hljs.highlightAuto(code).value; } return res; } }); |
生成的程式碼已經包含程式碼高亮標籤,最後只需要引入highlight.js的主題就能顯示了,highlight.js所有的顏色主題都在這裡
Markdown -js也是一款使用node.js開發的Markdown 解析器,基本用法和marked差不多,但是文件裡面好像沒有提到像marked一樣進行程式碼高亮生成的介面,有興趣的同學自己找找吧。
Markdown 生成器
什麼是Markdown 生成器,就是根據html標籤生成Markdown 檔案。
github上面Markdown 生成器star數最高的是to-Markdown 。
簡單的程式碼示例
1 2 |
var toMarkdown = require('to-Markdown '); toMarkdown ('<h1>Hello world!</h1>'); |
to-Markdown 最近進行了更新,增加了對gfm的相容,gfm就是git flavored Markdown 的意思, 是github對Markdown 語法進行了擴充套件。
使用gfm的示例
1 |
toMarkdown ('<del>Hello world!</del>', { gfm: true }); |
那這個to-Markdown 有什麼用呢?
舉個簡單的例子,假如我想開發一個簡單的rss閱讀器,但是我又不想跳轉到目標網站去閱讀,因為不同的網站風格不一,導致不一致的閱讀體驗。
怎麼辦呢?那就把網站內容抓取下來,然後用to-Markdown 生成Markdown 檔案,然後使用自己的模板樣式進行統一渲染。
當然去除廣告只是一個side effect。
除了to-Markdown 之外還有一個比較好用的api,heckyesMarkdown ,這個專案使用了php-readability,提高文章的可讀性。
可惜heckyesMarkdown 沒有開源出來,這個專案有點古老,估計那個時候github還沒流行起來。
heckyesmarkdow對中文的支援不是非常友好,如果想抓取中文站還是使用to-Markdown 比較靠譜一點。
front matter
Markdown 寫文章確實很方便,簡單容易上手,但是Markdown 不能儲存後設資料,例如作者,日期,型別這樣的結構化的資料如果都生成html標籤的話提取的時候又稍微麻煩了點, 還得藉助cheerio才能完成。
所以,為了能方便的儲存文章的後設資料,幾乎所有的靜態網站生成器都使用front matter格式來儲存文章。
front matter檔案通常分為頭部和正文部分,頭部一般使用yaml、toml和json三種格式,front matter 解析工具需要識別這三種格式的檔案頭。正文部分就是普通的Markdown 內容。
front-matter也是用node.js開發的,相比Markdown 解析器來說,fornt-matter解析器要簡單很多。
示例檔案 example.md
1 2 3 4 5 6 |
--- title: Just hack'n description: Nothing to see here --- This is some text about some stuff that happened sometime ago |
解析程式碼
1 2 3 4 5 6 7 8 9 10 |
var fs = require('fs') , fm = require('front-matter') fs.readFile('./example.md', 'utf8', function(err, data){ if (err) throw err var content = fm(data) console.log(content) }) |
1 2 3 4 5 6 7 8 |
{ attributes: { title: 'Just hack\'n', description: 'Nothing to see here' }, body: '\nThis is some text about some stuff that happened sometime ago', frontmatter: 'title: Just hack\'n\ndescription: Nothing to see here' } |
front matter雖然格式看起來有點雜亂,卻是對Markdown 強有力的補充。