2017-03-08 67 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。 –

相關問題