authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-10-26 16:48:29-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-10-26 16:48:50-07:00
log7d0dc2fd75fd0e62cb842e00e82633a35509f12b
tree8cb7022b59f4a39ef5c0f8c1ea37f6822f92ed4e
parent9db293492bbbc5b8d70638bd9c59dea19d13596c

docgen: fix not escaping html in shell samples


1 files changed, 43 insertions(+), 17 deletions(-)

doc/docgen.zig+43-17
......@@ -1168,7 +1168,7 @@ fn printSourceBlock(allocator: Allocator, docgen_tokenizer: *Tokenizer, out: any
11681168 try out.writeAll("</pre></figure>");
11691169}
11701170
1171fn printShell(out: anytype, shell_content: []const u8) !void {
1171fn printShell(out: anytype, shell_content: []const u8, escape: bool) !void {
11721172 const trimmed_shell_content = mem.trim(u8, shell_content, " \n");
11731173 try out.writeAll("<figure><figcaption class=\"shell-cap\">Shell</figcaption><pre><samp>");
11741174 var cmd_cont: bool = false;
......@@ -1176,15 +1176,41 @@ fn printShell(out: anytype, shell_content: []const u8) !void {
11761176 while (iter.next()) |orig_line| {
11771177 const line = mem.trimRight(u8, orig_line, " ");
11781178 if (!cmd_cont and line.len > 1 and mem.eql(u8, line[0..2], "$ ") and line[line.len - 1] != '\\') {
1179 try out.print(start_line ++ "$ <kbd>{s}</kbd>" ++ end_line ++ "\n", .{std.mem.trimLeft(u8, line[1..], " ")});
1179 try out.writeAll(start_line ++ "$ <kbd>");
1180 const s = std.mem.trimLeft(u8, line[1..], " ");
1181 if (escape) {
1182 try writeEscaped(out, s);
1183 } else {
1184 try out.writeAll(s);
1185 }
1186 try out.writeAll("</kbd>" ++ end_line ++ "\n");
11801187 } else if (!cmd_cont and line.len > 1 and mem.eql(u8, line[0..2], "$ ") and line[line.len - 1] == '\\') {
1181 try out.print(start_line ++ "$ <kbd>{s}" ++ end_line ++ "\n", .{std.mem.trimLeft(u8, line[1..], " ")});
1188 try out.writeAll(start_line ++ "$ <kbd>");
1189 const s = std.mem.trimLeft(u8, line[1..], " ");
1190 if (escape) {
1191 try writeEscaped(out, s);
1192 } else {
1193 try out.writeAll(s);
1194 }
1195 try out.writeAll(end_line ++ "\n");
11821196 cmd_cont = true;
11831197 } else if (line.len > 0 and line[line.len - 1] != '\\' and cmd_cont) {
1184 try out.print(start_line ++ "{s}</kbd>" ++ end_line ++ "\n", .{line});
1198 try out.writeAll(start_line);
1199 if (escape) {
1200 try writeEscaped(out, line);
1201 } else {
1202 try out.writeAll(line);
1203 }
1204 try out.writeAll("</kbd>" ++ end_line ++ "\n");
11851205 cmd_cont = false;
11861206 } else {
1187 try out.print(start_line ++ "{s}" ++ end_line ++ "\n", .{line});
1207 try out.writeAll(start_line);
1208 if (escape) {
1209 try writeEscaped(out, line);
1210 } else {
1211 try out.writeAll(line);
1212 }
1213 try out.writeAll(end_line ++ "\n");
11881214 }
11891215 }
11901216
......@@ -1254,7 +1280,7 @@ fn genHtml(
12541280 },
12551281 .Shell => |content_tok| {
12561282 const raw_shell_content = tokenizer.buffer[content_tok.start..content_tok.end];
1257 try printShell(out, raw_shell_content);
1283 try printShell(out, raw_shell_content, true);
12581284 },
12591285 .SyntaxBlock => |syntax_block| {
12601286 try printSourceBlock(allocator, tokenizer, out, syntax_block);
......@@ -1730,7 +1756,7 @@ fn genHtml(
17301756 }
17311757
17321758 if (!code.just_check_syntax) {
1733 try printShell(out, shell_buffer.items);
1759 try printShell(out, shell_buffer.items, false);
17341760 }
17351761 },
17361762 }
......@@ -1788,7 +1814,7 @@ test "shell parsed" {
17881814 var buffer = std.ArrayList(u8).init(test_allocator);
17891815 defer buffer.deinit();
17901816
1791 try printShell(buffer.writer(), shell_out);
1817 try printShell(buffer.writer(), shell_out, false);
17921818 std.log.emerg("{s}", .{buffer.items});
17931819 try testing.expectEqualSlices(u8, expected, buffer.items);
17941820 }
......@@ -1806,7 +1832,7 @@ test "shell parsed" {
18061832 var buffer = std.ArrayList(u8).init(test_allocator);
18071833 defer buffer.deinit();
18081834
1809 try printShell(buffer.writer(), shell_out);
1835 try printShell(buffer.writer(), shell_out, false);
18101836 try testing.expectEqualSlices(u8, expected, buffer.items);
18111837 }
18121838 {
......@@ -1825,7 +1851,7 @@ test "shell parsed" {
18251851 var buffer = std.ArrayList(u8).init(test_allocator);
18261852 defer buffer.deinit();
18271853
1828 try printShell(buffer.writer(), shell_out);
1854 try printShell(buffer.writer(), shell_out, false);
18291855 try testing.expectEqualSlices(u8, expected, buffer.items);
18301856 }
18311857 {
......@@ -1846,7 +1872,7 @@ test "shell parsed" {
18461872 var buffer = std.ArrayList(u8).init(test_allocator);
18471873 defer buffer.deinit();
18481874
1849 try printShell(buffer.writer(), shell_out);
1875 try printShell(buffer.writer(), shell_out, false);
18501876 try testing.expectEqualSlices(u8, expected, buffer.items);
18511877 }
18521878 {
......@@ -1865,7 +1891,7 @@ test "shell parsed" {
18651891 var buffer = std.ArrayList(u8).init(test_allocator);
18661892 defer buffer.deinit();
18671893
1868 try printShell(buffer.writer(), shell_out);
1894 try printShell(buffer.writer(), shell_out, false);
18691895 try testing.expectEqualSlices(u8, expected, buffer.items);
18701896 }
18711897 {
......@@ -1888,7 +1914,7 @@ test "shell parsed" {
18881914 var buffer = std.ArrayList(u8).init(test_allocator);
18891915 defer buffer.deinit();
18901916
1891 try printShell(buffer.writer(), shell_out);
1917 try printShell(buffer.writer(), shell_out, false);
18921918 try testing.expectEqualSlices(u8, expected, buffer.items);
18931919 }
18941920 {
......@@ -1910,7 +1936,7 @@ test "shell parsed" {
19101936 var buffer = std.ArrayList(u8).init(test_allocator);
19111937 defer buffer.deinit();
19121938
1913 try printShell(buffer.writer(), shell_out);
1939 try printShell(buffer.writer(), shell_out, false);
19141940 try testing.expectEqualSlices(u8, expected, buffer.items);
19151941 }
19161942 {
......@@ -1927,7 +1953,7 @@ test "shell parsed" {
19271953 var buffer = std.ArrayList(u8).init(test_allocator);
19281954 defer buffer.deinit();
19291955
1930 try printShell(buffer.writer(), shell_out);
1956 try printShell(buffer.writer(), shell_out, false);
19311957 try testing.expectEqualSlices(u8, expected, buffer.items);
19321958 }
19331959 {
......@@ -1946,7 +1972,7 @@ test "shell parsed" {
19461972 var buffer = std.ArrayList(u8).init(test_allocator);
19471973 defer buffer.deinit();
19481974
1949 try printShell(buffer.writer(), shell_out);
1975 try printShell(buffer.writer(), shell_out, false);
19501976 try testing.expectEqualSlices(u8, expected, buffer.items);
19511977 }
19521978 {
......@@ -1961,7 +1987,7 @@ test "shell parsed" {
19611987 var buffer = std.ArrayList(u8).init(test_allocator);
19621988 defer buffer.deinit();
19631989
1964 try printShell(buffer.writer(), shell_out);
1990 try printShell(buffer.writer(), shell_out, false);
19651991 try testing.expectEqualSlices(u8, expected, buffer.items);
19661992 }
19671993}