diff options
| author | HydroH <ixlesis@gmail.com> | 2024-03-26 06:20:15 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-25 18:20:15 -0400 |
| commit | ef31d8f48fa1b7ff5bd4cd57e812fd9c91fd1bd9 (patch) | |
| tree | 7de60ae9774b1ab2c94fb6e6ec695d2e024b2470 /lib/docs | |
| parent | 31a7f22b800c091962726de2dd29f10a8eb25b78 (diff) | |
| download | zig-ef31d8f48fa1b7ff5bd4cd57e812fd9c91fd1bd9.tar.gz zig-ef31d8f48fa1b7ff5bd4cd57e812fd9c91fd1bd9.zip | |
autodoc: better indentation handling when rendering source code (#19422)
Closes #19293
Diffstat (limited to 'lib/docs')
| -rw-r--r-- | lib/docs/wasm/main.zig | 41 |
1 files 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, "<span class=\"tok-comment\">"); - try appendEscaped(out, between); + try appendUnindented(out, between, indent); try out.appendSlice(gpa, "</span>"); } } 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), |
