aboutsummaryrefslogblamecommitdiffstats
path: root/site/site.go
blob: 00814ce8175a12c57b58740e854817013a3881d3 (plain) (tree)
1
2
3
4
5
6
7
8


            



                                     
                                  
















                                                                  
                                    





















                                                                         

                                                     
         








                                                                           
                                                                                   








                                                          





                                                                       




                                                                     

                                                                                     
                 

                                            













































                                                                                                

                                             



                                       














                                   
package site

import (
	"adammathes.com/snkt/archive"
	"adammathes.com/snkt/config"
	"adammathes.com/snkt/post"
	"adammathes.com/snkt/render"
	"adammathes.com/snkt/vlog"
	"io/ioutil"
	"log"
	"path"
	"sort"
)

type Site struct {
	Title string
	URL   string

	Posts post.Posts

	// all archives are optional based on presence of template
	Archive *archive.ListArchive
	Home    *archive.ListArchive
	Rss     *archive.ListArchive
	Paged   *archive.PagedArchives
	Tagged  *archive.TagArchives
}

/*
Read reads post data from the filesystem and populates posts and archives
*/
func (s *Site) Read() {
	s.Title = config.Config.SiteTitle
	s.URL = config.Config.SiteURL
	s.ReadPosts()

	if render.TmplExists("archive") {
		s.Archive = archive.NewListArchive(s.Posts)
		s.Archive.Site = *s
		sort.Sort(sort.Reverse(s.Archive.Posts))
	}
	if render.TmplExists("rss") {
		s.Rss = archive.NewRssArchive(s.Posts)
		s.Rss.Site = *s
	}
	if render.TmplExists("paged") {
		s.Paged = archive.CreatePaged(15, s.Posts)
	}
	if render.TmplExists("tag") {
		s.Tagged = archive.ParseTags(s.Posts)
	}
	if render.TmplExists("home") {
		s.Home = archive.NewListArchive(s.Posts)
		s.Home.Tgt = path.Join(config.Config.HtmlDir, "index.html")
		s.Home.Template = "home"
		s.Home.Site = s
	}
}

/*
ReadPosts reads all files from the Config.TxtDir, parses them and stores in s.Posts
*/
func (s *Site) ReadPosts() {
	// TODO: filter this as needed
	files, err := ioutil.ReadDir(config.Config.TxtDir)
	if err != nil {
		log.Fatal(err)
	}

	for _, file := range files {

		if config.IgnoredFile(file.Name()) {
			vlog.Printf("ignoring file: %s\n", file.Name())
			continue
		}

		p := post.NewPost(s)
		p.Read(file)

		// Ignore post-dated posts unless overriden in config
		if !config.Config.ShowFuture && p.InFuture {
			vlog.Printf("Skipping future dated post: %s\n", p.SourceFile)
			continue
		}

		s.Posts = append(s.Posts, p)
	}

	// Sort the posts by date, earliest first
	sort.Sort(s.Posts)

	// Add next/previous to each post.
	// An allocated but empty post is set at start/end
	// This prevents templates from failing at start/end if nil checks are not made properly
	for i, p := range s.Posts {
		if i > 0 {
			p.Prev = s.Posts[i-1]
		} else {
			p.Prev = new(post.Post)
		}
		if i+1 < len(s.Posts) {
			p.Next = s.Posts[i+1]
		} else {
			p.Next = new(post.Post)
		}
	}
}

/*
Write writes posts and archives to the filesystem
*/
func (s *Site) Write() {
	s.WritePosts()
	s.WriteArchives()
}

func (s *Site) WriteArchives() {
	if render.TmplExists("archive") {
		render.Write(s.Archive)
	}
	if render.TmplExists("rss") {
		render.Write(s.Rss)
	}
	if render.TmplExists("home") {
		render.Write(s.Home)
	}
	if render.TmplExists("paged") {
		for _, p := range *s.Paged {
			p.Site = s
			render.Write(p)
		}
	}
	if render.TmplExists("tag") {
		for _, t := range *s.Tagged {
			t.Site = s
			render.Write(t)
		}
	}
}

func (s *Site) WritePosts() {
	for _, p := range s.Posts {
		render.Write(p)
	}
}

func (s Site) GetTitle() string {
	return s.Title
}

func (s Site) GetURL() string {
	return s.URL
}