authorgravatar for iodizon@163.comHydroH <iodizon@163.com> 2024-03-26 06:20:15+08:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-03-25 18:20:15-04:00
logef31d8f48fa1b7ff5bd4cd57e812fd9c91fd1bd9
tree7de60ae9774b1ab2c94fb6e6ec695d2e024b2470
parent31a7f22b800c091962726de2dd29f10a8eb25b78
signaturebadge-check Signed by PGP key B5690EEEBB952194

autodoc: better indentation handling when rendering source code (#19422)

Closes #19293

1 files changed, 39 insertions(+), 2 deletions(-)

lib/docs/wasm/main.zig+39-2
......@@ -938,6 +938,17 @@ fn file_source_html(
938938
939939 var cursor: usize = token_starts[start_token];
940940
941 var indent: usize = 0;
942 if (std.mem.lastIndexOf(u8, ast.source[0..cursor], "\n")) |newline_index| {
943 for (ast.source[newline_index + 1 .. cursor]) |c| {
944 if (c == ' ') {
945 indent += 1;
946 } else {
947 break;
948 }
949 }
950 }
951
941952 for (
942953 token_tags[start_token..end_token],
943954 token_starts[start_token..end_token],
......@@ -947,7 +958,7 @@ fn file_source_html(
947958 if (std.mem.trim(u8, between, " \t\r\n").len > 0) {
948959 if (!options.skip_comments) {
949960 try out.appendSlice(gpa, "<span class=\"tok-comment\">");
950 try appendEscaped(out, between);
961 try appendUnindented(out, between, indent);
951962 try out.appendSlice(gpa, "</span>");
952963 }
953964 } else if (between.len > 0) {
......@@ -955,7 +966,7 @@ fn file_source_html(
955966 if (out.items.len > 0 and out.items[out.items.len - 1] != ' ')
956967 try out.append(gpa, ' ');
957968 } else {
958 try out.appendSlice(gpa, between);
969 try appendUnindented(out, between, indent);
959970 }
960971 }
961972 if (tag == .eof) break;
......@@ -1188,6 +1199,32 @@ fn file_source_html(
11881199 }
11891200}
11901201
1202fn unindent(s: []const u8, indent: usize) []const u8 {
1203 var indent_idx: usize = 0;
1204 for (s) |c| {
1205 if (c == ' ' and indent_idx < indent) {
1206 indent_idx += 1;
1207 } else {
1208 break;
1209 }
1210 }
1211 return s[indent_idx..];
1212}
1213
1214fn appendUnindented(out: *std.ArrayListUnmanaged(u8), s: []const u8, indent: usize) !void {
1215 var it = std.mem.split(u8, s, "\n");
1216 var is_first_line = true;
1217 while (it.next()) |line| {
1218 if (is_first_line) {
1219 try appendEscaped(out, line);
1220 is_first_line = false;
1221 } else {
1222 try out.appendSlice(gpa, "\n");
1223 try appendEscaped(out, unindent(line, indent));
1224 }
1225 }
1226}
1227
11911228fn resolve_ident_link(
11921229 file_index: Walk.File.Index,
11931230 out: *std.ArrayListUnmanaged(u8),