summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2024-03-07 21:06:10 +0100
committerkdx <kikoodx@paranoici.org>2024-03-07 21:06:10 +0100
commit5eb11ec4759b478a8f1c296aa0b6c6ba00515bcc (patch)
treef9a183a20613a270a8b55b11ae15b4702d11cef6
parent88a98bba546d8c5e6d30034fae4b57c311e67a91 (diff)
downloadgallery-gen-5eb11ec4759b478a8f1c296aa0b6c6ba00515bcc.tar.gz
i'm going insane
-rw-r--r--src/Image.zig7
-rw-r--r--src/main.zig60
-rw-r--r--src/template.zig63
3 files changed, 110 insertions, 20 deletions
diff --git a/src/Image.zig b/src/Image.zig
index 99f0382..12cf8e3 100644
--- a/src/Image.zig
+++ b/src/Image.zig
@@ -3,8 +3,10 @@ const std = @import("std");
const Self = @This();
s: []u8,
+format: Format = .none,
pub const Format = enum {
+ none,
png,
jpg,
webp,
@@ -12,6 +14,7 @@ pub const Format = enum {
fn str(self: Format) []const u8 {
return switch (self) {
+ .none => unreachable,
.png => "png",
.jpg => "jpg",
.webp => "webp",
@@ -35,8 +38,8 @@ pub fn name(self: Self) []u8 {
return self.s[0 .. self.s.len - 5];
}
-pub fn path(self: Self, fmt: Format) []u8 {
- const ext = fmt.str();
+pub fn path(self: Self, fmt: ?Format) []u8 {
+ const ext = if (fmt != null) fmt.?.str() else self.format.str();
@memcpy(self.s[self.s.len - 4 .. self.s.len - 4 + ext.len], ext);
return self.s[0 .. self.s.len - 4 + ext.len];
}
diff --git a/src/main.zig b/src/main.zig
index ac1c5cb..b331ca7 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -1,5 +1,6 @@
const std = @import("std");
const Image = @import("Image.zig");
+const template = @import("template.zig");
pub fn main() !void {
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
@@ -12,23 +13,46 @@ pub fn main() !void {
break :blk try list.readToEndAlloc(allocator, 4096 * 4096);
};
- var tokens = std.mem.tokenizeAny(u8, list, ",\n");
- while (tokens.next()) |tok| {
- const img = try Image.init(allocator, tok);
- defer img.deinit(allocator);
-
- const ext = ext: {
- const exts = [_]Image.Format{ .png, .webp, .jpg };
- for (exts) |e| {
- const path = img.path(e);
- const exist = blk: {
- std.fs.cwd().access(path, .{}) catch break :blk false;
- break :blk true;
- };
- if (exist) break :ext e;
- }
- unreachable;
- };
- std.log.debug("{s} {}", .{ img.name(), ext });
+ const size = size: {
+ var size: usize = 0;
+ var tokens = std.mem.tokenizeAny(u8, list, ",\n");
+ while (tokens.next()) |_| size += 1;
+ break :size size;
+ };
+
+ var images = try allocator.alloc(Image, size);
+
+ {
+ var tokens = std.mem.tokenizeAny(u8, list, ",\n");
+ var i: usize = 0;
+ while (tokens.next()) |tok| : (i += 1) {
+ var img = try Image.init(allocator, tok);
+
+ img.format = ext: {
+ const exts = [_]Image.Format{ .png, .webp, .jpg };
+ for (exts) |e| {
+ const path = img.path(e);
+ const exist = blk: {
+ std.fs.cwd().access(path, .{}) catch break :blk false;
+ break :blk true;
+ };
+ if (exist) break :ext e;
+ }
+ unreachable;
+ };
+
+ images[i] = img;
+ }
+ }
+
+ for (images, 0..) |img, i| {
+ var file = try std.fs.cwd().createFile(img.path(.html), .{});
+ defer file.close();
+ try template.write(
+ file.writer().any(),
+ img,
+ if (i == 0) null else images[i - 1],
+ if (i == images.len - 1) null else images[i + 1],
+ );
}
}
diff --git a/src/template.zig b/src/template.zig
new file mode 100644
index 0000000..4da82c2
--- /dev/null
+++ b/src/template.zig
@@ -0,0 +1,63 @@
+const std = @import("std");
+const Image = @import("Image.zig");
+
+const template0 =
+ \\<!DOCTYPE html>
+ \\<html>
+ \\ <head>
+ \\ <meta charset="utf-8"><link rel="stylesheet" href="/gallery.css" />
+ \\ <title>{s}</title>
+ \\ </head>
+ \\ <body>
+ \\ <div class="group">
+ \\ <div class="header">
+ \\ <h1><a href="/">~kdx</a>/<a href="/gallery">gallery</a>/{s}</h1>
+;
+const template1 =
+ \\ </div>
+ \\ <div class="image"
+ \\ style="background-image: url('/gallery/{s}');">
+ \\ </div>
+ \\ <div class="footer">
+;
+const template2 =
+ \\ </div>
+ \\ </div>
+ \\ </body>
+ \\</html>
+;
+
+const template_prevnext =
+ \\ <p><a href="/gallery/{s}">← prev</a> |
+ \\ <a href="/gallery/{s}">next →</a><br /></p>
+;
+
+pub fn write(
+ writer: std.io.AnyWriter,
+ image: Image,
+ previous: ?Image,
+ next: ?Image,
+) !void {
+ try writer.print(template0, .{ image.name(), image.name() });
+ try prevnext(writer, previous, next);
+ try writer.print(template1, .{image.path(null)});
+ try prevnext(writer, previous, next);
+ _ = try writer.write(template2);
+}
+
+fn prevnext(writer: std.io.AnyWriter, previous: ?Image, next: ?Image) !void {
+ if (previous != null)
+ try writer.print(
+ " <p><a href=\"/gallery/{s}\">← prev</a> | ",
+ .{previous.?.name()},
+ )
+ else
+ _ = try writer.write(" <p>← prev | ");
+ if (next != null)
+ try writer.print(
+ " <a href=\"/gallery/{s}\">next →</a></p>",
+ .{next.?.name()},
+ )
+ else
+ _ = try writer.write(" next →</p>");
+}