Pandoc合并不同目录下的md文件

1、测试文件目录结构

如下图,每一个目录中有一个单独的章节。


image.png

都是些口水话,这次的md文件带图片,方便演示一般的场景。

2、将不同目录下的md文件合并

运行如下命令:

localhost:01_PandocMergeDocInSeparateDir chengxia$ pandoc 01_GoodsOfCats/01_GoodsOfCats.md 02_HowToFeedCats/02_HowToFeedCats.md 03_GainsFromCats/03_GainsFromCats.md --resource-path="./01_GoodsOfCats/:./02_HowToFeedCats/:./03_GainsFromCats/" --toc --toc-depth=5 --number-sections --embed-resources --standalone -o merge/all.html

其中,--toc --toc-depth=5 --number-sections参数是设置目录,并自动编号,最多的目录支持层级是5级,--embed-resources是指将图片等资源直接嵌入到输出文件(比如将图片用base64编码),--standalone是指生成一个单独的文件(会添加head),-o merge/all.html指定输出到merge/all.html
效果如下:

image.png

从这里,可以看出,在merge目录下生成了一个1.4M的html文件(因为图片资源嵌入了html,所以体积比较大),效果符合预期。
如果想将图片专门存放,可以先用cd切换到目标输出路径(如果不这样,最后html中的图片引用地址有问题),并运行命令。如下:

localhost:01_PandocMergeDocInSeparateDir chengxia$ cd merge/

localhost:merge chengxia$ pandoc ../01_GoodsOfCats/01_GoodsOfCats.md ../02_HowToFeedCats/02_HowToFeedCats.md ../03_GainsFromCats/03_GainsFromCats.md --resource-path="../01_GoodsOfCats/:../02_HowToFeedCats/:../03_GainsFromCats/" --toc --toc-depth=5 --number-sections --standalone --extract-media="./img/" -o all.html

这里,--extract-media="./img/"参数指定图片存放的专门目录。
效果如下:

image.png

可以看出,因为不嵌入图片,这次输出的html小了很多。

3、合并md文件并用文件名作为一级标题

如果我们想,将文件名作为合并后文件的一级标题,然后将各个文件中的标题层级都下移一层,该如何处理?由于没有找到pandoc比较好的支持,这里换一个思路,改成先用awk处理md文件,然后用pandoc合并。

3.1 用awk处理md文件

3.1.1 awk命令将文件名插入到原md文件作为一级标题

执行如下命令可以将文件名插入到md文件,并修改元文件中的标题层级:

awk 'NR==1{sub(/^#/,"”##");print "# "substr(FILENAME, 1, length(FILENAME)-3)"\n" $0}NR!=1{sub(/^#/,"##");print $0}' ../02_HowToFeedCats/02_HowToFeedCats.md

效果如下:

localhost:merge chengxia$ cat ../02_HowToFeedCats/02_HowToFeedCats.md

第二章,主要讲如何养猫

  

# 1、如何养猫

需要给猫准备稳定的住所,准备猫砂盆、水碗和食盆。

![02_AMiddleCat](02_AMiddleCat.png)
localhost:merge chengxia$ awk 'NR==1{sub(/^#/,"”##");print "# "substr(FILENAME, 1, length(FILENAME)-3)"\n" $0}NR!=1{sub(/^#/,"##");print $0}' ../02_HowToFeedCats/02_HowToFeedCats.md

# ../02_HowToFeedCats/02_HowToFeedCats

第二章,主要讲如何养猫

  

## 1、如何养猫

需要给猫准备稳定的住所,准备猫砂盆、水碗和食盆。

![02_AMiddleCat](02_AMiddleCat.png)

localhost:merge chengxia$

3.1.2 处理掉一级标题中的目录和原文件中的标题编号

执行如下命令:

localhost:merge chengxia$ awk 'NR==1{sub(/^#/,"\n##");sub(/# [0-9\.、\s]/,"# ");match(substr(FILENAME, 1, length(FILENAME)-3),"/.+_");print "\n# "substr(substr(FILENAME, 1, length(FILENAME)-3),RSTART+RLENGTH)"\n" $0}NR!=1{sub(/^#/,"\n##");sub(/# [0-9\.、 ]+/,"# ");print $0}' ../02_HowToFeedCats/02_HowToFeedCats.md

  

# HowToFeedCats

第二章,主要讲如何养猫

  

  

## 如何养猫

