diff --git a/web/articles.go b/web/articles.go new file mode 100644 index 0000000..7036904 --- /dev/null +++ b/web/articles.go @@ -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)) + } + } +} diff --git a/web/web.go b/web/web.go index 841a05e..6c4eca6 100644 --- a/web/web.go +++ b/web/web.go @@ -4,9 +4,6 @@ import ( "embed" "io/fs" "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 @@ -30,32 +27,3 @@ func Assets() http.FileSystem { func AssetsGetFile(path string) ([]byte, error) { 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 - } -}