2017-03-08 65 views
3

我正在构建一个文档准备系统,该系统应该能够渲染相当大的文档。使用pandoc制作包含多个单独输入文件的主目录表

输入是在pandoc风味降价。为了使文档更易于管理,文档的每个部分都会有一个降价文件。例如,一个文件可能是这样的:

文件: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"> 

一个一直没能做成过滤器工作可靠 - 通过它到达过滤器时,所有文件都被连接在一起没有什么可以显示每个文件开始或结束的位置。

我到目前为止唯一提出的解决方案是使用除pandoc之外的东西来生成toc或者后处理toc。这些解决方案看起来很复杂,所以我想尽可能避免它们。

+0

注意,如果两个小节共享相同的名称(例如,它们被称为摘要“),然后创建一个来自接触文件的主要toc会破坏hrefs(即使我们修复文件名) –

+1

顺便说一下,我注意到上述问题实际上是由--file-scope标志修复的 –

回答

3

当它到达过滤器的时候,所有的文件都被连接在一起,没有任何东西显示每个文件开始或结束的位置。

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

  1. 过程中的每个文件分开,创建单独的TOC。然后,在修复URL的同时组合TOC(非常繁琐..)

  2. 利用这样一个事实,即在您发布的TOC中,顶层中的每个列表项都对应于不同的文件。然后,我们可以运行一次pandoc来创建一个大文件,然后将一个过滤器应用于大文件,从而为我们提供正确的TOC。

下面我将展示如何做的方法#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"

这将调用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> 
+0

有趣的提议。每个文件不能有一个以上的1级标题(这不是我打算放置的限制 - 但也许这是有意义的) – harmic

+0

您可以实际使其变为mor一般来说,如果你将过滤器修改为一个实际的python程序。就像“maketoc.py * .md”,然后调用每个单独文件的pandoc。 –

相关问题