GoBlog/plugins/webrings/src/webrings/webrings.go

90 lines
2.1 KiB
Go

package webrings
import (
"fmt"
"go.goblog.app/app/pkgs/htmlbuilder"
"go.goblog.app/app/pkgs/plugintypes"
)
func GetPlugin() plugintypes.UI {
return &plugin{}
}
type plugin struct {
config map[string]any
}
func (*plugin) SetApp(_ plugintypes.App) {
// Ignore
}
func (p *plugin) SetConfig(config map[string]any) {
p.config = config
}
func (p *plugin) Render(hb *htmlbuilder.HtmlBuilder, t plugintypes.RenderType, data plugintypes.RenderData, render plugintypes.RenderNextFunc) {
render(hb)
if t == plugintypes.BlogFooterRenderType {
bd, ok := data.(plugintypes.BlogRenderData)
if !ok {
fmt.Println("webrings plugin: data is not BlogRenderData!")
return
}
blogData := bd.GetBlog()
if blogData == nil {
fmt.Println("webrings plugin: blog is nil!")
return
}
blog := blogData.GetBlog()
if blog == "" {
fmt.Println("webrings plugin: blog is empty!")
return
}
if blogWebringsAny, ok := p.config[blog]; ok {
if blogWebrings, ok := blogWebringsAny.([]any); ok {
for _, webringAny := range blogWebrings {
if webring, ok := webringAny.(map[string]any); ok {
title, titleOk := unwrapToString(webring["title"])
link, linkOk := unwrapToString(webring["link"])
prev, prevOk := unwrapToString(webring["prev"])
next, nextOk := unwrapToString(webring["next"])
if titleOk && (linkOk || prevOk || nextOk) {
hb.WriteElementOpen("p")
if prevOk {
hb.WriteElementOpen("a", "href", prev)
hb.WriteEscaped("←")
hb.WriteElementClose("a")
hb.WriteEscaped(" ")
}
if linkOk {
hb.WriteElementOpen("a", "href", link)
}
hb.WriteEscaped(title)
if linkOk {
hb.WriteElementClose("a")
}
if nextOk {
hb.WriteEscaped(" ")
hb.WriteElementOpen("a", "href", next)
hb.WriteEscaped("→")
hb.WriteElementClose("a")
}
hb.WriteElementClose("p")
}
}
}
}
}
}
}
func unwrapToString(o any) (string, bool) {
if o == nil {
return "", false
}
s, ok := o.(string)
return s, ok && s != ""
}