//! 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), } } }