package main import ( "fmt" "golang.org/x/net/html" "html/template" "io/ioutil" "os" "path/filepath" "strings" "time" ) //Post : Is exported type Post struct { Date time.Time Title string URLTitle string Content template.HTML } const layout = "2006-01-02" var modTime time.Time var postsCollection []Post func NewPostsCollection() { verifyFolderModification() initializeCollection() go acquirePosts(100) } func initializeCollection() { postsCollection = nil filepath.Walk("./posts", newPost) } func acquirePosts(duration time.Duration) { for { if verifyFolderModification() == true { initializeCollection() } time.Sleep(duration * time.Second) } } func verifyFolderModification() bool { f, err := os.Open("./posts") if err != nil { fmt.Println("file-error here: \n", f) return false } info, err := f.Stat() if err != nil { fmt.Println("info here: \n", info) return false } _modTime := info.ModTime() if modTime != _modTime { modTime = _modTime return true } return false } func newPost(path string, f os.FileInfo, err error) error { content, err := ioutil.ReadFile(path) if err != nil { fmt.Println(err) return nil } title := strings.Replace(path, "posts/", "", -1) if title == ".DS_Store" { return nil } s := string(content) doc, _ := html.Parse(strings.NewReader(s)) var p = Post{ getDate(doc), title, strings.Replace(title, " ", "-", -1), template.HTML(string(content[:len(content)])), } postsCollection = insertPostAccordingToDate(p, postsCollection) fmt.Println(len(postsCollection)) for _, d := range postsCollection { fmt.Println("dates are ", d.Date) } return nil } func getDate(n *html.Node) time.Time { var zero, d, t time.Time if n.Type == html.ElementNode && n.Data == "time" { for _, a := range n.Attr { if a.Key == "datetime" { t, _ = time.Parse(layout, a.Val) return t } } } for c := n.FirstChild; c != nil; c = c.NextSibling { d = getDate(c) if d != zero { return d } } return t } func getNewestPosts(numberOfPosts int) []Post { var posts []Post l := len(postsCollection) for i := l - 1; i >= l-numberOfPosts; i-- { posts = append(posts, postsCollection[i]) } return posts } func getPostByURLTitle(title string) Post { for _, post := range postsCollection { if post.URLTitle == title { return post } } return Post{} } func insertPostAccordingToDate(post Post, arr []Post) []Post { fmt.Println(post.Title) for i, p := range arr { if p.Date.After(post.Date) { s := make([]Post, len(arr)+1, cap(arr)+1) copy(s[:], arr[:]) //make a copy of the slice copy(s[i+1:], arr[i:]) //move the upper part of the slice ahead, creating a hole s[i] = post //insert new element into hole return s } } postsCollection = append(postsCollection, post) return postsCollection }