diff --git a/src/content.zig b/src/content.zig index ca02137..815b698 100644 --- a/src/content.zig +++ b/src/content.zig @@ -3,10 +3,10 @@ pub fn Content(App: type) type { allocator: Allocator, document: *const App.Model.Document, - pub fn init(allocator: Allocator) @This() { + pub fn init(allocator: Allocator, document: *const App.Model.Document) @This() { return .{ .allocator = allocator, - .document = undefined, + .document = document, }; } @@ -22,6 +22,9 @@ pub fn Content(App: type) type { } fn minSize(ctx: *anyopaque, size: zterm.Point) zterm.Point { + // TODO what about that initial size? seems wrong! + if (size.x == 0 or size.y == 0) return size; + const this: *const @This() = @ptrCast(@alignCast(ctx)); const text = this.document.content; var index: usize = 0; diff --git a/src/main.zig b/src/main.zig index 1dabe48..205f792 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,3 +1,4 @@ +// usage: tui_website pub fn main() !void { errdefer |err| log.err("Application Error: {any}", .{err}); @@ -6,6 +7,12 @@ pub fn main() !void { const allocator = gpa.allocator(); + var arg_it = try std.process.argsWithAllocator(allocator); + errdefer arg_it.deinit(); + + // skip own executable name + _ = arg_it.skip(); + var app: App = .init(.{ .page = .about, .document = .init(try std.fs.cwd().readFileAlloc("./doc/about.md", allocator, .unlimited)), @@ -66,7 +73,7 @@ pub fn main() !void { } // main actual tui_website page content { - var content: Content = .init(allocator); + var content: Content = .init(allocator, &app.model.document); content_container = try .init(allocator, .{}, content.element()); var scrollable: App.Scrollable = .init(content_container, .enabled(.green, false)); @@ -92,33 +99,54 @@ pub fn main() !void { try app.start(); defer app.stop() catch |err| log.err("Failed to stop application: {any}", .{err}); + if (arg_it.next()) |path| { + // TODO check path is only pointing to allowed files? + // - only *markdown* files (file extension `.md`) + // - only in a specific path / directory? + // -> enforce a specific structure? + // -> in case an invalid path is provided the 404 error page shall be shown + // -> reporte an corresponding error! (such that I can see that in the log) + app.postEvent(.{ .blog = try allocator.dupe(u8, path) }); + } + arg_it.deinit(); + // event loop - while (true) { + loop: while (true) { + // batch events since last iteration + const len = blk: { + app.queue.poll(); + app.queue.lock(); + defer app.queue.unlock(); + break :blk app.queue.len(); + }; + // handle events - const event = app.nextEvent(); + for (0..len) |_| { + const event = app.queue.pop(); - // pre event handling - switch (event) { - .key => |key| { - if (key.eql(.{ .cp = 'c', .mod = .{ .ctrl = true } })) app.quit(); - // test if the event handling is working correctly - if (key.eql(.{ .cp = zterm.input.Space })) app.postEvent(.{ .blog = allocator.dupe(u8, "./doc/test.md") catch unreachable }); - }, - .err => |err| log.err("Received {s} with message: {s}", .{ @errorName(err.err), err.msg }), - else => {}, - } + // pre event handling + switch (event) { + .key => |key| { + if (key.eql(.{ .cp = 'c', .mod = .{ .ctrl = true } })) app.quit(); + // test if the event handling is working correctly + if (key.eql(.{ .cp = zterm.input.Space })) app.postEvent(.{ .blog = allocator.dupe(u8, "./doc/test.md") catch unreachable }); + }, + .err => |err| log.err("Received {s} with message: {s}", .{ @errorName(err.err), err.msg }), + else => {}, + } - container.handle(&app.model, event) catch |err| app.postEvent(.{ - .err = .{ - .err = err, - .msg = "Container Event handling failed", - }, - }); + container.handle(&app.model, event) catch |err| app.postEvent(.{ + .err = .{ + .err = err, + .msg = "Container Event handling failed", + }, + }); - // post event handling - switch (event) { - .quit => break, - else => {}, + // post event handling + switch (event) { + .quit => break :loop, + else => {}, + } } container.resize(try renderer.resize());