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 ID 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 } 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 } articles[name], err = article.New(markdown.ToHTML(md, nil, nil), meta) return articles[name], err } func init() { entries, _ := articlesFS.ReadDir("articles") for _, entry := range entries { if strings.HasSuffix(entry.Name(), articleFileExtension) { GetArticle(strings.TrimSuffix(entry.Name(), articleFileExtension)) } } }