143 lines
2.2 KiB
Go
143 lines
2.2 KiB
Go
package cat
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
)
|
|
|
|
type Cater []entry
|
|
|
|
func Path(paths ...string) (c Cater, err error) {
|
|
c = make(Cater, 0, 10)
|
|
var p os.FileInfo
|
|
|
|
for _, path := range paths {
|
|
p, err = os.Stat(path)
|
|
if err != nil {
|
|
return
|
|
}
|
|
var e entry
|
|
if p.IsDir() {
|
|
e, err = c.dir(path)
|
|
} else {
|
|
e, err = c.file(path)
|
|
}
|
|
if err != nil {
|
|
return
|
|
}
|
|
c = append(c, e)
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func (c Cater) Ignored(ignore ignorer) Cater {
|
|
cat := make(Cater, 0, len(c))
|
|
ok := func(e entry) bool {
|
|
return !ignore.Ignore(e.fqname)
|
|
}
|
|
|
|
for _, entry := range c {
|
|
cat = append(cat, entry.filter(ok))
|
|
}
|
|
|
|
return cat
|
|
}
|
|
|
|
func (c Cater) ToString(delemiter string) string {
|
|
var sb strings.Builder
|
|
|
|
var entries []entry
|
|
entries = c
|
|
|
|
for len(entries) > 0 {
|
|
n := make([]entry, 0, len(entries))
|
|
for _, e := range entries {
|
|
if len(e.children) > 0 {
|
|
n = append(n, e.children...)
|
|
continue
|
|
}
|
|
sb.WriteString(fmt.Sprintf(delemiter, e.fqname))
|
|
sb.WriteString(e.content)
|
|
}
|
|
entries = n
|
|
}
|
|
|
|
return sb.String()
|
|
}
|
|
|
|
func (c Cater) ToMarkdown() string {
|
|
var sb strings.Builder
|
|
|
|
write := func(e entry, lvl int) {
|
|
for range lvl {
|
|
sb.WriteString("#")
|
|
}
|
|
sb.WriteString(fmt.Sprintf(" %s (`%s`)\n", e.name, e.fqname))
|
|
|
|
if len(e.content) > 0 {
|
|
prts := strings.Split(e.name, ".")
|
|
sb.WriteString(
|
|
fmt.Sprintf(
|
|
"```%s\n%s\n```\n\n",
|
|
|
|
prts[len(prts)-1],
|
|
strings.ReplaceAll(
|
|
e.content,
|
|
"```",
|
|
"\\`\\`\\`",
|
|
),
|
|
),
|
|
)
|
|
}
|
|
}
|
|
|
|
for _, e := range c {
|
|
e.traverse(1, write)
|
|
}
|
|
|
|
return sb.String()
|
|
}
|
|
|
|
func (c Cater) ToTypst() string {
|
|
var sb strings.Builder
|
|
|
|
write := func(e entry, lvl int) {
|
|
for range lvl {
|
|
sb.WriteString("=")
|
|
}
|
|
sb.WriteString(fmt.Sprintf(" %s (`%s`)\n", e.name, e.fqname))
|
|
|
|
if len(e.content) > 0 {
|
|
prts := strings.Split(e.name, ".")
|
|
sb.WriteString(
|
|
fmt.Sprintf(
|
|
"```%s\n%s\n```\n\n",
|
|
|
|
prts[len(prts)-1],
|
|
strings.ReplaceAll(
|
|
e.content,
|
|
"```",
|
|
"\\`\\`\\`",
|
|
),
|
|
),
|
|
)
|
|
}
|
|
}
|
|
|
|
for _, e := range c {
|
|
|
|
sb.WriteString("= Export\n")
|
|
sb.WriteString("#outline()\n")
|
|
e.traverse(1, write)
|
|
}
|
|
|
|
return sb.String()
|
|
}
|
|
|
|
type ignorer interface {
|
|
// Ignore() returns true when the given path shall be Ignored.
|
|
Ignore(path string) bool
|
|
}
|