Skip to main content

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

通过 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 文件,其中包含  标签中的作者、标题、和版权等信息,以及 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.  
  9.  
  10.  ```
  11. include-before:
  12. - |
  13.  ```{=html}
  14.  If you like this book, please consider
  15.      spreading the word or
  16.      
  17.        buying me a coffee
  18.      
  •  
  •  ```
  • include-after:
  • - |
  •  ```{=html}
  •  
  •    
  •    
  •        
  •          
    •          
    •          Designed with ❤️   from Uppsala, Sweden
    •          
    •          
    •           Creative Commons License
    •          
    •          
    •        
    •    
    •  
    •  ```
    • ---
    • 下面几个变量需要注意一下:
      ◈ header-includes 变量包含将要嵌入  标签的 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:///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 中获取。也就是说,在  标签内,Pandoc 会添加这样一行:
      1. 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

      Comments

      Popular posts from this blog

      OWASP Top 10 Threats and Mitigations Exam - Single Select

      Last updated 4 Aug 11 Course Title: OWASP Top 10 Threats and Mitigation Exam Questions - Single Select 1) Which of the following consequences is most likely to occur due to an injection attack? Spoofing Cross-site request forgery Denial of service   Correct Insecure direct object references 2) Your application is created using a language that does not support a clear distinction between code and data. Which vulnerability is most likely to occur in your application? Injection   Correct Insecure direct object references Failure to restrict URL access Insufficient transport layer protection 3) Which of the following scenarios is most likely to cause an injection attack? Unvalidated input is embedded in an instruction stream.   Correct Unvalidated input can be distinguished from valid instructions. A Web application does not validate a client’s access to a resource. A Web action performs an operation on behalf of the user without checking a shared sec

      CKA Simulator Kubernetes 1.22

        https://killer.sh Pre Setup Once you've gained access to your terminal it might be wise to spend ~1 minute to setup your environment. You could set these: alias k = kubectl                         # will already be pre-configured export do = "--dry-run=client -o yaml"     # k get pod x $do export now = "--force --grace-period 0"   # k delete pod x $now Vim To make vim use 2 spaces for a tab edit ~/.vimrc to contain: set tabstop=2 set expandtab set shiftwidth=2 More setup suggestions are in the tips section .     Question 1 | Contexts Task weight: 1%   You have access to multiple clusters from your main terminal through kubectl contexts. Write all those context names into /opt/course/1/contexts . Next write a command to display the current context into /opt/course/1/context_default_kubectl.sh , the command should use kubectl . Finally write a second command doing the same thing into /opt/course/1/context_default_no_kubectl.sh , but without the use of k

      标 题: 关于Daniel Guo 律师

      发信人: q123452017 (水天一色), 信区: I140 标  题: 关于Daniel Guo 律师 关键字: Daniel Guo 发信站: BBS 未名空间站 (Thu Apr 26 02:11:35 2018, 美东) 这些是lz根据亲身经历在 Immigration版上发的帖以及一些关于Daniel Guo 律师的回 帖,希望大家不要被一些马甲帖广告帖所骗,慎重考虑选择律师。 WG 和Guo两家律师对比 1. fully refund的合约上的区别 wegreened家是case不过只要第二次没有file就可以fully refund。郭家是要两次case 没过才给refund,而且只要第二次pl draft好律师就可以不退任何律师费。 2. 回信速度 wegreened家一般24小时内回信。郭律师是在可以快速回复的时候才回复很快,对于需 要时间回复或者是不愿意给出确切答复的时候就回复的比较慢。 比如:lz问过郭律师他们律所在nsc区域最近eb1a的通过率,大家也知道nsc现在杀手如 云,但是郭律师过了两天只回复说让秘书update最近的case然后去网页上查,但是上面 并没有写明tsc还是nsc。 lz还问过郭律师关于准备ps (他要求的文件)的一些问题,模版上有的东西不是很清 楚,但是他一般就是把模版上的东西再copy一遍发过来。 3. 材料区别 (推荐信) 因为我只收到郭律师写的推荐信,所以可以比下两家推荐信 wegreened家推荐信写的比较长,而且每封推荐信会用不同的语气和风格,会包含lz写 的research summary里面的某个方面 郭家四封推荐信都是一个格式,一种语气,连地址,信的称呼都是一样的,怎么看四封 推荐信都是同一个人写出来的。套路基本都是第一段目的,第二段介绍推荐人,第三段 某篇或几篇文章的abstract,最后结论 4. 前期材料准备 wegreened家要按照他们的模版准备一个十几页的research summary。 郭律师在签约之前说的是只需要准备五页左右的summary,但是在lz签完约收到推荐信 ,郭律师又发来一个很长的ps要lz自己填,而且和pl的格式基本差不多。 总结下来,申请自己上心最重要。但是如果选律师,lz更倾向于wegreened,