更新emacs为26.1后,npm插件 hexo-renderer-org 解析出错

org

#1

现在使用 hexo github 在github上面写静态博客,刚开始使用markdown,后来因为比较喜欢用 org-mode,所以博文的格式都是 org 格式,使用插件 hexo-renderer-org来进行解析。

之前的环境为 Emacs 25.3.1 (Org mode 8.2.10) 一直没问题,但是因为org版本比较旧,插入链接如果不空格会出现链接一直延伸的问题,今天就更新了emacs26.1。

更新后使用新版的emacs修改之前博客的文章,保存后执行 hexo g 命令出现如下错误:

XXX==Error Here==>/Users/aoenian/ghblog/source/_posts/hello.org: Trailing garbage following expression: (node:10083) UnhandledPromiseRejectionWarning: TypeError: Cannot read property ‘parent’ of null at Function.exports.update (/Users/aoenian/ghblog/node_modules/hexo-renderer-org/node_modules/cheerio/lib/parse.js:55:26) at module.exports (/Users/aoenian/ghblog/node_modules/hexo-renderer-org/node_modules/cheerio/lib/parse.js:17:11) at Function.exports.load (/Users/aoenian/ghblog/node_modules/hexo-renderer-org/node_modules/cheerio/lib/static.js:19:14) at Promise (/Users/aoenian/ghblog/node_modules/hexo-renderer-org/lib/renderer.js:34:21) at new Promise () at render_html (/Users/aoenian/ghblog/node_modules/hexo-renderer-org/lib/renderer.js:32:10) at convert.then (/Users/aoenian/ghblog/node_modules/hexo-renderer-org/lib/renderer.js:94:16) at at process._tickCallback (internal/process/next_tick.js:182:7) (node:10083) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2) (node:10083) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

在项目的 issue 里面查看到有相似的问题,

问题链接

但是没有解决,希望在这里能够找到答案。

如果大家有其他比较简单的方法使用 org-mode 在Github写博客,也希望告知一下


#2

遇到了同样的问题,目前的解决办法是先用md了。。。


#3

我用的org-octpress,先把org导出到html,再用hexo生成,不需要hexo-render-org解析。 我的相关配置


#4

我修改了它的机制。


#5

修改后可以使用了吗?


#6

是的,不过它必须要你的 emacs 开启 daemon ,并在 hexo 的配置文件里指定 server 文件地址,我的配置如下:

org:
  emacs: 'emacs'
  emacsclient: 'emacsclient'
  common: "#+SETUPFILE: ~/Dropbox/Blog/head.org"
  line_number: true
  user_config: "~/Dropbox/Blog/init.el"
  debug: false
  daemonize: true
  server_file: "~/.emacs.d/server/server"  # <----- this is default value

#9

@guanghui.qu @xhcoding @MephistoMMM

谢谢大家,中间一段时间用pandoc进行格式转换,后面系统重做以后以及为了实现博客的语法高亮,又改回markdown了,后来就没有再测试了。


#10

更新:

为了体验更好一些,最新配置如下:

首先,新增了函数 jk/insert-date ,该函数用于在 .org 文件行首插入当前日期。必须执行这个函数,因为后续函数的执行依赖该函数执行的结果。

(defun jk/insert-date ()
  "Insert current date."
  (interactive)
  (insert "#+DATE: ")
  ;; (org-time-stamp t)
  (insert (format-time-string "%Y/%m/%d %T"))
  (insert "\n\n"))

其次,优化了 jk/md-export 函数,如下:

(defun jk/md-export ()
  "Create front-matter of GFM-md.
Note that it just adapts to a title including most five words."
  (interactive)
  (save-buffer)				;; Save current buffer
  (setq fname (car (split-string (buffer-name) "\\."))) ;; if current buffer is "hello-world.org", FNAME will be "hello-world"
  (setq fdir "../_posts/")				;; Set export dir
  (setq fnamed (concat fdir fname ".md"))			;; "hello-world.md"
  (setq fnamel (split-string fname "-"))		;; Now, fnamel will be ("hello" "world")
  ;; Split the fnamel and join them with <space>, now ftitle will be "hello world"
  (setq ftitle (concat "---\ntitle: "
		       (car fnamel) " "
		       (car (cdr fnamel)) " "
		       (car (cdr (cdr fnamel))) " "
		       (car (cdr (cdr (cdr fnamel)))) " "
		       (car (cdr (cdr (cdr (cdr fnamel))))) "\n"))
  (write-region ftitle nil fnamed) ;; Add ftitle to a file named "hello-world.md"
  ;; Append date like "data: 2019/02/10 10:47:56" to "hello-world.md"
  (beginning-of-buffer)
  (forward-char 8)
  (let (p1 p2)
    (setq p1 (point))
    (end-of-line)
    (setq p2 (point))
    (append-to-file "date: " nil fnamed)
    (append-to-file p1 p2 fnamed)
    (append-to-file "\nupdated: " nil fnamed)
    (append-to-file (format-time-string "%Y/%m/%d %T") nil fnamed)
    (append-to-file "\n---\n\n" nil fnamed))
  (org-gfm-export-as-markdown)			 ;; Invoke gfm plugin to open a relative .md buffer
  (replace-string ".." "")			 ;; ! Just for hexo-blog's special img-show format...
  (append-to-file nil t fnamed)	 ;; Append the contents of "hello-world.md" to "hello-world.md" again
  (kill-this-buffer)
  (switch-window-then-maximize)) ;; Kill the "hello-world.md" generate by GFM plugin to keep you stay in current .org file

该函数,会自动格式化输出文件的头文件格式,如假设该当前文件为 xxx/_org/hello-world.org ,执行该函数后,会生成一个 xxx/_posts/hello-world.md 文件,该文件头部如:

---
title: hello world  
date: 2018/06/09 12:46:29
updated: 2019/02/10 12:46:52
---

总结: 在要转换的 org 文件下,执行示例步骤

  1. jk/insert-date
  2. jk/md-export

即可,实现完美转换。




Hmm… 我在 windows 上从来未成功运行过 hexo-renderer-org 插件……

我写了个函数 jk/md-export (很丑但依然温柔 :smile: ),它是基于 ox-gfm 插件的,运行它可以实现以下几个功能:

  • 在 .org 文件所在目录生成对应的 .md 文件,如 hello-world.org 会生成 hello-world.md 文件
  • 在生成 .md 文件中自动插入文件头,使得 hexo 可以识别,如 title: hello world
  • 解决图片无法被 hexo 识别的问题,如引用 [[../images/gtd.jpg]] 会转为 ![/images/gtd.jpg]

附一张效果图:

附录:

目前运行良好,配合 magit 和 eshell 可以完全使用 Emacs 完成整个文章发布流程。