45 lines
1.1 KiB
TypeScript
45 lines
1.1 KiB
TypeScript
export function layout(title: string, body: string, opts: { authed?: boolean; hideHeader?: boolean } = {}): string {
|
|
const { authed = false, hideHeader = false } = opts;
|
|
const nav = authed
|
|
? `<nav>
|
|
<a href="/upload">Upload</a>
|
|
<a href="/files">My Files</a>
|
|
<form method="POST" action="/logout" style="display:inline">
|
|
<button type="submit">Logout</button>
|
|
</form>
|
|
</nav>`
|
|
: '';
|
|
|
|
const header = hideHeader
|
|
? ''
|
|
: ` <header>
|
|
<a href="/" class="logo">Nanodrop</a>
|
|
${nav}
|
|
</header>`;
|
|
|
|
return `<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>${escHtml(title)} — Nanodrop</title>
|
|
<link rel="stylesheet" href="/public/style.css">
|
|
</head>
|
|
<body>
|
|
${header}
|
|
<main>
|
|
${body}
|
|
</main>
|
|
</body>
|
|
</html>`;
|
|
}
|
|
|
|
export function escHtml(str: string): string {
|
|
return str
|
|
.replace(/&/g, '&')
|
|
.replace(/</g, '<')
|
|
.replace(/>/g, '>')
|
|
.replace(/"/g, '"')
|
|
.replace(/'/g, ''');
|
|
}
|