不停地疯

Work as a hacker, hack as a artist.

使用Org-Mode来发布博客

| Comments

原文地址: http://blog.paphus.com/blog/2012/08/01/introducing-octopress-blogging-for-org-mode/

在之前的一篇 文章 中曾介绍过一种从 EmacsOrg-Mode 中导出文章到Octopress的方法,但这种方法使用简单的HTML导出,会失去语法高亮的特性。为此我将方法重新进行了设计,并且得到了一种更好的方法来取代之前不靠谱的方法。

首先,你需要根据 Octopress 的官方说明进行设置。我在Clone好Octopress的代码库后,进入克隆产生的目录并执行以下命令:

1
2
3
4
5
6
7
8
9
  #!/bin/sh
  #
  curl -L https://get.rvm.io | bash -s stable --ruby
  source ~/.rvm/scripts/rvm
  rvm install 1.9.2
  rvm rubygems latest
  gem install bundler
  bundle install
  rake install
像之前介绍的那样,我们需要在 .emacs 中新增一个叫 save-then-publish 的命令。
Save Then Publish source
1
2
3
4
5
  (defun save-then-publish ()
    (interactive)
    (save-buffer)
    (org-save-all-org-buffers)
    (org-publish-current-project))
接下来,我们需要设置Org-mode的工程。以我的配置举例来说,我将Octopress的文章放置在 ~/git/blog/ 目录下。如果你需要将你的文章放在其它什么地方,记得修改下面配置中相应的路径。
Publish Projects source
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  (setq org-publish-project-alist
        '(("blog-org" .  (:base-directory "~/git/blog/source/org_posts/"
                                          :base-extension "org"
                                          :publishing-directory "~/git/blog/source/_posts/"
                                          :sub-superscript ""
                                          :recursive t
                                          :publishing-function org-publish-org-to-octopress
                                          :headline-levels 4
                                          :html-extension "markdown"
                                          :octopress-extension "markdown"
                                          :body-only t))
          ("blog-extra" . (:base-directory "~/git/blog/source/org_posts/"
                                           :publishing-directory "~/git/blog/source/"
                                           :base-extension "css\\|pdf\\|png\\|jpg\\|gif\\|svg"
                                           :publishing-function org-publish-attachment
                                           :recursive t
                                           :author nil
                                           ))
          ("blog" . (:components ("blog-org" "blog-extra")))
          ))
现在,我们开始修改代码目录中的 Rakefile 文件。打开它找到 Misc Configs 设置部分,参照下面例子分别修改 new_post_extnew_page_ext 的内容并添加 org_posts_dir 项:
Rakefile source
1
2
3
4
5
6
7
8
9
10
11
12
13
  ## -- Misc Configs -- ##

  public_dir      = "public"    # compiled site directory
  source_dir      = "source"    # source file directory
  blog_index_dir  = 'source'    # directory for your blog's index page (if you put your index in source/blog/index.html, set this to 'source/blog')
  deploy_dir      = "_deploy"   # deploy directory (for Github pages deployment)
  stash_dir       = "_stash"    # directory to stash posts for speedy generation
  posts_dir       = "_posts"    # directory for blog files
  org_posts_dir   = "org_posts"
  themes_dir      = ".themes"   # directory for blog files
  new_post_ext    = "org"  # default new post file extension when using the new_post task
  new_page_ext    = "org"  # default new page file extension when using the new_page task
  server_port     = "4000"      # port for preview server eg. localhost:4000
接着修改 Rakefile ,找到下面代码所示的部分并添加 BEGIN_HTMLEND_HTML 。这样,我们新建文章的时候就能自动生成相应的HTML标签了。
Rakefile source
1
2
3
4
5
6
7
8
9
      post.puts "#+BEGIN_HTML"
      post.puts "---"
      post.puts "layout: post"
      post.puts "title: \"#{title.gsub(/&/,'&')}\""
      post.puts "date: #{Time.now.strftime('%Y-%m-%d %H:%M')}"
      post.puts "comments: true"
      post.puts "categories: "
      post.puts "---"
      post.puts "#+END_HTML"
现在,我们可以使用我修改后的HTML导出插件来生成新的文章了。我修改后的导出插件放置在github上,地址在 https://github.com/craftkiller/orgmode-octopress 。你也可以直接通过 org-octopress.el 1来下载。将下载的文件存放在你emacs的load-path中,并通过 (require 'org-octopress) 命令来加载。因为我的git代码都存放在 ~/git/ 目录下,所以我的Emacs配置是这样的:
.emacs
1
2
  (add-to-list 'load-path "~/git/orgmode-octopress")
  (require 'org-octopress)
终于可以写作了!但是写作之前,你必须像下面示例那样先新增一个org文件并将它移动到org_posts目录下:
1
2
3
4
5
  cd blog
  rake "new_post[title]"
  mv source/_posts/2012-08-01-title.org source/org_posts/
  # I keep my posts in GIT so then I add it to the repo
  git add source/org_posts/2012-08-01-title.org
写完文章后,在Emacs中执行 M-x save-then-publish ,然后你可以到shell中执行 rake gen_deploy. 这样,你的文章就成功的发布到网上了。

我这次改进主要新增了代码模块的语法高亮特性,不过目前它只能支持小写的 begin_src end_src 代码块。 另外,它也支持 :title :url:urltext 选项。如果你想了解他们的用法,可以看看这篇博文的源代码:http://blog.paphus.com/org_posts/2012-08-01-introducing-octopress-blogging-for-org-mode.org 。如果有谁希望帮助改进这个HTML导出插件的话,欢迎在github加入。

最后,你也许需要修改你的 .htaccess 文件来重定向图像请求。我重定向了所有SVG文件的请求到根目录上,这样静态链接就不会在访问图像的时候报错了。你需要将 .htaccess 文件放置在 source 目录下。

.htaccess
1
2
3
4
  Options +FollowSymlinks
  RewriteEngine on
  RewriteBase /
  RewriteRule /([^/]+)\.(svg)$ /$1.$2 [R,L]

Footnotes:

1 译者注:注意,该插件只支持Emacs 24.x。之前就因为Emacs版本原因,一直无法使用。

Emacs, Octopress, Org-Mode, 翻译

« 搭建Linux下的分布式编译系统 优化使用Orgmode发布Octopress的方法 »

Comments