add typst export
This commit is contained in:
117
pkg/cat/cater.go
117
pkg/cat/cater.go
@ -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()
|
||||
|
Reference in New Issue
Block a user