package web import ( "embed" "log" "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 { if artcl, ok := articles[name]; ok { return artcl } return nil } func init() { entries, _ := articlesFS.ReadDir("articles") for _, entry := range entries { if strings.HasSuffix(entry.Name(), articleFileExtension) { name := strings.TrimSuffix(entry.Name(), articleFileExtension) meta, err := articlesFS.ReadFile("articles/" + entry.Name()) if err != nil { log.Fatalln("an article \"", name, "\" cannot be read:", err) } md, err := articlesFS.ReadFile("articles/" + name + articleMetaExtension) if err != nil { log.Fatalln("a metadata for an article \"", name, "\" cannot be read:", err) } articles[name], err = article.New(markdown.ToHTML(md, nil, nil), meta) if err != nil { log.Fatalln("an article \"", name, "\" cannot be parsed:", err) } } } }