如何依靠GitHub编译Markdown

这是一篇随便写写的短文

Gist被墙,不太方便在博客里面贴Gist的代码链接了。虽然可以用Markdown的预格式化功能来做代码排版,但没有语法高亮看着始终是别扭。因此,打算借助一下GitHub的力量,实现博客文章中的代码排版和语法高亮。

这个过程顺便还重构了cl-github-page,也就是用来生成这个博客的页面所开发的程序,现在这一篇也是用新生的它来创作的。说来如此,实际上也只是写了一堆Common Lisp的代码来编译Markdown、填充模板,以及写入文件罢了。扯远了,说一下如何使用GitHub来完成Markdown到HTML的转化,以及支持语法高亮。

GitHub开放的API中含有用于编译Markdown的接口,文档在此。在调用该接口时只需要使用gfm的模式,就可以让GitHub为我们完成源文件中的代码排版和语法高亮了。其余对接口的调用的规则参见API文档的Overview部分。此处直接给出Common Lisp代码(代码摘自cl-github-page)

(defvar *accept* "application/vnd.github.v3+json")
(defvar *content-type* "application/json")
(defvar *mode* "gfm")
(defvar *schema* "https://api.github.com")

(defun make-uri (path)
  (concatenate 'string *schema* path))

(defun compile-by-github (text
                          &key
                            (mode *mode*))
  (assert (member mode '("gfm" "markdown") :test #'equal))
  (let ((accept *accept*)
        content
        (content-type *content-type*)
        (method :post)
        parameters
        body
        (uri (make-uri "/markdown")))
    (setf parameters
          `(("mode" . ,mode)
            ("text" . ,text)))
    (setf content
          (encode-json-alist-to-string parameters))
    (setf body
          (http-request uri
                        :accept accept
                        :content content
                        :content-type content-type
                        :method method
                        :redirect t))
    body))

充斥着setf的Common Lisp代码我也很少写,这一次我是刻意采用了这样的风格,不习惯欢迎在评论区开喷(笑

以GitHub文档给出的例子进行调用的示例代码如下

(compile-by-github "Hello world github/linguist#1 **cool**, and #1!")

实际上如果要实现语法高亮,仅仅使用GitHub的接口是不够的,因为我们没有编译后的HTML中许多class所需要的样式的定义。因此,请将下面这一段HTML代码插入到最终需要语法高亮效果的页面中

<link crossorigin="anonymous" href="https://assets-cdn.github.com/assets/frameworks-11a662d59757ef2ced3c65b6a175b2ebad3770c188a3b2cc0025b735fc78867c.css" media="all" rel="stylesheet" />

输出结果不在此赘述,全文完。