diff options
Diffstat (limited to 'srv/src/http/tpl')
-rw-r--r-- | srv/src/http/tpl/admin.html | 18 | ||||
-rw-r--r-- | srv/src/http/tpl/assets.html | 57 | ||||
-rw-r--r-- | srv/src/http/tpl/base.html | 28 | ||||
-rw-r--r-- | srv/src/http/tpl/draft-posts.html | 50 | ||||
-rw-r--r-- | srv/src/http/tpl/edit-post.html | 142 | ||||
-rw-r--r-- | srv/src/http/tpl/finalize.html | 45 | ||||
-rw-r--r-- | srv/src/http/tpl/follow.html | 160 | ||||
-rw-r--r-- | srv/src/http/tpl/image.html | 5 | ||||
-rw-r--r-- | srv/src/http/tpl/index.html | 37 | ||||
-rw-r--r-- | srv/src/http/tpl/post.html | 44 | ||||
-rw-r--r-- | srv/src/http/tpl/posts.html | 47 | ||||
-rw-r--r-- | srv/src/http/tpl/redirect.html | 9 | ||||
-rw-r--r-- | srv/src/http/tpl/unsubscribe.html | 44 |
13 files changed, 0 insertions, 686 deletions
diff --git a/srv/src/http/tpl/admin.html b/srv/src/http/tpl/admin.html deleted file mode 100644 index f2ba4d6..0000000 --- a/srv/src/http/tpl/admin.html +++ /dev/null @@ -1,18 +0,0 @@ -{{ define "body" }} - -<h1>Admin</h1> - -This is a directory of pages which are used for managing blog content. They are -mostly left open to inspection, but you will not able to change -anything without providing credentials. - -<ul> - <li><a href="{{ BlogURL "posts" }}">Posts</a></li> - <li><a href="{{ BlogURL "assets" }}">Assets</a></li> - <li><a href="{{ BlogURL "drafts" }}">Drafts</a> (private)</li> -</ul> - -{{ end }} - -{{ template "base.html" . }} - diff --git a/srv/src/http/tpl/assets.html b/srv/src/http/tpl/assets.html deleted file mode 100644 index f21717a..0000000 --- a/srv/src/http/tpl/assets.html +++ /dev/null @@ -1,57 +0,0 @@ -{{ define "body" }} - -<p> - <a href="{{ BlogURL "admin" }}">Back to Admin</a> -</p> - -<h1>Assets</h1> - -<h2>Upload Asset</h2> - -<p> - If the given ID is the same as an existing asset's ID, then that asset will be - overwritten. -</p> - -<form action="{{ BlogURL "assets/" }}" method="POST" enctype="multipart/form-data"> - <div class="row"> - <div class="four columns"> - <input type="text" placeholder="Unique ID" name="id" /> - </div> - <div class="four columns"> - <input type="file" name="file" /><br/> - </div> - <div class="four columns"> - <input type="submit" value="Upload" /> - </div> - </div> -</form> - -{{ if gt (len .Payload.IDs) 0 }} - -<h2>Existing Assets</h2> - -<table> - - {{ range .Payload.IDs }} - <tr> - <td><a href="{{ AssetURL . }}">{{ . }}</a></td> - <td> - <form - action="{{ AssetURL . }}?method=delete" - method="POST" - style="margin-bottom: 0;" - > - <input type="submit" value="Delete" /> - </form> - </td> - </tr> - {{ end }} - -</table> - -{{ end }} - -{{ end }} - -{{ template "base.html" . }} diff --git a/srv/src/http/tpl/base.html b/srv/src/http/tpl/base.html deleted file mode 100644 index f286222..0000000 --- a/srv/src/http/tpl/base.html +++ /dev/null @@ -1,28 +0,0 @@ -<!DOCTYPE html> -<html> - - <head> - <style>{{ StaticInlineCSS "new.css" }}</style> - <style>{{ StaticInlineCSS "mediocre.css" }}</style> - </head> - - <body> - - <header> - <a href="{{ BlogURL "/" }}"><strong>Mediocre Blog</strong></a> - by - <a href="https://mediocregopher.com">mediocregopher</a> - // - <a href="{{ BlogURL "follow" }}">Follow</a> - / - <a href="{{ BlogURL "feed.xml" }}">RSS</a> - / - <a href="{{ StaticURL "wtfpl.txt" }}">License</a> - </header> - - {{ template "body" . }} - - </body> - -</html> - diff --git a/srv/src/http/tpl/draft-posts.html b/srv/src/http/tpl/draft-posts.html deleted file mode 100644 index 53261b9..0000000 --- a/srv/src/http/tpl/draft-posts.html +++ /dev/null @@ -1,50 +0,0 @@ -{{ define "body" }} - - <p> - <a href="{{ BlogURL "admin" }}">Back to Admin</a> - </p> - - <h1>Drafts</h1> - - <p> - <a href="{{ BlogURL "drafts/" }}?edit">New Draft</a> - </p> - - {{ if ge .Payload.PrevPage 0 }} - <p> - <a href="?p={{ .Payload.PrevPage}}">< < Previous Page</a> - </p> - {{ end }} - - <table> - - {{ range .Payload.Posts }} - <tr> - <td><a href="{{ DraftURL .ID }}">{{ .Title }}</a></td> - <td> - <a href="{{ DraftURL .ID }}?edit"> - Edit - </a> - </td> - <td> - <form - action="{{ DraftURL .ID }}?method=delete" - method="POST" - > - <input type="submit" value="Delete" /> - </form> - </td> - </tr> - {{ end }} - - </table> - - {{ if ge .Payload.NextPage 0 }} - <p> - <a href="?p={{ .Payload.NextPage}}">Next Page > ></a> - </p> - {{ end }} - -{{ end }} - -{{ template "base.html" . }} diff --git a/srv/src/http/tpl/edit-post.html b/srv/src/http/tpl/edit-post.html deleted file mode 100644 index f8e2730..0000000 --- a/srv/src/http/tpl/edit-post.html +++ /dev/null @@ -1,142 +0,0 @@ -{{ define "body" }} - -<p> - {{ if .Payload.IsDraft }} - <a href="{{ BlogURL "drafts/" }}"> - Back to Drafts - </a> - {{ else }} - <a href="{{ BlogURL "posts/" }}"> - Back to Posts - </a> - {{ end }} -</p> - -<form method="POST" action="{{ BlogURL "posts/" }}"> - - <table> - - <tr> - <td> - Unique ID - </td> - <td> - {{ if eq .Payload.Post.ID "" }} - <input - name="id" - type="text" - placeholder="e.g. how-to-fly-a-kite" - value="{{ .Payload.Post.ID }}" /> - {{ else if .Payload.IsDraft }} - {{ .Payload.Post.ID }} - <input name="id" type="hidden" value="{{ .Payload.Post.ID }}" /> - {{ else }} - <a href="{{ PostURL .Payload.Post.ID }}">{{ .Payload.Post.ID }}</a> - <input name="id" type="hidden" value="{{ .Payload.Post.ID }}" /> - {{ end }} - </td> - </tr> - - <tr> - <td>Tags (space separated)</td> - <td> - <input - name="tags" - type="text" - value="{{- range $i, $tag := .Payload.Post.Tags -}} - {{- if ne $i 0 }} {{ end }}{{ $tag -}} - {{- end -}} - "/> - - {{ if gt (len .Payload.Tags) 0 }} - <em> - Existing tags: - {{ range $i, $tag := .Payload.Tags }} - {{ if ne $i 0 }} {{ end }}{{ $tag }} - {{ end }} - </em> - {{ end }} - </td> - </tr> - - <tr> - <td>Series</td> - <td> - <input - name="series" - type="text" - value="{{ .Payload.Post.Series }}" /> - </td> - </tr> - - <tr> - <td>Title</td> - <td> - <input - name="title" - type="text" - value="{{ .Payload.Post.Title }}" /> - </td> - </tr> - - <tr> - <td>Description</td> - <td> - <input - name="description" - type="text" - value="{{ .Payload.Post.Description }}" /> - </td> - </tr> - - </table> - - <p> - <textarea - name="body" - placeholder="Blog body" - style="width:100%;height: 75vh;" - > - {{- .Payload.Post.Body -}} - </textarea> - </p> - - <p> - - <input - type="submit" - value="Preview" - formaction="{{ BlogURL "posts/" }}{{ .Payload.Post.ID }}?method=preview" - formtarget="_blank" - /> - - {{ if .Payload.IsDraft }} - <input type="submit" value="Save" formaction="{{ BlogURL "drafts/" }}" /> - - - <script> - function confirmPublish(event) { - if (!confirm("Are you sure you're ready to publish?")) - event.preventDefault(); - } - </script> - - - <input - type="submit" - value="Publish" - formaction="{{ BlogURL "posts/" }}" - onclick="confirmPublish(event)" - /> - - {{ else }} - <input type="submit" value="Update" formaction="{{ BlogURL "posts/" }}" /> - {{ end }} - - </p> - -</form> - -{{ end }} - -{{ template "base.html" . }} diff --git a/srv/src/http/tpl/finalize.html b/srv/src/http/tpl/finalize.html deleted file mode 100644 index 8bdfceb..0000000 --- a/srv/src/http/tpl/finalize.html +++ /dev/null @@ -1,45 +0,0 @@ -{{ define "body" }} - -<script async type="module" src="{{ StaticURL "api.js" }}"></script> - -<style> -#result.success { color: green; } -#result.fail { color: red; } -</style> - -<span id="result"></span> - -<script> - -(async () => { - - const resultSpan = document.getElementById("result"); - - try { - - const urlParams = new URLSearchParams(window.location.search); - const subToken = urlParams.get('subToken'); - - if (!subToken) throw "No subscription token provided"; - - const api = await import("{{ StaticURL "api.js" }}"); - - await api.call('/api/mailinglist/finalize', { - body: { subToken }, - }); - - resultSpan.className = "success"; - resultSpan.innerHTML = "Your email subscription has been finalized! Please go on about your day."; - - } catch (e) { - resultSpan.className = "fail"; - resultSpan.innerHTML = e; - } - -})(); - -</script> - -{{ end }} - -{{ template "base.html" . }} diff --git a/srv/src/http/tpl/follow.html b/srv/src/http/tpl/follow.html deleted file mode 100644 index 23c30a6..0000000 --- a/srv/src/http/tpl/follow.html +++ /dev/null @@ -1,160 +0,0 @@ -{{ define "body" }} - -<script async type="module" src="{{ StaticURL "api.js" }}"></script> - -<p> - Here's your options for receiving updates about new blog posts: -</p> - -<h2>Option 1: Email</h2> - -<p> - Email is by far my preferred option for notifying followers of new posts. -</p> - -<p> - The entire email list system for this blog, from storing subscriber email - addresses to the email server which sends the notifications out, has been - designed from scratch and is completely self-hosted in my living room. -</p> - -<p> - I solemnly swear that: -</p> - -<ul> - - <li> - You will never receive an email from this blog except to notify of a new - post. - </li> - - <li> - Your email will never be provided or sold to anyone else for any reason. - </li> - -</ul> - -<p> - With all that said, if you'd like to receive an email everytime a new blog - post is published then input your email below and smash that subscribe button! - You will need to verify your email, so be sure to check your spam folder to - complete the process if you don't immediately see anything in your inbox. -</p> - -<p style="color: var(--nc-ac-1);"> - Unfortunately Google considers all emails from my mail server to be spam. I'm - tired of seeing the bounce errors on my side, so I'm disabling the ability to - sign up for the mailing list with a GMail address. Sorry (not sorry). -</p> - -<style> - -#emailStatus.success { - color: green; -} - -#emailStatus.fail { - color: red; -} - -</style> - -<form action="javascript:void(0);"> - <input type="email" placeholder="name@host.com" id="emailAddress" /> - <input class="button-primary" type="submit" value="Subscribe" id="emailSubscribe" /> - <span id="emailStatus"></span> -</form> - -<script> - -const emailAddress = document.getElementById("emailAddress"); -const emailSubscribe = document.getElementById("emailSubscribe"); -const emailSubscribeOrigValue = emailSubscribe.value; -const emailStatus = document.getElementById("emailStatus"); - -emailSubscribe.onclick = async () => { - - const api = await import("{{ StaticURL "api.js" }}"); - - emailSubscribe.disabled = true; - emailSubscribe.className = ""; - emailSubscribe.value = "Please hold..."; - emailStatus.innerHTML = ''; - - try { - - if (!window.isSecureContext) { - throw "The browser environment is not secure."; - } - - await api.call('/api/mailinglist/subscribe', { - body: { email: emailAddress.value }, - requiresPow: true, - }); - - emailStatus.className = "success"; - emailStatus.innerHTML = "Verification email sent (check your spam folder)"; - - } catch (e) { - emailStatus.className = "fail"; - emailStatus.innerHTML = e; - - } finally { - emailSubscribe.disabled = false; - emailSubscribe.className = "button-primary"; - emailSubscribe.value = emailSubscribeOrigValue; - } - -}; - -</script> - -<h2>Option 2: RSS</h2> - -<p> - RSS is the classic way to follow any blog. It comes from a time before - aggregators like reddit and twitter stole the show, when people felt capable - to manage their own content feeds. We should use it again. -</p> - -<p> - To follow over RSS give any RSS reader the following URL... -</p> - -<p> - <a href="{{ BlogURL "feed.xml" }}">{{ BlogURL "feed.xml" }}</a> -</p> - -<p> - ...and posts from this blog will show up in your RSS feed as soon as they are - published. There are literally thousands of RSS readers out there. Here's some - recommendations: -</p> - -<ul> - <li> - <a href="https://chrome.google.com/webstore/detail/rss-feed-reader/pnjaodmkngahhkoihejjehlcdlnohgmp"> - Google Chrome Browser Extension - </a> - </li> - - <li> - <a href="https://f-droid.org/en/packages/net.etuldan.sparss.floss/"> - spaRSS - </a> - is my preferred android RSS reader, but you'll need to install - <a href="https://f-droid.org/">f-droid</a> on your device to use it (a - good thing to do anyway, imo). - </li> - - <li> - <a href="https://ranchero.com/netnewswire/">NetNewsWire</a> - is a good reader for iPhone/iPad/Mac devices, so I'm told. Their homepage - description makes a much better sales pitch for RSS than I ever could. - </li> -</ul> - -{{ end }} - -{{ template "base.html" . }} diff --git a/srv/src/http/tpl/image.html b/srv/src/http/tpl/image.html deleted file mode 100644 index ba9b75d..0000000 --- a/srv/src/http/tpl/image.html +++ /dev/null @@ -1,5 +0,0 @@ -<div style="text-align: center;"> - <a href="{{ AssetURL .ID }}" target="_blank"> - <img src="{{ AssetURL .ID }}{{ if .Resizable }}?w=800{{ end }}" /> - </a> -</div> diff --git a/srv/src/http/tpl/index.html b/srv/src/http/tpl/index.html deleted file mode 100644 index ce5f264..0000000 --- a/srv/src/http/tpl/index.html +++ /dev/null @@ -1,37 +0,0 @@ -{{ define "body" }} - - {{ if ge .Payload.PrevPage 0 }} - <p> - <a href="?p={{ .Payload.PrevPage}}">< < Previous Page</a> - </p> - {{ else }} - <p> - Welcome to the Mediocre Blog! Posts are listed in chronological order. If - you aren't sure of where to start I recommend picking at random. - </p> - {{ end }} - - <table> - - <colgroup> - <col span="1" style="width: 5rem;"> - </colgroup> - - {{ range .Payload.Posts }} - <tr> - <td>{{ DateTimeFormat .PublishedAt }}</td> - <td><a href="{{ PostURL .ID }}">{{ .Title }}</td> - <td><em>{{ .Description }}</em></td> - </tr> - {{ end }} - </table> - - {{ if ge .Payload.NextPage 0 }} - <p> - <a href="?p={{ .Payload.NextPage}}">Next Page > ></a> - </p> - {{ end }} - -{{ end }} - -{{ template "base.html" . }} diff --git a/srv/src/http/tpl/post.html b/srv/src/http/tpl/post.html deleted file mode 100644 index 23500eb..0000000 --- a/srv/src/http/tpl/post.html +++ /dev/null @@ -1,44 +0,0 @@ -{{ define "body" }} - -<h1 id="post-headline"> - {{ .Payload.Title }} -</h1> - -<p> - <em>- {{ .Payload.Description }}</em> -</p> - -<hr/> - -{{ .Payload.Body }} - -<p><em> - Published {{ DateTimeFormat .Payload.PublishedAt }} - {{ if not .Payload.LastUpdatedAt.IsZero }} - <br/>Last updated {{ DateTimeFormat .Payload.LastUpdatedAt }} - {{ end }} -</em></p> - -{{ if (or .Payload.SeriesPrevious .Payload.SeriesNext) }} -<hr/> -<p><em> - This post is part of a series.<br/> - - {{ if .Payload.SeriesPrevious }} - Previously: <a href="{{ PostURL .Payload.SeriesPrevious.ID }}">{{ .Payload.SeriesPrevious.Title }}</a> - {{ end }} - - {{ if (and .Payload.SeriesNext .Payload.SeriesPrevious) }} - </br> - {{ end }} - - {{ if .Payload.SeriesNext }} - Next: <a href="{{ PostURL .Payload.SeriesNext.ID }}">{{ .Payload.SeriesNext.Title }}</a></br> - {{ end }} - -</em></p> -{{ end }} - -{{ end }} - -{{ template "base.html" . }} diff --git a/srv/src/http/tpl/posts.html b/srv/src/http/tpl/posts.html deleted file mode 100644 index fbeaa41..0000000 --- a/srv/src/http/tpl/posts.html +++ /dev/null @@ -1,47 +0,0 @@ -{{ define "body" }} - - <p> - <a href="{{ BlogURL "admin" }}">Back to Admin</a> - </p> - - <h1>Posts</h1> - - {{ if ge .Payload.PrevPage 0 }} - <p> - <a href="?p={{ .Payload.PrevPage}}">< < Previous Page</a> - </p> - {{ end }} - - <table> - - {{ range .Payload.Posts }} - <tr> - <td>{{ .PublishedAt.Local.Format "2006-01-02 15:04:05 MST" }}</td> - <td><a href="{{ PostURL .ID }}">{{ .Title }}</a></td> - <td> - <a href="{{ PostURL .ID }}?edit"> - Edit - </a> - </td> - <td> - <form - action="{{ PostURL .ID }}?method=delete" - method="POST" - > - <input type="submit" value="Delete" /> - </form> - </td> - </tr> - {{ end }} - - </table> - - {{ if ge .Payload.NextPage 0 }} - <p> - <a href="?p={{ .Payload.NextPage}}">Next Page > ></a> - </p> - {{ end }} - -{{ end }} - -{{ template "base.html" . }} diff --git a/srv/src/http/tpl/redirect.html b/srv/src/http/tpl/redirect.html deleted file mode 100644 index a50b324..0000000 --- a/srv/src/http/tpl/redirect.html +++ /dev/null @@ -1,9 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <meta http-equiv="refresh" content="0; url='{{ .Payload.URL }}'" /> - </head> - <body> - <p>Redirecting...</p> - </body> -</html> diff --git a/srv/src/http/tpl/unsubscribe.html b/srv/src/http/tpl/unsubscribe.html deleted file mode 100644 index ad01735..0000000 --- a/srv/src/http/tpl/unsubscribe.html +++ /dev/null @@ -1,44 +0,0 @@ -{{ define "body" }} - -<script async type="module" src="{{ StaticURL "api.js" }}"></script> - -<style> -#result.success { color: green; } -#result.fail { color: red; } -</style> - -<span id="result"></span> - -<script> - -(async () => { - - const resultSpan = document.getElementById("result"); - - try { - const urlParams = new URLSearchParams(window.location.search); - const unsubToken = urlParams.get('unsubToken'); - - if (!unsubToken) throw "No unsubscribe token provided"; - - const api = await import("{{ StaticURL "api.js" }}"); - - await api.call('/api/mailinglist/unsubscribe', { - body: { unsubToken }, - }); - - resultSpan.className = "success"; - resultSpan.innerHTML = "You have been unsubscribed! Please go on about your day."; - - } catch (e) { - resultSpan.className = "fail"; - resultSpan.innerHTML = e; - } - -})(); - -</script> - -{{ end }} - -{{ template "base.html" . }} |