返回

文章详情

二十年的Pandoc

Hacker News2026年8月3日 15:04

2006年8月3日,我在我的网站上上传了Pandoc的第一个版本,并以GPL自由许可证发布。Pandoc 0.1由约3000行Haskell代码组成,除了GHC的标准库,没有其他依赖项。它可以将Markdown、reStructuredText、HTML和LaTeX文档转换为这些格式中的任何一种,以及RTF或S5。当时我完全不知道,这只是未来二十年中超过二百次发布的开始;这个项目将成为用Haskell编写的最流行程序;我将花费无数小时进行错误修复、改进和项目管理;我将与来自许多其他国家的程序员合作;Pandoc将支持超过五十种文档格式;它将允许自动生成引用和参考书目;它将被整合进Quarto和Jupyter Notebook等学术写作工具;它将在全球数百万台计算机上安装。这一切是如何发生的?我想借Pandoc的生日讲述这个项目的故事,尽我所能地回忆它。约翰·麦克法兰 2026年8月2日 史前时期,人们常常问:为什么Pandoc会用Haskell编写?这个问题可能有很好的答案:Haskell是编写这种应用程序的非常好的语言。但实际上,我并不是先决定编写一个文档转换器,然后才决定使用Haskell。我决定使用Haskell,然后才决定在其中编写文档转换器。我是从一位哲学逻辑学家朋友Greg Restall的博客中听说Haskell的。他对一本Haskell入门书籍说:“我很高兴这不是我1986年时计算机科学入门课程的教材。如果是的话,我可能会爱上计算机科学,从而再也不会成为哲学家”(consequently.org)。这让我很感兴趣(并没有听从Restall关于可能对我未来哲学生产力的影响的警告),于是我读了《Haskell温和入门》以获得对这门语言的基本理解。但是,真正学习一门编程语言的唯一方法就是用它编写一些东西。我发现Haskell非常适合编写解析器和编译器,而且它有一个非常好的解析器组合库(parsec),所以我决定编写一个Markdown解析器。当时,Markdown在Perl、Python、Ruby和PHP中都有实现;它们都通过一系列正则表达式转换将Markdown直接转化为HTML。Pandoc采取了不同的方法。它使用解析器组合器解析Markdown,并生成一个真实的抽象语法树(AST),然后可以将其渲染为HTML或其他格式。这是一种更可靠的架构(避免了正则表达式版本的许多怪癖)。这也是一种更具扩展性的架构:通过编写N个解析器(“读者”)和M个渲染器(“作者”),可以支持N × M的转换。很快,我为reStructuredText添加了一个读取器,因为我保留了很多讲座笔记和讲义以该格式存储。我还为LaTeX添加了一个写入器,因为我想能够生成PDF。然后,我为Markdown添加了一个写入器,这样我就可以开始将我的reStructuredText笔记转换为Markdown。从那里开始,项目就如滚雪球般发展。因此,一个最初只是拖延的产物的项目,被我在Haskell中编写的乐趣和它对我自己的学术工作的日益有用所滋养。 第一次发布(2006-2008)2006年8月3日,我决定在我的网站上提供源代码。从那时起,Pandoc支持HTML、LaTeX、RST和Markdown作为输入和输出格式,并且支持RTF作为输出格式;也通过LaTeX支持PDF。我没有做任何宣传该项目的尝试,除了给两个朋友发电子邮件。这是社交媒体(我从未使用过)、GitHub和Hackage(Haskell的软件包库)之前的事情。但是显然,有人通过我的网站偶然发现了它并开始使用它。10月,一位土耳其开发者Recai Oktaş联系了我,他想成为Debian开发者,并想为Debian Linux打包Pandoc。因此,我与他合作完成了这项工作。这对我来说是一次很棒的学习经历,也大大提高了项目的知名度。在2007年,我继续改进Pandoc,主要是根据我自己的需求。0.3版本增加了DocBook写入器和Markdown中脚注的标准语法。0.4版本增加了对Markdown表格、定义列表、上/下标、删除线和增强的有序列表的支持,以及groff手册页和ConTeXt的写入器。这是第一次发布到Hackage Haskell软件包库,该库在2007年建立。Hackage档案和新的cabal-install工具,使得自动解析和获取依赖项,打开了依赖外部软件包的可能性。Pandoc 1(2008-2017)Pandoc 1.0于2008年9月发布,增加了MediaWiki、GNU Texinfo的新写入器(由彼得·王贡献)

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