package main
|
|
|
|
// html templates are here instead of an .html file to avoid depending on external files
|
|
// in this way, everything is inside the binary
|
|
|
|
const dirTemplate = `
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<title>{{.Title}}</title>
|
|
<style>
|
|
body {
|
|
font-family: Arial, Helvetica, sans-serif;
|
|
}
|
|
.dark {
|
|
background:#1d2021;
|
|
color:#cccccc;
|
|
}
|
|
.dark a, a:hover, a:visited {
|
|
color: #458588;
|
|
}
|
|
</style>
|
|
<body class="dark">
|
|
<input onclick="switchThemeClick()" type="checkbox" id="themeSwitcher" style="float:right;">
|
|
|
|
{{.Content}}
|
|
|
|
<script>
|
|
let theme = localStorage.getItem("theme");
|
|
if (theme === "light") {
|
|
document.getElementById("themeSwitcher").checked = false;
|
|
document.body.className = theme;
|
|
}
|
|
|
|
function switchThemeClick() {
|
|
theme = localStorage.getItem("theme");
|
|
if (theme === "light") {
|
|
document.getElementById("themeSwitcher").checked = true;
|
|
theme = "dark";
|
|
localStorage.setItem("theme", theme);
|
|
} else {
|
|
document.getElementById("themeSwitcher").checked = false;
|
|
theme = "light";
|
|
localStorage.setItem("theme", theme);
|
|
}
|
|
document.body.className = theme;
|
|
}
|
|
</script>
|
|
|
|
</body>
|
|
</html>
|
|
`
|
|
|
|
const htmlTemplate = `
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<title>{{.Title}}</title>
|
|
<style>
|
|
body {
|
|
font-family: Arial, Helvetica, sans-serif;
|
|
}
|
|
.dark {
|
|
background:#1d2021;
|
|
color:#cccccc;
|
|
}
|
|
a, a:hover, a:visited {
|
|
color: #458588;
|
|
}
|
|
pre, code{
|
|
padding-left: 3px;
|
|
padding-right: 3px;
|
|
border-radius: 3px;
|
|
background: #cccccc;
|
|
}
|
|
.dark pre, .dark code{
|
|
padding-left: 3px;
|
|
padding-right: 3px;
|
|
border-radius: 3px;
|
|
background: #333333;
|
|
}
|
|
pre{
|
|
padding: 5px;
|
|
}
|
|
pre>code {
|
|
color: #000000;
|
|
}
|
|
.dark pre>code {
|
|
color: #c0fffa;
|
|
}
|
|
h1:after{
|
|
content:' ';
|
|
display:block;
|
|
border:1px solid #cccccc;
|
|
}
|
|
h2:after{
|
|
content:' ';
|
|
display:block;
|
|
border:0.7px solid #cccccc;
|
|
}
|
|
.dark th{
|
|
padding: 3px;
|
|
border: 1px solid #234b4f;
|
|
background-color: #143134;
|
|
}
|
|
td{
|
|
padding: 3px;
|
|
border: 1px solid #234b4f;
|
|
}
|
|
.container {
|
|
width: 100%;
|
|
padding-right: 1rem;
|
|
padding-left: 1rem;
|
|
margin-right: auto;
|
|
margin-left: auto;
|
|
}
|
|
|
|
@media (min-width: 576px) {
|
|
.container {
|
|
max-width: 540px;
|
|
}
|
|
}
|
|
|
|
@media (min-width: 768px) {
|
|
.container {
|
|
max-width: 720px;
|
|
}
|
|
}
|
|
|
|
@media (min-width: 992px) {
|
|
.container {
|
|
max-width: 800px;
|
|
}
|
|
}
|
|
|
|
@media (min-width: 1200px) {
|
|
.container {
|
|
max-width: 800px;
|
|
}
|
|
}
|
|
|
|
@media (min-width: 1400px) {
|
|
.container {
|
|
max-width: 800px;
|
|
}
|
|
}
|
|
</style>
|
|
|
|
<body class="dark">
|
|
<input onclick="switchThemeClick()" type="checkbox" id="themeSwitcher" style="float:right;">
|
|
<a href="/" title="go to root">root</a>
|
|
<div id="content" class="container">
|
|
{{.Content}}
|
|
</div>
|
|
|
|
|
|
<!-- TODO: make all the imports locally, to allow working offline -->
|
|
|
|
<!-- LaTex renderization -->
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.13.11/dist/katex.min.css" integrity="sha384-Um5gpz1odJg5Z4HAmzPtgZKdTBHZdw8S29IecapCSB31ligYPhHQZMIlWLYQGVoc" crossorigin="anonymous">
|
|
|
|
<!-- The loading of KaTeX is deferred to speed up page rendering -->
|
|
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.13.11/dist/katex.min.js" integrity="sha384-YNHdsYkH6gMx9y3mRkmcJ2mFUjTd0qNQQvY9VYZgQd7DcN7env35GzlmFaZ23JGp" crossorigin="anonymous"></script>
|
|
|
|
<!-- To automatically render math in text elements, include the auto-render extension: -->
|
|
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.13.11/dist/contrib/auto-render.min.js" integrity="sha384-vZTG03m+2yp6N6BNi5iM4rW4oIwk5DfcNdFfxkk9ZWpDriOkXX8voJBFrAO7MpVl" crossorigin="anonymous"></script>
|
|
|
|
<!-- Mermaidjs -->
|
|
<script type="module">
|
|
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.esm.min.mjs';
|
|
</script>
|
|
|
|
<script>
|
|
document.addEventListener("DOMContentLoaded", function() {
|
|
renderMathInElement(document.body, {
|
|
// customised options
|
|
// • auto-render specific keys, e.g.:
|
|
delimiters: [
|
|
{left: '$$', right: '$$', display: true},
|
|
{left: '$', right: '$', display: true},
|
|
{left: '\\(', right: '\\)', display: false},
|
|
{left: '\\[', right: '\\]', display: true}
|
|
],
|
|
// • rendering keys, e.g.:
|
|
throwOnError : false
|
|
});
|
|
});
|
|
</script>
|
|
|
|
<script>
|
|
(function() {
|
|
|
|
var conn = new WebSocket("ws://127.0.0.1:8080/ws/{{.Title}}");
|
|
conn.onclose = function(evt) {
|
|
console.log('Connection closed');
|
|
alert('Connection closed');
|
|
}
|
|
conn.onmessage = function(evt) {
|
|
console.log('file updated');
|
|
// location.reload();
|
|
// console.log("evt", evt);
|
|
document.getElementById("content").innerHTML = evt.data;
|
|
|
|
renderMathInElement(document.body, {
|
|
// customised options
|
|
// • auto-render specific keys, e.g.:
|
|
delimiters: [
|
|
{left: '$$', right: '$$', display: true},
|
|
{left: '$', right: '$', display: false},
|
|
{left: '\\(', right: '\\)', display: false},
|
|
{left: '\\[', right: '\\]', display: true}
|
|
],
|
|
// • rendering keys, e.g.:
|
|
throwOnError : false
|
|
});
|
|
}
|
|
})();
|
|
|
|
|
|
let theme = localStorage.getItem("theme");
|
|
if (theme === "light") {
|
|
document.getElementById("themeSwitcher").checked = false;
|
|
document.body.className = theme;
|
|
}
|
|
|
|
function switchThemeClick() {
|
|
theme = localStorage.getItem("theme");
|
|
if (theme === "light") {
|
|
document.getElementById("themeSwitcher").checked = true;
|
|
theme = "dark";
|
|
localStorage.setItem("theme", theme);
|
|
} else {
|
|
document.getElementById("themeSwitcher").checked = false;
|
|
theme = "light";
|
|
localStorage.setItem("theme", theme);
|
|
}
|
|
document.body.className = theme;
|
|
}
|
|
|
|
</script>
|
|
</body>
|
|
</html>
|
|
`
|
|
|
|
const errTemplate = `
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<title>{{.Title}}</title>
|
|
<style>
|
|
body {
|
|
font-family: Arial, Helvetica, sans-serif;
|
|
background:#000000;
|
|
color:#cccccc;
|
|
}
|
|
</style>
|
|
<body>
|
|
<a href="/" title="go to root">root</a>
|
|
|
|
<h3>File doesn't exist</h3>
|
|
<br><br>
|
|
<a href="/">Back to dir menu</a>
|
|
|
|
</body>
|
|
</html>
|
|
`
|