| ... | @@ -938,6 +938,17 @@ fn file_source_html( | ... | @@ -938,6 +938,17 @@ fn file_source_html( |
| 938 | | 938 | |
| 939 | var cursor: usize = token_starts[start_token]; | 939 | var cursor: usize = token_starts[start_token]; |
| 940 | | 940 | |
| | 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 | } |
| 1190 | | 1201 | |
| | 1202 | fn 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 | |
| | 1214 | fn 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 | |
| 1191 | fn resolve_ident_link( | 1228 | fn 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), |