需要给猫准备稳定的住所,准备猫砂盆、水碗和食盆。

![02_AMiddleCat](02_AMiddleCat.png)

localhost:merge chengxia$

到这里md文件的格式调整完成,下面进行合并。

3.2 合并

运行如下命令:

localhost:merge chengxia$ for f in ../01_GoodsOfCats/01_GoodsOfCats.md ../02_HowToFeedCats/02_HowToFeedCats.md ../03_GainsFromCats/03_GainsFromCats.md; do awk 'NR==1{sub(/^#/,"\n##");sub(/# [0-9\.、\s]/,"# ");match(substr(FILENAME, 1, length(FILENAME)-3),"/.+_");print "\n# "substr(substr(FILENAME, 1, length(FILENAME)-3),RSTART+RLENGTH)"\n" $0}NR!=1{sub(/^#/,"\n##");sub(/# [0-9\.、 ]+/,"# ");print $0}' $f; done |  pandoc --resource-path="../01_GoodsOfCats/:../02_HowToFeedCats/:../03_GainsFromCats/" --toc --toc-depth=5 --number-sections --standalone --extract-media="./img/" --metadata title="养猫指南" --metadata author="没泡泡" -o all.html

localhost:merge chengxia$

效果如下:


image.png

可以看出,将第一章中的metadata一并显示了,这里先修改下第一章,去掉metadata。修改后01_PandocMergeDocInSeparateDir/01_GoodsOfCats/01_GoodsOfCatsV2.md

第一章,主要介绍养猫的好处。  
  
# 1、养猫的好处  
养猫可以培养人的爱心和耐心。养猫同样可以给人带来愉悦的身心和放松的心情。养猫的过程,其实是一个和自己相处,然后和解,最后接纳的过程。  
![01_AGoodCat](01_AGoodCat.png)

然后,再执行如下命令:

localhost:merge chengxia$ for f in ../01_GoodsOfCats/01_GoodsOfCatsV2.md ../02_HowToFeedCats/02_HowToFeedCats.md ../03_GainsFromCats/03_GainsFromCats.md; do awk 'NR==1{sub(/^#/,"\n##");sub(/# [0-9\.、\s]/,"# ");match(substr(FILENAME, 1, length(FILENAME)-3),"/.+_");print "\n# "substr(substr(FILENAME, 1, length(FILENAME)-3),RSTART+RLENGTH)"\n" $0}NR!=1{sub(/^#/,"\n##");sub(/# [0-9\.、 ]+/,"# ");print $0}' $f; done |  pandoc --resource-path="../01_GoodsOfCats/:../02_HowToFeedCats/:../03_GainsFromCats/" --toc --toc-depth=5 --number-sections --standalone --extract-media="./img/" --metadata title="养猫指南" --metadata author="美泡泡" -o all.html

localhost:merge chengxia$

效果如下:


image.png

3.3 合并为md文件

运行如下命令,也可以将分开写的md文件,合并成一个:

$ for f in ../01_GoodsOfCats/01_GoodsOfCatsV2.md ../02_HowToFeedCats/02_HowToFeedCats.md ../03_GainsFromCats/03_GainsFromCats.md; do awk 'NR==1{sub(/^#/,"\n##");sub(/# [0-9\.、\s]/,"# ");match(substr(FILENAME, 1, length(FILENAME)-3),"/.+_");print "\n# "substr(substr(FILENAME, 1, length(FILENAME)-3),RSTART+RLENGTH)"\n" $0}NR!=1{sub(/^#/,"\n##");sub(/# [0-9\.、 ]+/,"# ");print $0}' $f; done |pandoc --resource-path="../01_GoodsOfCats/:../02_HowToFeedCats/:../03_GainsFromCats/" --extract-media="./img/" --metadata title="养猫指南" --metadata author="美泡泡" -o all.md

ChengdeMacBook-Pro:merge chengxia$

合并后的效果如下:


image.png

4、Pandoc参数说明

采用--number-offset参数可以指定md生成html时,标题的起始编号。说明文档中描述如下:

--number-offset=NUMBER[,NUMBER,…]
Offset for section headings in HTML output (ignored in other output formats). The first number is added to the section number for top-level headings, the second for second-level headings, and so on. So, for example, if you want the first top-level heading in your document to be numbered “6”, specify --number-offset=5. If your document starts with a level-2 heading which you want to be numbered “1.5”, specify --number-offset=1,4. Offsets are 0 by default. Implies --number-sections.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容