使用 Pandoc 将你的书转换成网页和电子书 | Linux 中国

2018 年 11 月 29 日 Linux中国
通过 Markdown 和 Pandoc,可以做到编写一次,发布两次。
-- Kiko Fernandez-reyes

致谢
编译自 | 
https://opensource.com/article/18/10/book-to-website-epub-using-pandoc
 
 作者 | Kiko Fernandez-reyes
 译者 | jlztan 🌟🌟共计翻译:5.0 篇 贡献时间:65 天

通过 Markdown 和 Pandoc,可以做到编写一次,发布两次。

Pandoc 是一个命令行工具,用于将文件从一种标记语言转换为另一种标记语言。在我 对 Pandoc 的简介[1] 一文中,我演示了如何把 Markdown 编写的文本转换为网页、幻灯片和 PDF。

在这篇后续文章中,我将深入探讨 Pandoc[2],展示如何从同一个 Markdown 源文件生成网页和 ePub 格式的电子书。我将使用我即将发布的电子书《面向对象思想的 GRASP 原则[3]》为例进行讲解,这本电子书正是通过以下过程创建的。

首先,我将解释这本书使用的文件结构,然后介绍如何使用 Pandoc 生成网页并将其部署在 GitHub 上;最后,我演示了如何生成对应的 ePub 格式电子书。

你可以在我的 GitHub 仓库 Programming Fight Club[4] 中找到相应代码。

设置图书结构

我用 Markdown 语法完成了所有的写作,你也可以使用 HTML 标记,但是当 Pandoc 将 Markdown 转换为 ePub 文档时,引入的 HTML 标记越多,出现问题的风险就越高。我的书按照每章一个文件的形式进行组织,用 Markdown 的 H1 标记()声明每章的标题。你也可以在每个文件中放置多个章节,但将它们放在单独的文件中可以更轻松地查找内容并在以后进行更新。

元信息遵循类似的模式,每种输出格式都有自己的元信息文件。元信息文件定义有关文档的信息,例如要添加到 HTML 中的文本或 ePub 的许可证。我将所有 Markdown 文档存储在名为 parts 的文件夹中(这对于用来生成网页和 ePub 的 Makefile 非常重要)。下面以一个例子进行说明,让我们看一下目录,前言和关于本书(分为 toc.mdpreface.md 和 about.md 三个文件)这三部分,为清楚起见,我们将省略其余的章节。

关于本书这部分内容的开头部分类似:

   
   
     
  1. # About this book {-}

  2. ## Who should read this book {-}

  3. Before creating a complex software system one needs to create a solid foundation.

  4. General Responsibility Assignment Software Principles (GRASP) are guidelines to assign

  5. responsibilities to software classes in object-oriented programming.

每一章完成后,下一步就是添加元信息来设置网页和 ePub 的格式。

生成网页

创建 HTML 元信息文件

我创建的网页的元信息文件(web-metadata.yaml)是一个简单的 YAML 文件,其中包含 <head> 标签中的作者、标题、和版权等信息,以及 HTML 文件中开头和结尾的内容。

我建议(至少)包括 web-metadata.yaml 文件中的以下字段:

   
   
     
  1. ---

  2. title: <a href="/grasp-principles/toc/">GRASP principles for the Object-oriented mind</a>

  3. author: Kiko Fernandez-Reyes

  4. rights: 2017 Kiko Fernandez-Reyes, CC-BY-NC-SA 4.0 International

  5. header-includes:

  6. - |

  7.  ```{=html}

  8.  <link href="https://fonts.googleapis.com/css?family=Inconsolata" rel="stylesheet">

  9.  <link href="https://fonts.googleapis.com/css?family=Gentium+Basic|Inconsolata" rel="stylesheet">

  10.  ```

  11. include-before:

  12. - |

  13.  ```{=html}

  14.  <p>If you like this book, please consider

  15.      spreading the word or

  16.      <a href="https://www.buymeacoffee.com/programming">

  17.        buying me a coffee

  18.      </a>

  19.  </p>

  20.  ```

  21. include-after:

  22. - |

  23.  ```{=html}

  24.  <div class="footnotes">

  25.    <hr>

  26.    <div class="container">

  27.        <nav class="pagination" role="pagination">

  28.          <ul>

  29.          <p>

  30.          <span class="page-number">Designed with</span> ❤️  <span class="page-number"> from Uppsala, Sweden</span>

  31.           </p>

  32.           <p>

  33.           <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a>

  34.           </p>

  35.           </ul>

  36.        </nav>

  37.    </div>

  38.  </div>

  39.  ```

  40. ---

