basic blog page!

This commit is contained in:
ari melody 2025-04-02 23:04:09 +01:00
parent 8eb432539c
commit 1a8dc4d9ce
Signed by: ari
GPG key ID: 60B5F0386E3DDB7E
9 changed files with 209 additions and 0 deletions

1
go.mod
View file

@ -10,6 +10,7 @@ require (
require golang.org/x/crypto v0.27.0 // indirect
require (
github.com/gomarkdown/markdown v0.0.0-20250311123330-531bef5e742b // indirect
github.com/gorilla/websocket v1.5.3 // indirect
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect

2
go.sum
View file

@ -2,6 +2,8 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
github.com/gomarkdown/markdown v0.0.0-20250311123330-531bef5e742b h1:EY/KpStFl60qA17CptGXhwfZ+k1sFNJIUNR8DdbcuUk=
github.com/gomarkdown/markdown v0.0.0-20250311123330-531bef5e742b/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA=
github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg=
github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o=

View file

@ -448,6 +448,7 @@ func createServeMux(app *model.AppState) *http.ServeMux {
mux.Handle("/admin/", http.StripPrefix("/admin", admin.Handler(app)))
mux.Handle("/api/", http.StripPrefix("/api", api.Handler(app)))
mux.Handle("/music/", http.StripPrefix("/music", view.MusicHandler(app)))
mux.Handle("/blog/", http.StripPrefix("/blog", view.BlogHandler(app)))
mux.Handle("/uploads/", http.StripPrefix("/uploads", staticHandler(filepath.Join(app.Config.DataDirectory, "uploads"))))
mux.Handle("/cursor-ws", cursor.Handler(app))
mux.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {

39
model/blog.go Normal file
View file

@ -0,0 +1,39 @@
package model
import (
"fmt"
"html/template"
"regexp"
"strings"
"time"
)
type (
Blog struct {
Title string `db:"title"`
Description string `db:"description"`
Visible bool `db:"visible"`
Date time.Time `db:"date"`
AuthorID string `db:"author"`
Markdown string `db:"markdown"`
HTML template.HTML `db:"html"`
}
)
func (b *Blog) TitleNormalised() string {
rgx := regexp.MustCompile(`[^a-z0-9\-]`)
return rgx.ReplaceAllString(
strings.ReplaceAll(
strings.ToLower(b.Title), " ", "-",
),
"",
)
}
func (b *Blog) GetMonth() string {
return fmt.Sprintf("%02d", int(b.Date.Month()))
}
func (b *Blog) PrintDate() string {
return b.Date.Format("02 January 2006")
}

BIN
public/img/aridoodle.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

0
public/script/blog.js Normal file
View file

46
public/style/blog.css Normal file
View file

@ -0,0 +1,46 @@
main {
margin: 0 auto 1rem auto;
}
article.blog {
font-family: 'Lora', serif;
}
.blog-date {
margin-top: -1em;
opacity: .75;
}
.blog p {
line-height: 1.5em;
}
.blog p:hover {
background: inherit;
}
.blog sub {
opacity: .75;
}
.blog img {
margin: 0 auto;
max-height: 50%;
max-width: 100%;
display: block;
}
.blog i.end-mark {
width: 1.2em;
height: 1.2em;
margin-top: -.2em;
display: inline-block;
transform: translateY(.2em);
background: url("/img/aridoodle.png");
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}

86
view/blog.go Normal file
View file

@ -0,0 +1,86 @@
package view
import (
"html/template"
"net/http"
"time"
"arimelody-web/model"
"arimelody-web/templates"
"github.com/gomarkdown/markdown"
"github.com/gomarkdown/markdown/html"
"github.com/gomarkdown/markdown/parser"
)
var mdRenderer = html.NewRenderer(html.RendererOptions{
Flags: html.CommonFlags | html.HrefTargetBlank,
})
func BlogHandler(app *model.AppState) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
blog := model.Blog{
Title: "hello world!~",
Description: "lorem ipsum yadda yadda something boobies babababababababa",
Visible: true,
Date: time.Now(),
AuthorID: "ari",
Markdown:
`
# hello, world!
i'm ari!
she/her 🏳🏳🌈💫🦆🇮🇪
i'm a musician, developer, streamer, youtuber, and probably a bunch of other things i forgot to mention!
you're very welcome to take a look around my little space on the internet here, or explore any of the other parts i inhabit!
if you're looking to support me financially, that's so cool of you!! if you like, you can buy some of my music over on bandcamp so you can at least get something for your money. thank you very much either way!! 💕
for anything else, you can reach me for any and all communications through ari@arimelody.me. if your message contains anything beyond a silly gag, i strongly recommend encrypting your message using my public pgp key, listed below!
thank you for stopping by- i hope you have a lovely rest of your day! 💫
## metadata
**my colours 🌈**
- primary: <span class="col-primary">#b7fd49</span>
- secondary: <span class="col-secondary">#f8e05b</span>
- tertiary: <span class="col-tertiary">#f788fe</span>
**my keys 🔑**
- pgp: [[link]](/keys/ari%20melody_0x92678188_public.asc)
- ssh (ed25519): [[link]](/keys/id_ari_ed25519.pub)
**where to find me 🛰**
- youtube
- twitch
- spotify
- bandcamp
- github
**projects i've worked on 🛠**
- catdance
- pride flag
- ipaddrgen
- impact meme
- OpenTerminal
- Silver.js
`,
}
// blog.Markdown += " <i class=\"end-mark\"></i>"
mdParser := parser.NewWithExtensions(parser.CommonExtensions | parser.AutoHeadingIDs)
md := mdParser.Parse([]byte(blog.Markdown))
blog.HTML = template.HTML(markdown.Render(md, mdRenderer))
templates.BlogTemplate.Execute(w, &blog)
})
}

34
view/blog.html Normal file
View file

@ -0,0 +1,34 @@
{{define "head"}}
<title>{{.Title}} - ari melody 💫</title>
<link rel="shortcut icon" href="/img/favicon.png" type="image/x-icon">
<meta name="description" content="{{.Description}}">
<meta property="og:title" content="{{.Title}}">
<meta property="og:type" content="article">
<meta property="og:url" content="www.arimelody.me/blog/{{.Date.Year}}/{{.GetMonth}}/{{.TitleNormalised}}">
<meta property="og:image" content="https://www.arimelody.me/img/favicon.png">
<meta property="og:site_name" content="ari melody">
<meta property="og:description" content="{{.Description}}">
<link rel="stylesheet" href="/style/main.css">
<link rel="stylesheet" href="/style/index.css">
<link rel="stylesheet" href="/style/blog.css">
{{end}}
{{define "content"}}
<main>
<article class="blog">
<h1 class="typeout">{{.Title}}</h1>
<p class="blog-date">Posted by <a href="/blog/{{.AuthorID}}">{{.AuthorID}}</a> @ {{.PrintDate}}</p>
<hr>
{{.HTML}}
<hr>
<!-- comments section here! -->
</article>
<script type="module" src="/script/blog.js"></script>
</main>
{{end}}