我的 jekyll 博客所使用的小工具

2016-02-18 Mithrilwoodrat 更多博文 » 博客 » GitHub »

原文链接 http://woodrat.xyz/2016/02/18/%E6%88%91%E7%9A%84jekyll%E5%8D%9A%E5%AE%A2%E6%89%80%E4%BD%BF%E7%94%A8%E7%9A%84%E5%B0%8F%E5%B7%A5%E5%85%B7/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


今天刚刚回到学校,折腾了这么久,终于可以停下来慢慢看书找工作了。

很久没有更新技术相关的内容了,偶尔还是得更新一下的,不过这篇也不怎么能算技术相关。

使用 Github Page + Jekyll 的方式写博客一段时间了,分享下为方便写博客自己造的轮子。

首先是编辑,Jekyll默认使用 Markdown 来生成博客内容。支持 Markdown 的编辑器其实很多,我还是继续使用心爱的 Emacs。markdown-mode 使用起来还是凑合的,只是默认的键位和我的 buffer 管理快捷键冲突了,不过只用简单的在配置文件里面配置下就好了。

我使用了 tabbar-mode 来管理 Emacs 的 buffer,tabbar-mode 使用如下配置

(global-set-key (kbd "<M-up>") 'tabbar-backward-group)

(global-set-key (kbd "<M-down>") 'tabbar-forward-group)

(global-set-key (kbd "<M-left>") 'tabbar-backward-tab)

(global-set-key (kbd "<M-right>") 'tabbar-forward-tab)

简单的做法只用在 markdown-mode 写 hook 禁止它覆盖这几个快捷键即可,当然你要继续使用 markdown-mode 的这几个功能可以给其绑定其他的快捷键,我个人不怎么使用就没继续配置了。

(defun my-markdown-config ()
  ;unbind tabbar keys
  (define-key markdown-mode-map (kbd "M-<up>") nil)
  (define-key markdown-mode-map (kbd "M-<down>") nil)
  (define-key markdown-mode-map (kbd "M-<left>") nil)
  (define-key markdown-mode-map (kbd "M-<right>") nil))

(add-hook 'markdown-mode-hook 'my-markdown-config)

为了在没有Emacs编辑器的时候也能方便的写,也顺便练下手,做了个简单的 Markdown 在线编辑器。这个在上一篇博客中已经介绍过了,就不赘述了。这几天把左边的编辑框行号问题给修正了,导出功能也在开发中。

当然也可以选择使用 Atom 或者直接使用为知笔记编写。

Jekyll 文章默认放在项目文件夹的 _post 文件夹中,文章文件上部分两个 --- 中间是文章的附加信息,可以看作配置信息,以 yaml 的格式书写。重要的几项为 title permalink categories

title 为标题,自不用多说。permalink 关系到文章显示的url,可以按日期或者分类为前缀,或者直接使用文件名,不过需要url编码一下,categories 则代表文章的分类,这里倒问题不大。

同时 Jekyll 要求文章的文件名按照 YEAR-MONTH-DAY-title.MARKUP 的格式组织。

了解了这些信息后,便可以用 Python 很简单的写出制定标题和分类来自动生成文章的小脚本了,gen_post.py,不过为了方便起见,我并未使用 yaml 的库来生成文件,而是直接用拼接字符串的方式,毕竟只有那么固定几行,没有太大的必要。

虽然写的很简陋不过还是可以将就用一下的 : )

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
import time
import sys
import os
from urllib import quote
from optparse import OptionParser


_base_path = os.path.abspath(os.path.dirname(__file__))
date = time.strftime("%Y-%m-%d") # 文件名按 Jekyll 要求为 YEAR-MONTH-DAY-title.MARKUP
link_path = time.strftime("/%Y/%m/%d/") # url 按 /年/月/日/标题 的方式组织
_post_path =  os.path.join(_base_path, "_posts") # 生成目录为主目录下的 _post 目录


def gen_post(title, category="默认"):
    content = "---\n"
    content += "title: "+ title + "\n"
    content += "author: admin\n"
    content += "layout: post\n"
    # 这里需要注意 url 中标题需要 urlencode 一下
    content += "permalink: " + link_path + quote(title) +'/' + "\n" 
    content += "categories:\n"
    if category:
        content += "  - " + category + "\n" 
    content += "---"
    title = title.replace(' ', '-') # 生成文件名时自动将空格转换为 -
    filename = date + "-" + title + ".md"
    try :
        filepath = os.path.join(_post_path,filename)
        if os.path.isfile(filepath):
            print "file exist"
            return
        post = open(filepath, "w+")
        post.write(content)
        post.close()
        print "create", filename, "success!"
    except Exception as err:
        print err

if __name__ == "__main__":
    parser = OptionParser()
    # 接受标题和分类两个参数,其中分类可以不填,默认为“默认”分类,你也可以按自己情况修改
    parser.add_option("-t", dest="title", help="post title")
    parser.add_option("-c", dest="category", help="post category")
    (options, args) = parser.parse_args()
    if options.title:
        if options.category:
            gen_post(options.title, options.category)
        else:
            gen_post(options.title)

文章生成好之后将编辑好的内容复制进去就好,当然先生成再用 Emacs 打开编写也是没有问题的。

编写完成后可以使用 jekyll s 查看效果。

顺带一提,Jekyll 默认的 Markdown 引擎 Kramdown 使用 ~~~ 来标识代码块,和一般大家所熟悉的使用 ``` 的方法不相同,但是根据这个 issue,Jekyll 将在 3.1 版本后支持使用 ``` 的方式。

ps: 写的时候豆瓣电台正好随机到 Fly Me to the Moon,good night!