使用 Pandoc 将文件包含在 Markdown 文档中(Haskell 除外)

使用 Pandoc 将文件包含在 Markdown 文档中(Haskell 除外)

我用潘多克从 Markdown 文档创建 Reveal.js 演示文稿,之前使用的是 Google Slides。从一开始我就决定将不同活动和讲座的演示文稿从多个文件中自动合并 - 这样可以更轻松地维护单独的幻灯片,而无需在多个地方不断更新内容。

目前的解决方案是代码工具包(使用其 Kit 语言)和 pandoc。因此,演示文稿的各个部分在编辑器中准备,然后.kit使用 @import 语句在单个文件中引用,然后生成的 Markdown 文件由 pandoc 处理,从而创建 HTML 演示文稿(最后一部分由 Sublime Text 构建系统完成)。

我想用某种脚本来简化这个过程,每次 pandoc 处理合并的 Markdown 文件时,该脚本都会自动对其进行预处理。StackExchange 上有一些帖子提到了 Haskell 过滤器,但 Haskell 安装对于我的小系统来说太大了(至少 800Mb)。

有没有办法用其他编程语言或技巧来包含文件?例如,我知道可以通过在 pandoc 命令中连接它们的名称来合并多个文件,但这并不能使工作流程更顺畅或更快。

答案1

原则上,你可以用任何语言编写 pandoc 过滤器,尽管 Haskell 特别适合。pandocfilters该库使得用 Python 编写它们变得容易。

这是一个pandoc 过滤器教程。它包含一个用于包含文件的 Haskell 过滤器示例,可以使用 pandocfilters 很容易地将其转换为 python 过滤器。

另请参阅目录例子在 pandocfilters 存储库中。

答案2

我终于找到了一些完成任务的方法。

第一种是使用用 Python 编写的 pandoc 过滤器包括(其工作方式与 pandoc 文档中描述的 Haskell 过滤器相同)。但是,现在它仅适用于包含的代码块,而不适用于一般内容片段。

第二种方法是使用内联 Perl 脚本,该脚本可以添加到构建命令的前面(第一次看到这里)。这条路已经证明是有用的,我会坚持一段时间,因为

  1. 我不太擅长 Python,
  2. 它允许执行一些方便的搜索和替换任务,例如随时替换图像和包含文件的路径部分。

下面是我用来制作 Reveal.js 格式幻灯片的命令(虽然这个命令需要上传到某个网络托管,但还有其他构建变体,可以使用--self-containedpandoc 选项构建一个独立的幻灯片文件,或者,例如,“收集”所有与幻灯片相关的文件到桌面上的文件夹中):

perl -ne 's/^#\\((.+)\\).*/`cat \"${project_path/\\//\\\\\\//g}\\$1\"`/e;s/\\((\\/_common\\/img)/(\\/presentations\\$1/g;print' ${file_base_name}.md > result.md && pandoc -s -t revealjs --variable revealjs-url=http://www.site.com/presentations/_common/resources/revealjs --css=http://www.site.com/presentations/_common/resources/customcss_sky.css -H ${project_path}/_common/resources/customhtml.html --highlight-style haddock result.md -o index.html && trash result.md

此命令:

  1. 用包含的内容替换所有#(path/to/include) 表达式(路径必须相对于项目文件夹);
  2. 将图像中的路径(相对于项目文件夹)替换为图像目录的服务器路径;
  3. 将生成的 Markdown 输出到临时文件;
  4. 使用 pandoc 创建 HTML 幻灯片;
  5. 使用 Ali Rantakaritrash实用程序清除临时文件。

相关内容