package page import ( "os" "path/filepath" "strings" "sync" "time" ) var index map[string]PageList var indexMu sync.RWMutex // RebuildIndex can be called in order to rebuild the entire website // index func (p *Page) RebuildIndex() error { indexMu.Lock() index = nil indexMu.Unlock() _, err := p.Index() return err } // Index returns a map of all pages in the current directory seperated into // their respective tags If a Page has multiple tags it will be listed under // each. // Pages are located by their Suffix, default being ".md" func (p *Page) Index() (map[string]PageList, error) { indexMu.RLock() if index != nil && CacheIndex { indexMu.RUnlock() return index, nil } indexMu.RUnlock() Logger.Println("Rebuilding index...") out := make(map[string]PageList) filepath.Walk(filepath.Dir("."), func(path string, info os.FileInfo, err error) error { if err != nil { return err } if !info.IsDir() && strings.HasSuffix(info.Name(), Suffix) { p2 := NewPage(strings.ReplaceAll(path, Suffix, "")) err = p2.Read() if err != nil { Logger.Println("Error encountered: ", err) return err } for tag, _ := range p2.Tags { if _, ok := out[tag]; !ok { out[tag] = []*Page{p2} } else { out[tag] = append(out[tag], p2) } } } return nil }) indexMu.Lock() index = out indexMu.Unlock() return out, nil } func (p *Page) Time() time.Time { return p.Date.Time }