下面几个变量需要注意一下:

◈  header-includes 变量包含将要嵌入  <head> 标签的 HTML 文本。
◈ 调用变量后的下一行必须是  - |。再往下一行必须以与  | 对齐的三个反引号开始,否则 Pandoc 将无法识别。 {= html} 告诉 Pandoc 其中的内容是原始文本,不应该作为 Markdown 处理。(为此,需要检查 Pandoc 中的  raw_attribute 扩展是否已启用。要进行此检查,键入  pandoc --list-extensions | grep raw 并确保返回的列表包含名为  + raw_html 的项目,加号表示已启用。)
◈ 变量  include-before 在网页开头添加一些 HTML 文本,此处我请求读者帮忙宣传我的书或给我打赏。
◈  include-after 变量在网页末尾添加原始 HTML 文本,同时显示我的图书许可证。

这些只是其中一部分可用的变量,查看 HTML 中的模板变量(我的文章 Pandoc简介[1] 中介绍了如何查看 LaTeX 的模版变量,查看 HTML 模版变量的过程是相同的)对其余变量进行了解。

将网页分成多章

网页可以作为一个整体生成,这会产生一个包含所有内容的长页面;也可以分成多章,我认为这样会更容易阅读。我将解释如何将网页划分为多章,以便读者不会被长网页吓到。

为了使网页易于在 GitHub Pages 上部署,需要创建一个名为 docs 的根文件夹(这是 GitHub Pages 默认用于渲染网页的根文件夹)。然后我们需要为 docs 下的每一章创建文件夹,将 HTML 内容放在各自的文件夹中,将文件内容放在名为 index.html 的文件中。

例如,about.md 文件将转换成名为 index.html 的文件,该文件位于名为 aboutabout/index.html)的文件夹中。这样,当用户键入 http://<your-website.com>/about/ 时,文件夹中的 index.html 文件将显示在其浏览器中。

下面的 Makefile 将执行上述所有操作:

   
   
     
  1. # Your book files

  2. DEPENDENCIES= toc preface about

  3. # Placement of your HTML files

  4. DOCS=docs

  5. all: web

  6. web: setup $(DEPENDENCIES)

  7.         @cp $(DOCS)/toc/index.html $(DOCS)

  8. # Creation and copy of stylesheet and images into

  9. # the assets folder. This is important to deploy the

  10. # website to Github Pages.

  11. setup:

  12.         @mkdir -p $(DOCS)

  13.         @cp -r assets $(DOCS)

  14. # Creation of folder and index.html file on a

  15. # per-chapter basis

  16. $(DEPENDENCIES):

  17.         @mkdir -p $(DOCS)/$@

  18.         @pandoc -s --toc web-metadata.yaml parts/$@.md \

  19.         -c /assets/pandoc.css -o $(DOCS)/$@/index.html

  20. clean:

  21.         @rm -rf $(DOCS)

  22. .PHONY: all clean web setup

选项 - c /assets/pandoc.css 声明要使用的 CSS 样式表,它将从 /assets/pandoc.cs 中获取。也就是说,在 <head> 标签内,Pandoc 会添加这样一行:

   
   
     
  1. <link rel="stylesheet" href="/assets/pandoc.css">

使用下面的命令生成网页:

   
   
     
  1. make

根文件夹现在应该包含如下所示的文件结构:

   
   
     
  1. .---parts

  2. |    |--- toc.md

  3. |    |--- preface.md

  4. |    |--- about.md

  5. |

  6. |---docs

  7.     |--- assets/

  8.     |--- index.html

  9.     |--- toc

  10.     |     |--- index.html

  11.     |

  12.     |--- preface

  13.     |     |--- index.html

  14.     |

  15.     |--- about

  16.           |--- index.html

  17.    

部署网页

通过以下步骤将网页部署到 GitHub 上:

1. 创建一个新的 GitHub 仓库
2. 将内容推送到新创建的仓库
3. 找到仓库设置中的 GitHub Pages 部分,选择  Source 选项让 GitHub 使用主分支的内容

你可以在 GitHub Pages[5] 的网站上获得更多详细信息。

我的书的网页[6] 便是通过上述过程生成的,可以在网页上查看结果。

生成电子书

创建 ePub 格式的元信息文件

