mirror of https://github.com/jlelse/GoBlog
90 lines
2.1 KiB
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 != ""
|
|
}
|