diff options
Diffstat (limited to 'src/sisudoc/outputs/io_out/source_pod.d')
| -rw-r--r-- | src/sisudoc/outputs/io_out/source_pod.d | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/src/sisudoc/outputs/io_out/source_pod.d b/src/sisudoc/outputs/io_out/source_pod.d index 667e809..b929e06 100644 --- a/src/sisudoc/outputs/io_out/source_pod.d +++ b/src/sisudoc/outputs/io_out/source_pod.d @@ -546,16 +546,33 @@ template spinePod() { return zip; } void zipArchive(M,F,Z)(M doc_matters, F fn_pod, Z zip) { + import sisudoc.ocda.zstd : zstdCompress, ZstdException; auto fn_src_in = doc_matters.src.filename; if (doc_matters.opt.action.pod) { if (exists(doc_matters.src.file_with_absolute_path)) { try { - createZipFile!()(fn_pod, zip.build()); + /+ ↓ the archive is built exactly as before and then wrapped in one + zstd frame. The wrap is here and not in createZipFile, which + also writes every epub and every odt: those are real zips by + their own specifications. + . + The compression gain is in whole-stream rather than per-member + compression. A zip deflates each member on its own with a 32 KB + window, which sees none of the redundancy between multiple language + versions of a document and the catalogues that may repeat the + English (original language): (live-manual is 10.31x smaller this + way, where per-member deflate manages about 3x). + +/ + auto _archive = cast(ubyte[]) zip.build(); + createZipFile!()(fn_pod, + cast(void[]) zstdCompress(_archive, doc_matters.opt.action.pod_compression)); + } catch (ZstdException ex) { + writeln("WARNING failed to compress pod archive: ", fn_pod, " - ", ex.msg); } catch (ErrnoException ex) { // Handle errors } } else { writeln("WARNING check missing source file(s): ", doc_matters.opt.action.pod); } - if (!(exists(fn_pod))) { writeln("WARNING failed to create pod zip archive: ", fn_pod); } + if (!(exists(fn_pod))) { writeln("WARNING failed to create pod archive: ", fn_pod); } } } void zipArchiveDigest(M,F,D)(M doc_matters, F fn_pod, D _digests) { @@ -578,9 +595,9 @@ template spinePod() { if (exists(fn_pod)) { try { auto data = (cast(byte[]) (fn_pod).read); - // if (doc_matters.opt.action.vox_gt_2) { writeln(" ", doc_matters.src.filename, " > ", doc_matters.src.filename_base, ".zip"); } + // if (doc_matters.opt.action.vox_gt_2) { writeln(" ", doc_matters.src.filename, " > ", doc_matters.src.filename_base, pod_archive_suffix); } if (doc_matters.opt.action.pod) { - _zip_digest = (data.sha256Of.toHexString ~ "::" ~ data.length.to!string ~ " - " ~ doc_matters.src.filename_base ~ ".zip"); + _zip_digest = (data.sha256Of.toHexString ~ "::" ~ data.length.to!string ~ " - " ~ doc_matters.src.filename_base ~ pod_archive_suffix); if (doc_matters.opt.action.vox_gt_1) { writeln(" ", _zip_digest); } if (doc_matters.opt.action.vox_gt_1) { writeln(" ", pths_pod.pod_dir_(), "/", doc_matters.src.filename_base, "/"); } if (doc_matters.opt.action.vox_gt_1) { writeln(" ", _digest_fn); } |
