package page import ( "io/fs" "path/filepath" "strings" "sync" "time" ) var ( index map[string]PageList 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 separated 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(".", func(path string, info fs.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 } // Time fetches the time.Time from the Date field. func (p *Page) Time() time.Time { return p.Date.Time }