htmgo/htmgo-site/internal/dirwalk/walk.go

58 lines
1.2 KiB
Go
Raw Normal View History

2024-09-20 16:45:23 +00:00
package dirwalk
import (
"github.com/maddalax/htmgo/framework/h"
2024-09-20 18:25:14 +00:00
"io/fs"
2024-09-20 16:45:23 +00:00
"os"
2024-09-23 19:41:43 +00:00
"slices"
"strconv"
2024-09-20 16:45:23 +00:00
"strings"
)
type Page struct {
RoutePath string
FilePath string
Parts []string
}
2024-09-23 19:41:43 +00:00
func WalkPages(dir string, system fs.FS) []*Page {
pages := make([]*Page, 0)
2024-09-20 18:25:14 +00:00
fs.WalkDir(system, dir, func(path string, d fs.DirEntry, err error) error {
2024-09-20 16:45:23 +00:00
if err != nil {
return err
}
2024-09-20 18:25:14 +00:00
name := d.Name()
if !d.IsDir() && (strings.HasSuffix(name, ".md") || strings.HasSuffix(name, ".go")) {
2024-09-20 16:45:23 +00:00
fullPath := strings.Replace(path, dir, "", 1)
fullPath = strings.TrimSuffix(fullPath, ".md")
2024-09-23 19:41:43 +00:00
pages = append(pages, &Page{
2024-09-20 16:45:23 +00:00
RoutePath: fullPath,
FilePath: path,
Parts: h.Filter(strings.Split(fullPath, string(os.PathSeparator)), func(item string) bool {
return item != ""
}),
})
}
return nil
})
2024-09-23 19:41:43 +00:00
var getRouteOrder = func(page *Page) int {
fileName := page.Parts[len(page.Parts)-1]
if len(fileName) > 1 && fileName[1] == '_' {
num, err := strconv.ParseInt(fileName[0:1], 10, 64)
if err != nil {
return 0
}
page.Parts[len(page.Parts)-1] = fileName[2:]
return int(num)
}
return 0
}
slices.SortFunc(pages, func(a *Page, b *Page) int {
return getRouteOrder(a) - getRouteOrder(b)
})
2024-09-20 16:45:23 +00:00
return pages
}