From f8b547f92e4d4da665b2c2f5757b39e53c60e042 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Tue, 11 Feb 2025 12:55:30 -0800 Subject: [PATCH] Revert "Fixed documentation generation in `list-actions --docs` command (#4974)" This reverts commit f3d0c7c2ad01968de5191ccfae09a25e5c760760, reversing changes made to 4b77a1c71e7994f6c040c4bee8a9e0b3d77b6286. --- src/build/webgen/main_actions.zig | 54 ++++++++++++++- src/cli/list_actions.zig | 16 ++++- src/input/Binding.zig | 6 +- src/input/helpgen_actions.zig | 107 ------------------------------ 4 files changed, 69 insertions(+), 114 deletions(-) delete mode 100644 src/input/helpgen_actions.zig diff --git a/src/build/webgen/main_actions.zig b/src/build/webgen/main_actions.zig index 65420d7e2..f4dffbc13 100644 --- a/src/build/webgen/main_actions.zig +++ b/src/build/webgen/main_actions.zig @@ -1,8 +1,58 @@ const std = @import("std"); const help_strings = @import("help_strings"); -const helpgen_actions = @import("../../helpgen_actions.zig"); +const KeybindAction = @import("../../input/Binding.zig").Action; pub fn main() !void { const output = std.io.getStdOut().writer(); - try helpgen_actions.generate(output, .markdown, std.heap.page_allocator); + try genKeybindActions(output); +} + +pub fn genKeybindActions(writer: anytype) !void { + // Write the header + try writer.writeAll( + \\--- + \\title: Keybinding Action Reference + \\description: Reference of all Ghostty keybinding actions. + \\editOnGithubLink: https://github.com/ghostty-org/ghostty/edit/main/src/input/Binding.zig + \\--- + \\ + \\This is a reference of all Ghostty keybinding actions. + \\ + \\ + ); + + @setEvalBranchQuota(5_000); + + var buffer = std.ArrayList(u8).init(std.heap.page_allocator); + defer buffer.deinit(); + + const fields = @typeInfo(KeybindAction).Union.fields; + inline for (fields) |field| { + if (field.name[0] == '_') continue; + + // Write previously stored doc comment below all related actions + if (@hasDecl(help_strings.KeybindAction, field.name)) { + try writer.writeAll(buffer.items); + try writer.writeAll("\n"); + + buffer.clearRetainingCapacity(); + } + + // Write the field name. + try writer.writeAll("## `"); + try writer.writeAll(field.name); + try writer.writeAll("`\n"); + + if (@hasDecl(help_strings.KeybindAction, field.name)) { + var iter = std.mem.splitScalar( + u8, + @field(help_strings.KeybindAction, field.name), + '\n', + ); + while (iter.next()) |s| { + try buffer.appendSlice(s); + try buffer.appendSlice("\n"); + } + } + } } diff --git a/src/cli/list_actions.zig b/src/cli/list_actions.zig index 429480277..6f67a92d2 100644 --- a/src/cli/list_actions.zig +++ b/src/cli/list_actions.zig @@ -2,7 +2,7 @@ const std = @import("std"); const args = @import("args.zig"); const Action = @import("action.zig").Action; const Allocator = std.mem.Allocator; -const helpgen_actions = @import("../helpgen_actions.zig"); +const help_strings = @import("help_strings"); pub const Options = struct { /// If `true`, print out documentation about the action associated with the @@ -38,7 +38,19 @@ pub fn run(alloc: Allocator) !u8 { } const stdout = std.io.getStdOut().writer(); - try helpgen_actions.generate(stdout, .plaintext, std.heap.page_allocator); + const info = @typeInfo(help_strings.KeybindAction); + inline for (info.Struct.decls) |field| { + try stdout.print("{s}", .{field.name}); + if (opts.docs) { + try stdout.print(":\n", .{}); + var iter = std.mem.splitScalar(u8, std.mem.trimRight(u8, @field(help_strings.KeybindAction, field.name), &std.ascii.whitespace), '\n'); + while (iter.next()) |line| { + try stdout.print(" {s}\n", .{line}); + } + } else { + try stdout.print("\n", .{}); + } + } return 0; } diff --git a/src/input/Binding.zig b/src/input/Binding.zig index bef2ef613..90ea436af 100644 --- a/src/input/Binding.zig +++ b/src/input/Binding.zig @@ -236,9 +236,9 @@ pub const Action = union(enum) { /// Send an `ESC` sequence. esc: []const u8, - /// Send the given text. Uses Zig string literal syntax. This is currently - /// not validated. If the text is invalid (i.e. contains an invalid escape - /// sequence), the error will currently only show up in logs. + // Send the given text. Uses Zig string literal syntax. This is currently + // not validated. If the text is invalid (i.e. contains an invalid escape + // sequence), the error will currently only show up in logs. text: []const u8, /// Send data to the pty depending on whether cursor key mode is enabled diff --git a/src/input/helpgen_actions.zig b/src/input/helpgen_actions.zig deleted file mode 100644 index 9a7612b57..000000000 --- a/src/input/helpgen_actions.zig +++ /dev/null @@ -1,107 +0,0 @@ -//! This module is a help generator for keybind actions documentation. -//! It can generate documentation in different formats (plaintext for CLI, -//! markdown for website) while maintaining consistent content. - -const std = @import("std"); -const KeybindAction = @import("Binding.zig").Action; -const help_strings = @import("help_strings"); - -/// Format options for generating keybind actions documentation -pub const Format = enum { - /// Plain text output with indentation - plaintext, - /// Markdown formatted output - markdown, - - fn formatFieldName(self: Format, writer: anytype, field_name: []const u8) !void { - switch (self) { - .plaintext => { - try writer.writeAll(field_name); - try writer.writeAll(":\n"); - }, - .markdown => { - try writer.writeAll("## `"); - try writer.writeAll(field_name); - try writer.writeAll("`\n"); - }, - } - } - - fn formatDocLine(self: Format, writer: anytype, line: []const u8) !void { - switch (self) { - .plaintext => { - try writer.appendSlice(" "); - try writer.appendSlice(line); - try writer.appendSlice("\n"); - }, - .markdown => { - try writer.appendSlice(line); - try writer.appendSlice("\n"); - }, - } - } - - fn header(self: Format) ?[]const u8 { - return switch (self) { - .plaintext => null, - .markdown => - \\--- - \\title: Keybinding Action Reference - \\description: Reference of all Ghostty keybinding actions. - \\editOnGithubLink: https://github.com/ghostty-org/ghostty/edit/main/src/input/Binding.zig - \\--- - \\ - \\This is a reference of all Ghostty keybinding actions. - \\ - \\ - , - }; - } -}; - -/// Generate keybind actions documentation with the specified format -pub fn generate( - writer: anytype, - format: Format, - page_allocator: std.mem.Allocator, -) !void { - if (format.header()) |header| { - try writer.writeAll(header); - } - - var buffer = std.ArrayList(u8).init(page_allocator); - defer buffer.deinit(); - - const fields = @typeInfo(KeybindAction).Union.fields; - inline for (fields) |field| { - if (field.name[0] == '_') continue; - - // Write previously stored doc comment below all related actions - if (@hasDecl(help_strings.KeybindAction, field.name)) { - try writer.writeAll(buffer.items); - try writer.writeAll("\n"); - - buffer.clearRetainingCapacity(); - } - - try format.formatFieldName(writer, field.name); - - if (@hasDecl(help_strings.KeybindAction, field.name)) { - var iter = std.mem.splitScalar( - u8, - @field(help_strings.KeybindAction, field.name), - '\n', - ); - while (iter.next()) |s| { - // If it is the last line and empty, then skip it. - if (iter.peek() == null and s.len == 0) continue; - try format.formatDocLine(&buffer, s); - } - } - } - - // Write any remaining buffered documentation - if (buffer.items.len > 0) { - try writer.writeAll(buffer.items); - } -}