aboutsummaryrefslogtreecommitdiff
path: root/lib/docs
diff options
context:
space:
mode:
authorHydroH <ixlesis@gmail.com>2024-03-26 06:20:15 +0800
committerGitHub <noreply@github.com>2024-03-25 18:20:15 -0400
commitef31d8f48fa1b7ff5bd4cd57e812fd9c91fd1bd9 (patch)
tree7de60ae9774b1ab2c94fb6e6ec695d2e024b2470 /lib/docs
parent31a7f22b800c091962726de2dd29f10a8eb25b78 (diff)
downloadzig-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.zig41
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),