diff options
author | kdx <kikoodx@paranoici.org> | 2024-03-07 21:06:10 +0100 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2024-03-07 21:06:10 +0100 |
commit | 5eb11ec4759b478a8f1c296aa0b6c6ba00515bcc (patch) | |
tree | f9a183a20613a270a8b55b11ae15b4702d11cef6 | |
parent | 88a98bba546d8c5e6d30034fae4b57c311e67a91 (diff) | |
download | gallery-gen-5eb11ec4759b478a8f1c296aa0b6c6ba00515bcc.tar.gz |
i'm going insane
-rw-r--r-- | src/Image.zig | 7 | ||||
-rw-r--r-- | src/main.zig | 60 | ||||
-rw-r--r-- | src/template.zig | 63 |
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>"); +} |