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(...@@ -938,6 +938,17 @@ fn file_source_html(
938938
939 var cursor: usize = token_starts[start_token];939 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
941 for (952 for (
942 token_tags[start_token..end_token],953 token_tags[start_token..end_token],
943 token_starts[start_token..end_token],954 token_starts[start_token..end_token],
...@@ -947,7 +958,7 @@ fn file_source_html(...@@ -947,7 +958,7 @@ fn file_source_html(
947 if (std.mem.trim(u8, between, " \t\r\n").len > 0) {958 if (std.mem.trim(u8, between, " \t\r\n").len > 0) {
948 if (!options.skip_comments) {959 if (!options.skip_comments) {
949 try out.appendSlice(gpa, "<span class=\"tok-comment\">");960 try out.appendSlice(gpa, "<span class=\"tok-comment\">");
950 try appendEscaped(out, between);961 try appendUnindented(out, between, indent);
951 try out.appendSlice(gpa, "</span>");962 try out.appendSlice(gpa, "</span>");
952 }963 }
953 } else if (between.len > 0) {964 } else if (between.len > 0) {
...@@ -955,7 +966,7 @@ fn file_source_html(...@@ -955,7 +966,7 @@ fn file_source_html(
955 if (out.items.len > 0 and out.items[out.items.len - 1] != ' ')966 if (out.items.len > 0 and out.items[out.items.len - 1] != ' ')
956 try out.append(gpa, ' ');967 try out.append(gpa, ' ');
957 } else {968 } else {
958 try out.appendSlice(gpa, between);969 try appendUnindented(out, between, indent);
959 }970 }
960 }971 }
961 if (tag == .eof) break;972 if (tag == .eof) break;
...@@ -1188,6 +1199,32 @@ fn file_source_html(...@@ -1188,6 +1199,32 @@ fn file_source_html(
1188 }1199 }
1189}1200}
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
1191fn resolve_ident_link(1228fn resolve_ident_link(
1192 file_index: Walk.File.Index,1229 file_index: Walk.File.Index,
1193 out: *std.ArrayListUnmanaged(u8),1230 out: *std.ArrayListUnmanaged(u8),