我的 jekyll 博客所使用的小工具
原文链接 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!