From ef31d8f48fa1b7ff5bd4cd57e812fd9c91fd1bd9 Mon Sep 17 00:00:00 2001 From: HydroH Date: Tue, 26 Mar 2024 06:20:15 +0800 Subject: [PATCH] autodoc: better indentation handling when rendering source code (#19422) Closes #19293 --- lib/docs/wasm/main.zig | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/lib/docs/wasm/main.zig b/lib/docs/wasm/main.zig index 496fd618d5..d78f00a004 100644 --- a/lib/docs/wasm/main.zig +++ b/lib/docs/wasm/main.zig @@ -938,6 +938,17 @@ fn file_source_html( var cursor: usize = token_starts[start_token]; + var indent: usize = 0; + if (std.mem.lastIndexOf(u8, ast.source[0..cursor], "\n")) |newline_index| { + for (ast.source[newline_index + 1 .. cursor]) |c| { + if (c == ' ') { + indent += 1; + } else { + break; + } + } + } + for ( token_tags[start_token..end_token], token_starts[start_token..end_token], @@ -947,7 +958,7 @@ fn file_source_html( if (std.mem.trim(u8, between, " \t\r\n").len > 0) { if (!options.skip_comments) { try out.appendSlice(gpa, ""); - try appendEscaped(out, between); + try appendUnindented(out, between, indent); try out.appendSlice(gpa, ""); } } else if (between.len > 0) { @@ -955,7 +966,7 @@ fn file_source_html( if (out.items.len > 0 and out.items[out.items.len - 1] != ' ') try out.append(gpa, ' '); } else { - try out.appendSlice(gpa, between); + try appendUnindented(out, between, indent); } } if (tag == .eof) break; @@ -1188,6 +1199,32 @@ fn file_source_html( } } +fn unindent(s: []const u8, indent: usize) []const u8 { + var indent_idx: usize = 0; + for (s) |c| { + if (c == ' ' and indent_idx < indent) { + indent_idx += 1; + } else { + break; + } + } + return s[indent_idx..]; +} + +fn appendUnindented(out: *std.ArrayListUnmanaged(u8), s: []const u8, indent: usize) !void { + var it = std.mem.split(u8, s, "\n"); + var is_first_line = true; + while (it.next()) |line| { + if (is_first_line) { + try appendEscaped(out, line); + is_first_line = false; + } else { + try out.appendSlice(gpa, "\n"); + try appendEscaped(out, unindent(line, indent)); + } + } +} + fn resolve_ident_link( file_index: Walk.File.Index, out: *std.ArrayListUnmanaged(u8),