Minimal Zig library for creating EPUB files
- C libs dependencies: libzip 1.11.2
- Required Zig version: 0.13
- Epub version:
2.0.1
- This library has been developed on and for
Linux
following open source philosophy.
This library will generate an epub with the following compressed files:
- META-INF/
- container.xml
- OEBPS/
- images/
- some_image.png
- toc.ncx
- content.opf
- SomeChapter.xhtml
- stylesheet.css
- images/
- mimetype
- Simple example. More examples here
const std = @import("std");
const epub = @import("epub");
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{}){};
defer if (gpa.deinit() != .ok) @panic("leak");
const allocator = gpa.allocator();
var my_epub = epub.Epub.init(allocator, .{
.title = "Flying Circus",
.creator = "Johann Gambolputty",
.identifier = .{
.identifier_type = .UUID,
.value = "d5b2b585-566a-4b9c-9c5d-f99436e3a588",
},
});
defer my_epub.deinit();
var image_paths = [_][]const u8{
"/home/user/Downloads/image.jpg",
"/home/user/Downloads/image2.png",
};
var section = epub.Section.init(allocator, "Chapter 1", .{ .raw = "<h1>Chapter 1</h1>\n<p>Hello</p>\n<h1 id=\"chapter1.1\">Chapter 1.1</h1>" });
defer section.deinit();
try my_epub
.setStylesheet(.{ .raw = "body { background-color: #000000 }" })
.setCoverImage(.{ .path = "/home/user/Downloads/cats.jpg", .image_type = .jpg })
.setImages(&image_paths)
.setCover(.{ .raw = "<div class=\"cover\"><img src=\"images/cats.jpg\" alt=\"Cover Image\"/></div>" })
.addSectionType("Preface", .{ .raw = "<p>preface</p>\n" }, .Preface)
.add(section.addToc(.{ .text = "Chapter 1.1", .reference_id = "chapter1.1" }).build())
.addSection("Chapter 2", .{ .raw = "<h1>Chapter 2</h1>\n<p>Bye</p>\n" })
.generate("book.epub"); // This could be a existent path to some folder (absolute or relative). Ex: "/path/to/book.epub"
}
- Only one level of subsection is available when using Table of Contents at the moment. Ex: Chapter 1 -> Chapter 1.1, Chapter 1.2, etc.
- An Epub is just a compressed file. Using a tool like
unzip
or similar could be useful to see the content and files generated. - Every xhtml (cover and sections) will have the tag with an id formed by the name of the section without spaces plus -body. Helpful when using some css on it.
- Ex: Section named "Chapter 1" will have
<body id="Chapter1-body">
- Ex: Section named "Chapter 1" will have
.dependencies = .{
.epub = .{
.url = "https://github.com/javiorfo/zig-epub/archive/refs/heads/master.tar.gz",
// .hash = "hash suggested",
// the hash will be suggested by zig build
},
}
const dep = b.dependency("epub", .{
.target = target,
.optimize = optimize,
});
exe.root_module.addImport("epub", dep.module("epub"));
exe.linkLibC();
exe.linkSystemLibrary("zip");