问题描述
My Jekyll 页面旨在为编程书籍的练习提供示例解决方案。 解决方案是将一堆 .cpp 文件(C++ 代码文件)存储在我的 Jekyll 项目中的一个文件夹中,以便我可以在 IDE 中打开同一个文件夹。
我设法为每本书章节自动生成一页,将相关解决方案显示为代码块列表(每个练习一个)。我通过循环遍历 site.static_files
并通过文件名中的数字识别文件(例如,第 1 章的两个解决方案:01_1_FirstSolution.cpp
、01_2_SecondSolution.cpp
)
现在,我还想为包含相关 .cpp 文件的每本书章节提供一个 zip 存档。我不想手动制作 zip 文件,因为那样我将无法再简单地更改其中一个代码文件。理想情况下,我想在循环 site.static_files
并过滤相关文件的同时构建一个 zip 文件。
在搜索这个时,我主要找到了用于捆绑和压缩资产的速度优化插件。我在 Windows 上运行 Jekyll。
解决方法
如果可以获取文件的内容(fetch 等),您可以使用 JSZip 库将它们打包成 Zip。我不确定这在 jekyll 中是否适合您...但我会尝试这样做。
要尝试示例,只需创建一个 html 文件或 open my example with fetch。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.6.0/jszip.min.js" integrity="sha512-uVSVjE7zYsGz4ag0HEzfugJ78oHCI1KhdkivjQro8ABL/PRiEO4ROwvrolYAcZnky0Fl/baWKYilQfWvESliRA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script type="module" src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.0/FileSaver.min.js" integrity="sha512-csNcFYJniKjJxRWRV1R7fvnXrycHP6qDR21mgz1ZP55xY5d+aHLfo9/FcGDQLfn2IfngbAHd8LdfsagcCqgTcQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
</head>
<body>
<script>
var zip = new JSZip();
zip.file("Hello.txt","Hello World\n");
zip.file("Hello2.txt","Hello2 World\n");
//var img = zip.folder("images");
//img.file("smile.gif",imgData,{base64: true});
zip.generateAsync({type:"blob"})
.then((content) => {
// see FileSaver.js
saveAs(content,"example.zip");
});
</script>
</body>
</html>
,
Jekyll 是一个主要的静态网站构建器,因此在使用 Jekyll 构建之前运行程序或 shell 脚本并将它们输出到您希望输出到的 site.static_files
位置可能是理想的选择。
您可以在运行 Jekyll 之前使用脚本来压缩文件,然后运行 Jekyll 构建过程。
您还可以编写 Generator plugins 来实现类似的结果,使用插件或 Ruby 的 system
命令将脚本作为构建的一部分运行。