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 } // GetArticleMetadata returns a slice of metadata that is sorted by date func GetArticleMetadata() (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)) } } }