Alexander "Arav" Andreev
f18cc3c44e
Implemented an init func that preload articles. Implemented GetArticlesMetadata() that returns metadata for articles used on the Stuff page.
84 lines
1.7 KiB
Go
84 lines
1.7 KiB
Go
package web
|
|
|
|
import (
|
|
"embed"
|
|
"sort"
|
|
"strings"
|
|
"time"
|
|
|
|
"git.arav.su/Arav/dwelling-home/pkg/article"
|
|
"github.com/gomarkdown/markdown"
|
|
)
|
|
|
|
const (
|
|
articleFileExtension = ".md"
|
|
articleMetaExtension = ".meta"
|
|
)
|
|
|
|
//go:embed articles
|
|
var articlesFS embed.FS
|
|
var articles map[string]article.Article = make(map[string]article.Article)
|
|
|
|
// ArticleMetadata holds date, title and URL of an article used in articles list
|
|
// on the Stuff page.
|
|
type ArticleMetadata struct {
|
|
ID int64
|
|
Date time.Time
|
|
Title string
|
|
URL string
|
|
}
|
|
|
|
// GetArticlesMetadata returns a slice of metadata that is sorted by date
|
|
func GetArticlesMetadata() (meta []ArticleMetadata) {
|
|
for urlid, article := range articles {
|
|
|
|
meta = append(meta,
|
|
ArticleMetadata{
|
|
ID: article.ID,
|
|
Date: article.Date,
|
|
Title: article.Title,
|
|
URL: "stuff/article/" + urlid})
|
|
}
|
|
|
|
sort.Slice(meta, func(i, j int) bool {
|
|
return meta[i].ID > meta[j].ID
|
|
})
|
|
|
|
return
|
|
}
|
|
|
|
func GetArticle(name string) (*article.Article, error) {
|
|
if artcl, ok := articles[name]; ok {
|
|
return &artcl, nil
|
|
} else {
|
|
meta, err := articlesFS.ReadFile("articles/" + name + articleMetaExtension)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
md, err := articlesFS.ReadFile("articles/" + name + articleFileExtension)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
artcl := article.Article{
|
|
Body: markdown.ToHTML(md, nil, nil)}
|
|
|
|
artcl.ParseMetadata(meta)
|
|
|
|
articles[name] = artcl
|
|
|
|
return &artcl, nil
|
|
}
|
|
}
|
|
|
|
func init() {
|
|
entries, _ := articlesFS.ReadDir("articles")
|
|
|
|
for _, entry := range entries {
|
|
if strings.HasSuffix(entry.Name(), articleFileExtension) {
|
|
GetArticle(strings.TrimSuffix(entry.Name(), articleFileExtension))
|
|
}
|
|
}
|
|
}
|