add typst export

This commit is contained in:
u80864958
2025-05-07 11:00:32 +02:00
parent c0fe9a4a46
commit 454554f8e0
6 changed files with 151 additions and 49 deletions

View File

@ -3,14 +3,13 @@ package cat
import (
"fmt"
"os"
"slices"
"strings"
)
type Cater map[string]string
type Cater []entry
func Path(paths ...string) (c Cater, err error) {
c = make(Cater)
c = make(Cater, 0, 10)
var p os.FileInfo
for _, path := range paths {
@ -18,28 +17,29 @@ func Path(paths ...string) (c Cater, err error) {
if err != nil {
return
}
var e entry
if p.IsDir() {
err = c.dir(path)
e, err = c.dir(path)
} else {
err = c.file(path)
e, err = c.file(path)
}
if err != nil {
return
}
c = append(c, e)
}
return
}
func (c Cater) Ignored(ignore ignorer) Cater {
cat := make(Cater)
cat := make(Cater, 0, len(c))
ok := func(e entry) bool {
return !ignore.Ignore(e.fqname)
}
for name, content := range c {
if ignore.Ignore(name) {
continue
}
cat[name] = content
for _, entry := range c {
cat = append(cat, entry.filter(ok))
}
return cat
@ -48,16 +48,20 @@ func (c Cater) Ignored(ignore ignorer) Cater {
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)
}
var entries []entry
entries = c
slices.Sort(names)
for _, name := range names {
sb.WriteString(fmt.Sprintf(delemiter, name))
sb.WriteString(c[name])
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()
@ -66,24 +70,67 @@ func (c Cater) ToString(delemiter string) 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 {
write := func(e entry, lvl int) {
for range lvl {
sb.WriteString("#")
}
sb.WriteString(fmt.Sprintf(" %s\n\n", name))
sb.WriteString(fmt.Sprintf(" %s (`%s`)\n", e.name, e.fqname))
splited := strings.Split(name, ".")
if len(e.content) > 0 {
prts := strings.Split(e.name, ".")
sb.WriteString(
fmt.Sprintf(
"```%s\n%s\n```\n\n",
// write content
sb.WriteString(fmt.Sprintf("``` %s\n%s\n```\n\n", splited[len(splited)-1], c[name]))
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()