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, "/") { 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 }