ePub 格式的元信息文件 epub-meta.yaml 和 HTML 元信息文件是类似的。主要区别在于 ePub 提供了其他模板变量,例如 publisher 和 cover-image 。ePub 格式图书的样式表可能与网页所用的不同,在这里我使用一个名为 epub.css 的样式表。

   
   
     
  1. ---

  2. title: 'GRASP principles for the Object-oriented Mind'

  3. publisher: 'Programming Language Fight Club'

  4. author: Kiko Fernandez-Reyes

  5. rights: 2017 Kiko Fernandez-Reyes, CC-BY-NC-SA 4.0 International

  6. cover-image: assets/cover.png

  7. stylesheet: assets/epub.css

  8. ...

将以下内容添加到之前的 Makefile 中:

   
   
     
  1. epub:

  2.         @pandoc -s --toc epub-meta.yaml \

  3.         $(addprefix parts/, $(DEPENDENCIES:=.md)) -o $(DOCS)/assets/book.epub

用于产生 ePub 格式图书的命令从 HTML 版本获取所有依赖项(每章的名称),向它们添加 Markdown 扩展,并在它们前面加上每一章的文件夹路径,以便让 Pandoc 知道如何进行处理。例如,如果 $(DEPENDENCIES 变量只包含 “前言” 和 “关于本书” 两章,那么 Makefile将会这样调用:

   
   
     
  1. @pandoc -s --toc epub-meta.yaml \

  2. parts/preface.md parts/about.md -o $(DOCS)/assets/book.epub

Pandoc 将提取这两章的内容,然后进行组合,最后生成 ePub 格式的电子书,并放在 Assets文件夹中。

这是使用此过程创建 ePub 格式电子书的一个 示例[7]

过程总结

从 Markdown 文件创建网页和 ePub 格式电子书的过程并不困难,但有很多细节需要注意。遵循以下大纲可能使你更容易使用 Pandoc。

◈ HTML 图书:
◈ 使用 Markdown 语法创建每章内容
◈ 添加元信息
◈ 创建一个  Makefile 将各个部分组合在一起
◈ 设置 GitHub Pages
◈ 部署
◈ ePub 电子书:
◈ 使用之前创建的每一章内容
◈ 添加新的元信息文件
◈ 创建一个  Makefile 以将各个部分组合在一起
◈ 设置 GitHub Pages
◈ 部署

via: https://opensource.com/article/18/10/book-to-website-epub-using-pandoc

作者:Kiko Fernandez-Reyes[9] 选题:lujun9972 译者:jlztan 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出


登录查看更多
0

相关内容

Python导论,476页pdf,现代Python计算
专知会员服务
260+阅读 · 2020年5月17日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
117+阅读 · 2020年5月10日
算法与数据结构Python,369页pdf
专知会员服务
161+阅读 · 2020年3月4日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
87+阅读 · 2019年11月25日
如何使用自然语言工具包(NLTK)在Python3中执行情感分析
Python程序员
19+阅读 · 2019年10月28日
支持多标签页的Windows终端:Fluent 终端
Python程序员
7+阅读 · 2019年4月15日
Github项目推荐 | pikepdf - Python的PDF读写库
AI研习社
9+阅读 · 2019年3月29日
Python用法速查网站
Python程序员
17+阅读 · 2018年12月16日
这可能是学习Python最好的免费在线电子书
程序猿
52+阅读 · 2018年5月17日
干货 | Python 爬虫的工具列表大全
机器学习算法与Python学习
10+阅读 · 2018年4月13日
Directions for Explainable Knowledge-Enabled Systems
Arxiv
26+阅读 · 2020年3月17日
Arxiv
7+阅读 · 2018年1月31日
Arxiv
3+阅读 · 2012年11月20日
VIP会员
相关VIP内容
Python导论,476页pdf,现代Python计算
专知会员服务
260+阅读 · 2020年5月17日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
161+阅读 · 2020年5月14日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
117+阅读 · 2020年5月10日
算法与数据结构Python,369页pdf
专知会员服务
161+阅读 · 2020年3月4日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
87+阅读 · 2019年11月25日
相关资讯
如何使用自然语言工具包(NLTK)在Python3中执行情感分析
Python程序员
19+阅读 · 2019年10月28日
支持多标签页的Windows终端:Fluent 终端
Python程序员
7+阅读 · 2019年4月15日
Github项目推荐 | pikepdf - Python的PDF读写库
AI研习社
9+阅读 · 2019年3月29日
Python用法速查网站
Python程序员
17+阅读 · 2018年12月16日
这可能是学习Python最好的免费在线电子书
程序猿
52+阅读 · 2018年5月17日
干货 | Python 爬虫的工具列表大全
机器学习算法与Python学习
10+阅读 · 2018年4月13日
Top
微信扫码咨询专知VIP会员