authorgravatar for stefan92ff@yandex.comF3real <stefan92ff@yandex.com> 2023-12-03 13:00:19+01:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-01-13 22:05:09-08:00
log1322049e2449ceb6314c8ee6cc9170502b278f3f
tree4991e6457cee31f112657004aae0b5f00d5df5f5
parent4dd3505e4329cf87a9ab5a7665ac2263fa2a4ec5

Don't crash or CR/LF line endings in docgen


1 files changed, 19 insertions(+), 5 deletions(-)

tools/docgen.zig+19-5
...@@ -969,7 +969,7 @@ fn tokenizeAndPrintRaw(...@@ -969,7 +969,7 @@ fn tokenizeAndPrintRaw(
969 source_token: Token,969 source_token: Token,
970 raw_src: []const u8,970 raw_src: []const u8,
971) !void {971) !void {
972 const src_non_terminated = mem.trim(u8, raw_src, " \n");972 const src_non_terminated = mem.trim(u8, raw_src, " \r\n");
973 const src = try allocator.dupeZ(u8, src_non_terminated);973 const src = try allocator.dupeZ(u8, src_non_terminated);
974974
975 try out.writeAll("<code>" ++ start_line);975 try out.writeAll("<code>" ++ start_line);
...@@ -1232,7 +1232,7 @@ fn printSourceBlock(allocator: Allocator, docgen_tokenizer: *Tokenizer, out: any...@@ -1232,7 +1232,7 @@ fn printSourceBlock(allocator: Allocator, docgen_tokenizer: *Tokenizer, out: any
1232 .zig => try tokenizeAndPrint(allocator, docgen_tokenizer, out, syntax_block.source_token),1232 .zig => try tokenizeAndPrint(allocator, docgen_tokenizer, out, syntax_block.source_token),
1233 else => {1233 else => {
1234 const raw_source = docgen_tokenizer.buffer[syntax_block.source_token.start..syntax_block.source_token.end];1234 const raw_source = docgen_tokenizer.buffer[syntax_block.source_token.start..syntax_block.source_token.end];
1235 const trimmed_raw_source = mem.trim(u8, raw_source, " \n");1235 const trimmed_raw_source = mem.trim(u8, raw_source, " \r\n");
12361236
1237 try out.writeAll("<code>" ++ start_line);1237 try out.writeAll("<code>" ++ start_line);
1238 try writeEscapedLines(out, trimmed_raw_source);1238 try writeEscapedLines(out, trimmed_raw_source);
...@@ -1243,12 +1243,12 @@ fn printSourceBlock(allocator: Allocator, docgen_tokenizer: *Tokenizer, out: any...@@ -1243,12 +1243,12 @@ fn printSourceBlock(allocator: Allocator, docgen_tokenizer: *Tokenizer, out: any
1243}1243}
12441244
1245fn printShell(out: anytype, shell_content: []const u8, escape: bool) !void {1245fn printShell(out: anytype, shell_content: []const u8, escape: bool) !void {
1246 const trimmed_shell_content = mem.trim(u8, shell_content, " \n");1246 const trimmed_shell_content = mem.trim(u8, shell_content, " \r\n");
1247 try out.writeAll("<figure><figcaption class=\"shell-cap\">Shell</figcaption><pre><samp>");1247 try out.writeAll("<figure><figcaption class=\"shell-cap\">Shell</figcaption><pre><samp>");
1248 var cmd_cont: bool = false;1248 var cmd_cont: bool = false;
1249 var iter = std.mem.splitScalar(u8, trimmed_shell_content, '\n');1249 var iter = std.mem.splitScalar(u8, trimmed_shell_content, '\n');
1250 while (iter.next()) |orig_line| {1250 while (iter.next()) |orig_line| {
1251 const line = mem.trimRight(u8, orig_line, " ");1251 const line = mem.trimRight(u8, orig_line, " \r");
1252 if (!cmd_cont and line.len > 1 and mem.eql(u8, line[0..2], "$ ") and line[line.len - 1] != '\\') {1252 if (!cmd_cont and line.len > 1 and mem.eql(u8, line[0..2], "$ ") and line[line.len - 1] != '\\') {
1253 try out.writeAll("$ <kbd>");1253 try out.writeAll("$ <kbd>");
1254 const s = std.mem.trimLeft(u8, line[1..], " ");1254 const s = std.mem.trimLeft(u8, line[1..], " ");
...@@ -1380,7 +1380,7 @@ fn genHtml(...@@ -1380,7 +1380,7 @@ fn genHtml(
1380 }1380 }
13811381
1382 const raw_source = tokenizer.buffer[code.source_token.start..code.source_token.end];1382 const raw_source = tokenizer.buffer[code.source_token.start..code.source_token.end];
1383 const trimmed_raw_source = mem.trim(u8, raw_source, " \n");1383 const trimmed_raw_source = mem.trim(u8, raw_source, " \r\n");
1384 const tmp_source_file_name = try fs.path.join(1384 const tmp_source_file_name = try fs.path.join(
1385 allocator,1385 allocator,
1386 &[_][]const u8{ tmp_dir_name, name_plus_ext },1386 &[_][]const u8{ tmp_dir_name, name_plus_ext },
...@@ -2121,6 +2121,20 @@ test "printShell" {...@@ -2121,6 +2121,20 @@ test "printShell" {
2121 try printShell(buffer.writer(), shell_out, false);2121 try printShell(buffer.writer(), shell_out, false);
2122 try testing.expectEqualSlices(u8, expected, buffer.items);2122 try testing.expectEqualSlices(u8, expected, buffer.items);
2123 }2123 }
2124 {
2125 const shell_out = "$ zig build test.zig\r\nbuild output\r\n";
2126 const expected =
2127 \\<figure><figcaption class="shell-cap">Shell</figcaption><pre><samp>$ <kbd>zig build test.zig</kbd>
2128 \\build output
2129 \\</samp></pre></figure>
2130 ;
2131
2132 var buffer = std.ArrayList(u8).init(test_allocator);
2133 defer buffer.deinit();
2134
2135 try printShell(buffer.writer(), shell_out, false);
2136 try testing.expectEqualSlices(u8, expected, buffer.items);
2137 }
2124 {2138 {
2125 const shell_out =2139 const shell_out =
2126 \\$ zig build test.zig2140 \\$ zig build test.zig