用Emacs Org-Mode来建站

很多朋友问到我这个站点是怎么搭建出来的。不过我的感觉是,他们可能更多地是对我积累了这么多文章感到好奇,而不仅仅是这个站点的搭建感兴趣。 因为其实只要有个简单的Wordpress或者是Github Pages也能做到这样,唯一的差别还是是否愿意长期往这个站点里面添加文章和内容。 说来惭愧,我的这个站点里面大部分的内容都不是原创的,东抄一点西抄一点,抄别人的文章,翻译别人的文章和论文等等。

既然问的同学多了,我就简单地说说我这个站点是怎么搞的。代码仓库在 这里

publish.el 文件如下:

  1. 载入.emacs文件,里面有一些辅助函数比如 `get-string-from-file`
  2. 设置站点发布配置:哪些目录,发布到哪里,样式如何等等
  3. 调用 `org-publish-project` 发布站点

CSS文件可以参考这个链接 CSS for Org-exported HTML 原始文件

;; load env
(load "~/.emacs.d/init.el")

;; http://orgmode.org/worg/org-tutorials/org-publish-html-tutorial.html
(require 'ox-publish)

;; TODO(yan): 在下面设置 :html-head 一直有问题
;; 显示 Wrong type: sequencep my-org-publish-html-head
;; 但是在这里如果检查变量的话,的确是满足sequencep的。
;; 暂时找不到原因。不过如果放在 publish.el 下面设置 (setq org-html-head ...) 是可以work的
;; 现在解决方案是将这个处理放在pp-html里面,这样的好处是可以快速地修改样式,
;; 而不用每次对整个项目重新输出,速度更快。
(setq my-org-publish-html-head
      (replace-regexp-in-string
       "root/" "/"
       (get-string-from-file "~/repo/dirtysalt.github.io/themes/setup.txt")))
;; (message my-org-publish-html-head)
;; (when (sequencep my-org-publish-html-head)
;;   (message "IT'S SEQUENCE"))

(setq org-publish-project-alist
      '(("pages"
         :base-directory "~/repo/dirtysalt.github.io/src/"
         :publishing-directory "~/repo/dirtysalt.github.io/html/"
         :recursive nil
         :html-head-include-default-style nil
         ;; TODO(yan): seqeuncep my-org-publish-html-head failed?!
         ;; :html-head my-org-publish-html-head
         :html-head ""
         :publishing-function org-html-publish-to-html
         :with-toc 't)
        ("site" :components ("pages" "blogs"))))

;; (setq my-org-publish-html-head
;;       (replace-regexp-in-string
;;        "root/" "/"
;;        (get-string-from-file "~/repo/dirtysalt.github.io/themes/setup.txt")))
;; (setq org-html-head my-org-publish-html-head)

(org-publish-project "site")