使用pandoc制作包含几个单独输入文件的主目录

时间:2017-03-08 06:21:18

标签: html pandoc

我正在构建一个文档准备系统,它应该能够渲染相当大的文档。

输入是pandoc风味降价。为了使文档更易于管理,文档的每个部分将有一个markdown文件。例如,文档可能如下所示:

档案:01_introduction.md

Introduction
============

This is the introduction

Section 1.1
-----------

This is a section

Section 1.2
-----------

This is another section

档案:02_functionaldescription.md

Functional Description
======================

Section 2.1
-----------

This is a section

Section 2.2
-----------

This is another section

其中一种输出格式是html。我想为每个部分(对应于输入文件)和一个主目录页面生成一个HTML输出文件。主TOC页面应包含指向其他页面标题的链接。

我没有问题让pandoc生成单独的部分html文件。我甚至可以让它来纠正部分编号,这样它们就像是一个大文件的一部分。使用过滤器我也设法纠正了节间链接。

问题是主目录。如果我将所有单个文件提供给一个命令行,如下所示:

pandoc -f markdown -t html --number-sections --toc -s *.md

然后输出的TOC如下所示:

<ul>
<li><a href="#introduction"><span class="toc-section-number">1</span> Introduction</a><ul>
<li><a href="#section-1.1"><span class="toc-section-number">1.1</span> Section 1.1</a></li>
<li><a href="#section-1.2"><span class="toc-section-number">1.2</span> Section 1.2</a></li>
</ul></li>
<li><a href="#functional-description"><span class="toc-section-number">2</span> Functional Description</a><ul>
<li><a href="#section-2.1"><span class="toc-section-number">2.1</span> Section 2.1</a></li>
<li><a href="#section-2.2"><span class="toc-section-number">2.2</span> Section 2.2</a></li>
</ul></li>
</ul>

href是假设链接目标位于同一文档中的所有片段。我需要它们指向包含标题的实际文件,如下所示:

<a href="introduction.html#section-1.1">

A无法使过滤器可靠地工作 - 当它到达过滤器时,所有文件都被连接在一起,没有显示每个文件开始或结束的位置。

到目前为止,我提出的唯一解决方案是使用除pandoc以外的其他方法来生成toc,或者对toc进行后处理。这些解决方案似乎很复杂,所以我想尽可能避免使用它们。

1 个答案:

答案 0 :(得分:4)

  

到达过滤器时,所有文件都连接在一起,没有显示每个文件开始或结束的位置。

这是正确的,这意味着只有两个选项:

  1. 分别处理每个文件,创建单独的TOC。然后,在修复URL的同时组合TOC(非常麻烦..)

  2. 利用您发布的TOC中的事实,顶级中的每个列表项对应于不同的文件。然后,我们可以运行一次pandoc来创建一个大文件,然后将一个过滤器应用到大文件中,使我们得到正确的TOC。

  3. 下面我将展示如何使用过滤器进行方法#2:

    1. 将此过滤器放在您的文件夹中:https://github.com/sergiocorreia/panflute-filters/blob/master/filters/fixtoc.py

    2. 运行

      pandoc --number-sections --file-scope --toc -s *.md | pandoc -s -f html -o toc.html -F fixtoc.py -M files:"*.md"

    3. 这会调用pandoc两次,第一次传递创建TOC时链接不正确,第二次传递修复TOC并删除其他所有内容(根据收到的元数据,包含文件名)。

      然后将输出存储在toc.html(或您设置的任何名称)中,如下所示:

      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta http-equiv="Content-Style-Type" content="text/css" />
        <meta name="generator" content="pandoc" />
        <title></title>
        <style type="text/css">code{white-space: pre;}</style>
      </head>
      <body>
      <div id="TOC">
      <ul>
      <li><a href="01_introduction.html#introduction"><span class="toc-section-number">1</span> Introduction</a>
      <ul>
      <li><a href="01_introduction.html#section-1.1"><span class="toc-section-number">1.1</span> Section 1.1</a></li>
      <li><a href="01_introduction.html#remarks"><span class="toc-section-number">1.2</span> Remarks</a></li>
      </ul></li>
      <li><a href="02_functionaldescription.html#functional-description"><span class="toc-section-number">2</span> Functional Description</a>
      <ul>
      <li><a href="02_functionaldescription.html#section-2.1"><span class="toc-section-number">2.1</span> Section 2.1</a></li>
      <li><a href="02_functionaldescription.html#remarks"><span class="toc-section-number">2.2</span> Remarks</a></li>
      </ul></li>
      </ul>
      </div>
      </body>
      </html>