diff options
Diffstat (limited to 'archive')
-rw-r--r-- | archive/tag.go | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/archive/tag.go b/archive/tag.go new file mode 100644 index 0000000..038ccb8 --- /dev/null +++ b/archive/tag.go @@ -0,0 +1,72 @@ +package archive + +import ( + "adammathes.com/snkt/config" + "adammathes.com/snkt/post" + "adammathes.com/snkt/render" + "fmt" + "path" +) + +var tagTmplName = "tag" + +/* +Tag archive shows set of posts broken by tag +Output goes to Config.HtmlDir/tag/{tag}.html +*/ +type TagArchive struct { + Posts post.Posts + Tag string + Site interface{} +} + +func (ta TagArchive) Render() []byte { + return render.Render(tagTmplName, ta) +} + +/* TODO: make this configurable */ +func (ta TagArchive) Target() string { + return path.Join(config.Config.HtmlDir, "/tag/", fmt.Sprintf("%s.html", ta.Tag)) +} + +type TagArchives []*TagArchive + +func ParseTags(posts post.Posts) *TagArchives { + + if !render.TmplExists(tagTmplName) { + fmt.Printf("no tag template\n") + return nil + } + + var tas TagArchives + + // create a map of [tag]posts + var tags map[string]post.Posts + tags = make(map[string]post.Posts) + + for _, p := range posts { + for _, t := range p.Tags { + _, ok := tags[t] + if !ok { + var ps post.Posts + tags[t] = ps + } + tags[t] = append(tags[t], p) + } + } + + for tag, posts := range tags { + var ta TagArchive + ta.Tag = tag + ta.Posts = posts + tas = append(tas, &ta) + } + + return &tas +} + +func (tas *TagArchives) Write() { + for _, ta := range *tas { + render.Write(ta) + } +} |