Files
pat/pkg/cat/cater.go
2025-05-02 13:21:27 +02:00

96 lines
1.5 KiB
Go

package cat
import (
"fmt"
"os"
"slices"
"strings"
)
type Cater map[string]string
func Path(paths ...string) (c Cater, err error) {
c = make(Cater)
var p os.FileInfo
for _, path := range paths {
p, err = os.Stat(path)
if err != nil {
return
}
if p.IsDir() {
err = c.dir(path)
} else {
err = c.file(path)
}
if err != nil {
return
}
}
return
}
func (c Cater) Ignored(ignore ignorer) Cater {
cat := make(Cater)
for name, content := range c {
if ignore.Ignore(name) {
continue
}
cat[name] = content
}
return cat
}
func (c Cater) ToString(delemiter string) string {
var sb strings.Builder
names := make([]string, 0, len(c))
for name := range c {
names = append(names, name)
}
slices.Sort(names)
for _, name := range names {
sb.WriteString(fmt.Sprintf(delemiter, name))
sb.WriteString(c[name])
}
return sb.String()
}
func (c Cater) ToMarkdown() string {
var sb strings.Builder
names := make([]string, 0, len(c))
for name := range c {
names = append(names, name)
}
slices.Sort(names)
for _, name := range names {
// write header
for range strings.Count(name, "/") + 1 {
sb.WriteString("#")
}
sb.WriteString(fmt.Sprintf(" %s\n\n", name))
splited := strings.Split(name, ".")
// write content
sb.WriteString(fmt.Sprintf("``` %s\n%s\n```\n\n", splited[len(splited)-1], c[name]))
}
return sb.String()
}
type ignorer interface {
// Ignore() returns true when the given path shall be Ignored.
Ignore(path string) bool
}