1
0

Code for articles fs moved out to a separate articles.go file.

Implemented an init func that preload articles.
Implemented GetArticlesMetadata() that returns metadata for articles used on the Stuff page.
This commit is contained in:
Alexander Andreev 2023-05-23 04:08:58 +04:00
parent db41e25c84
commit f18cc3c44e
Signed by: Arav
GPG Key ID: D22A817D95815393
2 changed files with 83 additions and 32 deletions

83
web/articles.go Normal file
View File

@ -0,0 +1,83 @@
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))
}
}
}

View File

@ -4,9 +4,6 @@ import (
"embed" "embed"
"io/fs" "io/fs"
"net/http" "net/http"
"git.arav.su/Arav/dwelling-home/pkg/article"
"github.com/gomarkdown/markdown"
) )
// To install a Jade compiler: go install github.com/Joker/jade/cmd/jade@latest // To install a Jade compiler: go install github.com/Joker/jade/cmd/jade@latest
@ -30,32 +27,3 @@ func Assets() http.FileSystem {
func AssetsGetFile(path string) ([]byte, error) { func AssetsGetFile(path string) ([]byte, error) {
return assetsDir.ReadFile("assets/" + path) return assetsDir.ReadFile("assets/" + path)
} }
//go:embed articles
var articlesFS embed.FS
var articles map[string]article.Article = make(map[string]article.Article)
func GetArticle(name string) (*article.Article, error) {
if artcl, ok := articles[name]; ok {
return &artcl, nil
} else {
meta, err := articlesFS.ReadFile("articles/" + name + ".meta")
if err != nil {
return nil, err
}
md, err := articlesFS.ReadFile("articles/" + name + ".md")
if err != nil {
return nil, err
}
artcl := article.Article{
Body: markdown.ToHTML(md, nil, nil)}
artcl.ParseMetadata(meta)
articles[name] = artcl
return &artcl, nil
}
}