Pandoc 3.10.1:新增 Txt2Tags 输出,默认配置文件不再依赖扩展名

2026-07-23 24 预计阅读时间: 1 分钟
来源: oschina.net AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:7 分钟

Pandoc 3.10.1 是一次以细节改进和错误修复为主的版本更新。最值得关注的变化有两项:Txt2Tags(t2t)正式成为输出格式;默认设置文件可以不带扩展名。这些调整看似不大,却能减少文档流水线中的自定义脚本和文件命名约束。

t2t 从输入支持走向可直接输出

Pandoc 的核心定位不是简单替换文本标记,而是先把输入文档解析成内部抽象语法树,再由不同 writer 生成目标格式。3.10.1 增加 t2t 输出后,可以直接把 Markdown 等受支持的输入转换成 Txt2Tags 文档。

升级后,可以先确认当前二进制是否提供该 writer:

pandoc --version
pandoc --list-output-formats | grep -x 't2t'

准备一个最小输入文件:

cat > input.md <<'EOF'
# 发布说明

Pandoc 现在可以输出 **Txt2Tags**。

- 适合接入现有文档流水线
- 不再需要手写基础转换脚本

[项目主页](https://pandoc.org/)
EOF

pandoc input.md --from markdown --to t2t --output output.t2t
cat output.t2t

如果只想检查标准输出,可以省略 --output

pandoc input.md -f markdown -t t2t

这项能力适合需要维护 Txt2Tags 文档、向旧系统交付 .t2t 文件,或希望用统一转换入口管理多种发布格式的团队。

不过,“能够转换”不等于“能够无损往返”。Markdown 与 Txt2Tags 的表达能力、扩展语法和元数据模型并不完全相同。表格、脚注、复杂嵌套列表、原始代码块以及自定义属性等内容,都应该用真实文档做回归测试,而不是仅检查命令是否成功退出。

无扩展名 defaults 文件让任务入口更干净

Pandoc 的 defaults 文件可以集中保存输入格式、输出格式和输出路径等选项,避免在 CI 脚本中堆叠很长的参数。3.10.1 允许使用不带扩展名的默认设置文件;与扩展名有关的查找或补全只在指定名称的文件不存在时介入。

可以这样准备一个名为 publish、没有 .yaml 后缀的配置文件:

cat > publish <<'EOF'
from: markdown
to: t2t
standalone: true
input-files:
  - input.md
output-file: output.t2t
EOF

pandoc --defaults ./publish

执行后检查结果:

test -s output.t2t && echo 'conversion succeeded'
head -n 20 output.t2t

无扩展名文件尤其适合作为仓库中的任务入口。例如,项目可以使用 publishmanualrelease-notes 等业务名称,而不必让调用方关心配置文件采用什么扩展名。

需要注意的是,仓库里不要同时放置多个可能产生歧义的同名 defaults 文件。升级前后最好执行一次:

find . -maxdepth 2 -type f \( -name 'publish' -o -name 'publish.yaml' -o -name 'publish.yml' \) -print

如果输出多个文件,应明确团队实际使用哪一个,并在 CI 中传入清晰路径。

把转换结果纳入 CI,而不是只验证退出码

格式转换工具最常见的风险并非进程崩溃,而是输出成功但内容发生细微变化。升级 Pandoc 时,可以为关键文档保留一份期望输出,并在流水线中比较差异。

下面是一段可以直接改造的 Shell 检查脚本,假设仓库中已有 input.md、无扩展名 defaults 文件 publish,以及经过人工确认的 expected/output.t2t

#!/usr/bin/env bash
set -euo pipefail

required_version='3.10.1'
actual_version="$(pandoc --version | head -n 1 | awk '{print $2}')"

if [[ "$actual_version" != "$required_version" ]]; then
  echo "expected pandoc $required_version, got $actual_version" >&2
  exit 1
fi

pandoc --list-output-formats | grep -qx 't2t'
pandoc --defaults ./publish

diff -u expected/output.t2t output.t2t

将它保存为 scripts/check-docs.sh 后运行:

chmod +x scripts/check-docs.sh
./scripts/check-docs.sh

如果输出中包含时间戳、自动生成标识或其他不稳定字段,应先固定这些输入,或者对结果做可解释的规范化处理,避免测试长期处于误报状态。

升级时该检查什么

Pandoc 3.10.1 更像是一次适合稳步跟进的补丁版本,而不是要求重写文档系统的大版本迁移。实际采用时可以按以下清单推进:

  • pandoc --version 固定本地与 CI 的版本,避免不同环境生成不同结果。
  • --list-output-formats 确认运行中的二进制确实支持 t2t 输出。
  • 为表格、链接、代码块、脚注和嵌套列表准备代表性样例。
  • 检查无扩展名 defaults 文件与 .yaml.yml 文件是否存在命名冲突。
  • 对生成文件执行文本差异比较,并人工复核第一次基线更新。
  • 如果通过 Haskell 库直接集成 Pandoc,还应运行项目自身的编译与转换测试,而不只测试命令行工具。

对于已经使用 Pandoc 的团队,这次升级的直接收益是拓宽输出目标并简化配置命名;对于准备引入 t2t 输出的项目,最稳妥的方式仍然是从一组真实文档开始,建立可重复的转换命令和回归基线。


相关推荐