Windows上用Pandoc将Markdown片段转换为Org格式

[2024-07-31 周三 11:11]

根据Stack Overflow的一个问题:Convert region/subtree from Markdown to org ,可以通过以下代码将一段Markdown格式文本转换为Org格式:

(defun my-md-to-org-region (start end)
  "Convert region from markdown to org"
  (interactive "r")
  (shell-command-on-region start end "pandoc -f markdown -t org" t t))

但在Windows上仍需一些微调,现记录流程如下。

通过Winget直接安装pandoc

winget install pandoc --proxy YOUR_PROXY_URL

安装完毕后重启,以便Emacs重新读取路径。

定义函数

(defun my/md-to-org-region (start end)
  "Convert region from markdown to org"
  (interactive "r")
  (let ((default-directory "~/.emacs.d/")
        (coding-system-for-write 'utf-8)
        (coding-system-for-read 'utf-8))
    (shell-command-on-region start end "pandoc -f markdown -t org --lua-filter=remove-org.lua --wrap=preserve" t t)))

这里指定了输出和输入字符格式为 utf-8 ,同时设置了shell执行路径在 ~/.eamcs.d/ 。我们在该路径下放置一个 remove-org.lua 文件,内容为:

function Header (header)
  return pandoc.Header(header.level, header.content, pandoc.Attr())
end

然后对选中的markdown区域执行该函数,就能将其替换为org格式。

示例:

[IT之家](https://www.ithome.com/) 7 月 31 日消息,苹果公司最新发布论文 \[[PDF](https://machinelearning.apple.com/papers/apple_intelligence_foundation_language_models.pdf)\],分享了关于 Apple Intelligence 模型的相关细节,**部分性能已经超过 OpenAI 的 GPT-4。**

### 模型简介

苹果在论文中介绍了 Apple Foundation Model(下文简称 AFM)模型,共有以下两款:

-   **AFM-on-device:**本地运行,30 亿参数,可以在 [iPhone](https://iphone.ithome.com/)、[iPad](https://ipad.ithome.com/) 等设备上高效运行;
    
-   **AFM-server:**苹果尚未公布参数等细节。
    

### 训练数据来源

苹果表示训练数据集包括从出版商处获得授权的数据、经过策划的公开或开源数据集以及我们的网络爬虫 Applebot 抓取的公开信息组成。

变化为

[[https://www.ithome.com/][IT之家]] 7 月 31 日消息,苹果公司最新发布论文 [[[https://machinelearning.apple.com/papers/apple_intelligence_foundation_language_models.pdf][PDF]]],分享了关于 Apple Intelligence 模型的相关细节, *部分性能已经超过 OpenAI 的 GPT-4。*

\*** 模型简介
苹果在论文中介绍了 Apple Foundation Model(下文简称 AFM)模型,共有以下两款:

- *AFM-on-device:* 本地运行,30 亿参数,可以在 [[https://iphone.ithome.com/][iPhone]]、[[https://ipad.ithome.com/][iPad]] 等设备上高效运行;

- *AFM-server:* 苹果尚未公布参数等细节。

\*** 训练数据来源
苹果表示训练数据集包括从出版商处获得授权的数据、经过策划的公开或开源数据集以及我们的网络爬虫 Applebot 抓取的公开信息组成。

6 个赞

使用pandoc导出当前org-buffer为docx

合法化化buffer名

Windows下,如果直接使用buffer名作为文件名,有时会有非法字符,需要清理。

(defun my/sanitize-windows-filename (filename)
  "Sanitize FILENAME to be a valid Windows filename."
  ;; Replace invalid characters with an underscore
  (replace-regexp-in-string "[<>:\\\"\/\|\?\*]+" "_" filename))

将当前buffer内容放至TEMP文件夹内临时文件并返回路径

(defun my/save-buffer-to-temp-org ()
  "Save the current buffer content to a file in the system's temporary directory.
The file name will be the same as the buffer name, but with a '.org' extension.
Return the path of the saved file."
  (interactive)
  (let* ((buffer-name (buffer-name))
         (file-name (concat (my/sanitize-windows-filename buffer-name) ".org"))
         (temp-dir (if (eq system-type 'windows-nt)
                       (expand-file-name (getenv "TEMP"))
                     (expand-file-name (getenv "TMPDIR"))))
         (full-path (expand-file-name file-name temp-dir)))
    ;; Write buffer content to the file
    (write-region (point-min) (point-max) full-path)
    ;; Return the full path of the file
    full-path))

这里用 getenv 做了一个不同系统兼容。Windows的临时文件为 TEMP ,而MacOS的临时文件为 TMPDIR

利用pandoc转换临时文件并保存到桌面

(defun my/org-buffer-export-docx ()
  (interactive)
  (let ((docx-file (concat (getenv "UserProfile") "\\desktop\\" (my/sanitize-windows-filename (buffer-name)) ".docx"))
           (template-file (concat (file-truename "~/.emacs.d/org") "/template.docx")))
    (shell-command (format "pandoc %s --from org+east_asian_line_breaks -o %s --reference-doc=%s" (my/save-buffer-to-temp-org) docx-file template-file))
    (message "Convert finish: %s" docx-file)))

docx-file 指定保存路径为桌面;
template-file 是pandoc转换docx文件参考的模板文件路径,具体设置请查看pandoc官方文档
这里的 --from org+east_asian_line_breaks 意味启用东亚换行设置,东亚文字间的换行不会被转换为空格,参考这篇博客的解说

2 个赞