玩轉markdown,你需要用到這幾個工具
【引自ideras.me的博客】前言
隨著wordpress和靜態網站的流行,markdown被用的越來越多。
markdown是一個面向寫作的語法引擎,markdown的最終目的都是解析成html用于網頁瀏覽,所以它兼容html語法,即你可以在 markdown文檔中使用原生的html標簽。
markdown解析器
開發靜態網站生成器的時候都會采用一種叫front matter的格式進行網站內容寫在類似下面的格式
- ---
- 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調用代碼示例
- $ marked -o hello.html
- hello world
- ^D
- $ cat hello.html
- <p>hello world</p>
API調用示例
- 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
- 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。
簡單的代碼示例
- var toMarkdown = require('to-markdown');
- toMarkdown('<h1>Hello world!</h1>');
to-markdown最近進行了更新,增加了對gfm的兼容,gfm就是git flavored markdown的意思, 是github對markdown語法進行了擴展。
使用gfm的示例
- 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
- ---
- title: Just hack'n
- description: Nothing to see here
- ---
- This is some text about some stuff that happened sometime ago
解析代碼
- 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)
- })
- {
- 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強有力的補充。