wikipress/pkg/wikipress/version.go
kekskurse 45d9761be1
All checks were successful
ci/woodpecker/push/commit Pipeline was successful
chore: init first alpha
2025-07-03 22:14:19 +02:00

99 lines
2 KiB
Go

package wikipress
import (
"bytes"
"fmt"
"strconv"
"strings"
"time"
"github.com/yuin/goldmark"
"github.com/yuin/goldmark/extension"
"github.com/yuin/goldmark/renderer/html"
)
type Version struct {
Author struct {
Name string
}
Message string
Date time.Time
content string
contentbinary []byte
Hash string
}
func (v Version) GetBody() string {
details := strings.SplitN(v.content, "---", 2)
if len(details) == 2 {
return details[1]
}
return ""
}
func (v Version) GetHeaders() map[string]string {
details := strings.SplitN(v.content, "---", 2)
if len(details) < 2 {
return make(map[string]string)
}
lines := strings.Split(details[0], "\n")
headers := make(map[string]string)
for _, line := range lines {
lineContent := strings.SplitN(line, ":", 2)
if len(lineContent) != 2 {
continue
}
headers[lineContent[0]] = strings.TrimSpace(lineContent[1])
}
return headers
}
func (v Version) GetHeader(name, defaultValue string) string {
headers := v.GetHeaders()
val, ok := headers[name]
if ok {
return val
}
return defaultValue
}
func (v Version) GetHeaderInt(name string, defaultValue int) int {
headers := v.GetHeaders()
val, ok := headers[name]
if ok {
vali, err := strconv.Atoi(val)
if err != nil {
return defaultValue
}
return vali
}
return defaultValue
}
func (v Version) GetHTMLContent() (string, error) {
mdParser := goldmark.New(
goldmark.WithExtensions(
extension.GFM, // GitHub-Flavored Markdown (inkl. Tabellen, Tasklists)
extension.Footnote, // Fußnoten
extension.Table, // Tabellen (redundant, aber explizit)
extension.Strikethrough, // Durchgestrichener Text
extension.DefinitionList,
extension.TaskList,
),
goldmark.WithRendererOptions(
html.WithHardWraps(),
html.WithUnsafe(), // erlaubt raw HTML (vorsichtig!)
),
)
var buf bytes.Buffer
err := mdParser.Convert([]byte(v.GetBody()), &buf)
if err != nil {
return "", fmt.Errorf("%w: %s", ErrCantParseMarkdownToHTML, err)
}
return buf.String(), nil
}