在 emacs org-mode 中打开 Pelican 相对路径

Open Pelican relative path in emacs org-mode

我正在使用静态站点生成器 Pelican.org 文件作为基础来提供 html 个人 wiki 或知识库。 Pelican 中指向内部内容的链接使用语法 {filename}/path/to/file。但是,由于我使用的是 emacs org-mode,我也希望能够在 org-mode 中跟随 links 到它们的相关文件。我希望我可以编写一个简单的函数,它允许 org-mode 遵循这样的 link 并打开相关文件,而不会影响 Pelican 对内部 link 语法的使用。我怀疑这可能是通过 org-add-link-type 和一个解析文件正确绝对路径的函数来完成的。但是我的 elisp-fu 很弱,我不确定如何进行。感谢帮助!

编辑:举个例子,我可能在 org 文件中有一个像 [[file:{filename}/path/to/file.org]] 这样的 link。有没有办法通过替换(可能通过正则表达式?){filename} 的绝对文件路径来让 org 打开文件,但也不会改变原始 link,以便 Pelican 仍然可以处理它正确吗?

我想你想要这样的东西:

#+BEGIN_SRC emacs-lisp
(org-add-link-type
 "pelican"
 (lambda (path) (org-open-file path))
 ;; ; export
 (lambda (path desc backend)
   (cond
    ((eq backend 'html)
     (format "{filename}/%s" (file-relative-name path))))))
#+END_SRC

Link 到内部内容鹈鹕:/Users/jkitchin/blogofile-jkitchin.github.com/_blog/blog.org

#+BEGIN_SRC sh
pwd
#+END_SRC

#+RESULTS:
: /Users/jkitchin/blogofile-jkitchin.github.com/_blog

出口到:

<p>
Link to internal content {filename}/blog.org
</p>

使用 John Kitchen 的原始答案作为基础(以及 this answer),我想出的最佳函数如下:

   (org-add-link-type
   "pelican"
   (lambda (path) (org-open-file path))
   ;; ; export
   (lambda (path desc backend)
     (cond
      ((eq backend 'org)
       (format "[[file:{filename}/%s][%s]]" path (or desc "")))
      ((eq backend 'html)
       (format "<a href=\"%s\">%s</a>" path (or desc "")))
      ((eq backend 'md)
       (format "[{filename}/%s](%s)" path (or desc ""))))))

根据用于 org-publish 的后端,该函数将为 org、html 或 markdown 提供相关链接。