//! Swagger UI and ReDoc HTML rendering.
//! Rendering escapes application metadata before embedding it in HTML or JavaScript.
const std = @import("std");
pub fn writeSwaggerUiHtml(writer: *std.Io.Writer, title: []const u8, openapi_url: []const u8, oauth2_redirect_url: ?[]const u8) !void {
try writer.writeAll("\n\n
");
try writeHtmlText(writer, title);
try writer.writeAll(" - Swagger UI\n\n\n\n\n\n");
}
pub fn writeSwaggerUiOAuth2RedirectHtml(writer: *std.Io.Writer, title: []const u8) !void {
try writer.writeAll("\n\n");
try writeHtmlText(writer, title);
try writer.writeAll(
" - Swagger UI OAuth2 Redirect\n" ++
"\n\n\n",
);
}
pub fn writeRedocHtml(writer: *std.Io.Writer, title: []const u8, openapi_url: []const u8) !void {
try writer.writeAll("\n\n");
try writeHtmlText(writer, title);
try writer.writeAll(" - ReDoc\n\n\n\n\n");
}
pub fn writeHtmlText(writer: *std.Io.Writer, value: []const u8) !void {
for (value) |ch| {
switch (ch) {
'&' => try writer.writeAll("&"),
'<' => try writer.writeAll("<"),
'>' => try writer.writeAll(">"),
else => try writer.writeByte(ch),
}
}
}
pub fn writeHtmlAttribute(writer: *std.Io.Writer, value: []const u8) !void {
for (value) |ch| {
switch (ch) {
'&' => try writer.writeAll("&"),
'"' => try writer.writeAll("""),
'<' => try writer.writeAll("<"),
'>' => try writer.writeAll(">"),
else => try writer.writeByte(ch),
}
}
}
pub fn writeJavaScriptStringContents(writer: *std.Io.Writer, value: []const u8) !void {
for (value) |ch| {
switch (ch) {
'"' => try writer.writeAll("\\\""),
'\\' => try writer.writeAll("\\\\"),
'\n' => try writer.writeAll("\\n"),
'\r' => try writer.writeAll("\\r"),
'\t' => try writer.writeAll("\\t"),
'<' => try writer.writeAll("\\u003c"),
'>' => try writer.writeAll("\\u003e"),
'&' => try writer.writeAll("\\u0026"),
0x00...0x08 => try writer.print("\\u{x:0>4}", .{ch}),
0x0b...0x0c => try writer.print("\\u{x:0>4}", .{ch}),
0x0e...0x1f => try writer.print("\\u{x:0>4}", .{ch}),
else => try writer.writeByte(ch),
}
}
}