Nikola orgmode 图片显示

作为一个emacser,写博客不用orgmode怎么说得过去。Nikola自带orgmode插件,算是一个优点。但是有一个问题——在orgmode中显示得好好的行内图片,导出到博客就看不到了。这怎么能行,开始折腾!

设置org-download-image-dir

我使用org-download这个插件来向orgmode buffer中插入图片。所以,首先想到的是修改图片的保存路径,可以通过修改org-download-image-dir这个变量的值来实现。而且我想让修改对所有帖子都生效,可以通过设置dir-local变量来实现这一点。在posts/目录下添加文件.dir-locals.el,内容如下:

;;; Directory Local Variables
;;; For more information see (info "(emacs) Directory Variables")

((org-mode . ((org-download-image-dir . "../images"))))

这样,通过org-download插入的行内图片会自动放入/images目录下。Cool!但是导出成 html以后的路径并不正确,还需要以下步骤。

在导出时修改图片链接格式

因为nikola的orgmode插件实际上仍然是基于orgmode的html导出功能,所以我们在最后导出时修改图片链接为nikola orgmode插件的自定义链接格式即可。

;; fix image links in a nikola post
(defun my-fix-image-links (backend)
  (when (eq backend 'html)
    (save-excursion
      (goto-char (point-min))
      (while (search-forward-regexp "\\[\\[\\(?:file:\\)*\\.\\./images/" nil t)
	(replace-match "[[img-url:/images/"))
      ))
  )
(add-hook 'org-export-before-parsing-hook #'my-fix-image-links)

然后,将这段代码放入/plugins/orgmode/conf.el文件中。好了,试试看图片现在能不能显示(没错,其实就是想秀一下桌面 :grinning:)

nil

[Bonus] 修改图片存放位置

现在图片存放的路径看起来是这样的

../images/
└── zai_dao_chu_shi_xiu_gai_tu_pian_lu_jing
    └── 2020-12-12_17-39-08_screenshot.png

2 directories, 1 file

图片路径是这样的:../images/一级标题/图片文件.png,虽然并不影响使用,但是我想要把它改成这样的:../images/org文件名/一级标题/图片文件.png。可以通过advise org-download-dir-1这个函数来实现这一点。

(defun org-download--dir-1-advice (orig-func)
  (mapconcat 'identity
	     (list (or org-download-image-dir ".")
		   (file-name-sans-extension (file-name-nondirectory buffer-file-name)))
	     "/"))
(advice-add #'org-download--dir-1 :around #'org-download--dir-1-advice)

将这段代码也放入.dir-locals.el文件中,现在它看起来是这样的:

;;; Directory Local Variables
;;; For more information see (info "(emacs) Directory Variables")

((org-mode . ((eval . (progn
			(defun org-download--dir-1-advice (orig-func)
			  (mapconcat 'identity
				     (list
				      (or org-download-image-dir ".")
				      (file-name-sans-extension
				       (file-name-nondirectory buffer-file-name)))
				     "/"))
			(advice-add #'org-download--dir-1 :around #'org-download--dir-1-advice)))
	      (org-download-image-dir . "../images"))))

这样每次插入图片就会自动放到我想要的位置:

../images/
└── nikola-orgmode-tu-pian-xian-shi
    └── zai_dao_chu_shi_xiu_gai_tu_pian_lu_jing
	└── 2020-12-12_17-39-08_screenshot.png

2 directories, 1 file