17.16.3 The open-source protocol

open-source 处理器用于在阅读文档时方便编辑本地源文件。为此,可创建一个地址如下的书签:

javascript:location.href='org-protocol://open-source?url='+
      encodeURIComponent(location.href);void(0)

变量 org-protocol-project-alist 用于将 URL 映射为本地文件名,具体方式为剔除 URL 末尾参数,将 :base-url 替换为 :working-directory ,并将 :online-suffix 替换为 :working-suffix 。例如,假设你在 ‘/home/user/worg’ 目录存有 ‘https://orgmode.org/worg/’ 内容的本地副本,可将 org-protocol-project-alist 设置如下:

(setq org-protocol-project-alist
      '(("Worg"
         :base-url "https://orgmode.org/worg/"
         :working-directory "/home/user/worg/"
         :online-suffix ".html"
         :working-suffix ".org")))

此时若你正在浏览 ‘https://orgmode.org/worg/org-contrib/org-protocol.html’ ,发现笔误或有改进文档的想法,只需点击该书签即可开始编辑。

但这类映射并非总能得到预期结果。假设你运营一个位于 ‘https://example.com/’ 的在线商店,本地源文件存放在 ‘/home/user/example/’ 。常见做法是让服务器通过单个文件处理所有商品,并对不匹配服务器现有文件的 URL 进行重写。这样一来,对 ‘https://example.com/print/posters.html’ 的请求,可能会在服务器上被重写为 ‘https://example.com/shop/products.php/posters.html.php’ 。 open-source 处理器通常无法找到 ‘/home/user/example/print/posters.html.php’ 文件,从而执行失败。

org-protocol-project-alist 中的条目可额外添加 :rewrites 属性。该属性为一个点对列表,每一项将一个正则表达式映射为相对于 :working-directory 的路径。

现在通过添加 :rewrites 规则,将 URL 映射到路径 ‘/home/user/example/products.php’ :

(setq org-protocol-project-alist
      '(("example.com"
         :base-url "https://example.com/"
         :working-directory "/home/user/example/"
         :online-suffix ".php"
         :working-suffix ".php"
         :rewrites (("example.com/print/" . "products.php")
                    ("example.com/$" . "index.php")))))

由于 ‘example.com/$’ 作为正则表达式使用,它会将 ‘https://example.com/’ 、 ‘https://www.example.com/’ 等地址映射到 ‘/home/user/example/index.php’ 。

:rewrites 规则仅在未匹配到任何现有文件名时,才会作为最后方案进行查找。

有两个函数可帮助你为 org-protocol-project-alist 填充有效内容: org-protocol-createorg-protocol-create-for-org 。后者适用于你正在编辑属于发布项目的 Org 文件时。