feat: make paths work

This commit is contained in:
sh0rez 2020-05-02 19:54:34 +02:00
parent 21c8ebc75f
commit 75f8e7373c
No known key found for this signature in database
GPG key ID: 87C71DF9F8181FF1
6 changed files with 83 additions and 77 deletions

3
go.mod
View file

@ -3,9 +3,10 @@ module github.com/sh0rez/docsonnet
go 1.14 go 1.14
require ( require (
github.com/go-clix/cli v0.1.1 github.com/go-clix/cli v0.1.2-0.20200502172020-b8f4629e879a
github.com/google/go-cmp v0.4.0 github.com/google/go-cmp v0.4.0
github.com/google/go-jsonnet v0.15.0 github.com/google/go-jsonnet v0.15.0
github.com/markbates/pkger v0.15.1 github.com/markbates/pkger v0.15.1
github.com/stretchr/testify v1.4.0 github.com/stretchr/testify v1.4.0
gopkg.in/yaml.v2 v2.2.7
) )

2
go.sum
View file

@ -4,6 +4,8 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/go-clix/cli v0.1.1 h1:T9N0AdMbmpFM9cLw42TcLL5sQ3YgyxTyHUhBK0GW1LI= github.com/go-clix/cli v0.1.1 h1:T9N0AdMbmpFM9cLw42TcLL5sQ3YgyxTyHUhBK0GW1LI=
github.com/go-clix/cli v0.1.1/go.mod h1:dYJevXraB9mXZFhz5clyQestG0qGcmT5rRC/P9etoRQ= github.com/go-clix/cli v0.1.1/go.mod h1:dYJevXraB9mXZFhz5clyQestG0qGcmT5rRC/P9etoRQ=
github.com/go-clix/cli v0.1.2-0.20200502172020-b8f4629e879a h1:nh+UOawbjKgiUAJAgi8JHctNebEu6mjwDXsv8Xdln8w=
github.com/go-clix/cli v0.1.2-0.20200502172020-b8f4629e879a/go.mod h1:dYJevXraB9mXZFhz5clyQestG0qGcmT5rRC/P9etoRQ=
github.com/gobuffalo/here v0.6.0 h1:hYrd0a6gDmWxBM4TnrGw8mQg24iSVoIkHEk7FodQcBI= github.com/gobuffalo/here v0.6.0 h1:hYrd0a6gDmWxBM4TnrGw8mQg24iSVoIkHEk7FodQcBI=
github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM=
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=

77
main.go
View file

@ -1,11 +1,9 @@
package main package main
import ( import (
"encoding/json"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"log" "log"
"os"
"path/filepath" "path/filepath"
"github.com/go-clix/cli" "github.com/go-clix/cli"
@ -22,66 +20,25 @@ func main() {
Short: "Utility to parse and transform Jsonnet code that uses the docsonnet extension", Short: "Utility to parse and transform Jsonnet code that uses the docsonnet extension",
} }
root.AddCommand(loadCmd(), renderCmd()) output := root.Flags().StringP("output", "o", "docs", "directory to write the .md files to")
root.Run = func(cmd *cli.Command, args []string) error {
pkg, err := docsonnet.Load(args[0])
if err != nil {
return err
}
data := render.Render(*pkg)
for k, v := range data {
fmt.Println(k)
if err := ioutil.WriteFile(filepath.Join(*output, k), []byte(v), 0644); err != nil {
return err
}
}
return nil
}
if err := root.Execute(); err != nil { if err := root.Execute(); err != nil {
log.Fatalln(err) log.Fatalln(err)
} }
} }
func loadCmd() *cli.Command {
cmd := &cli.Command{
Use: "load",
Short: "extracts docsonnet from Jsonnet and prints it as JSON",
Args: cli.ArgsExact(1),
}
cmd.Run = func(cmd *cli.Command, args []string) error {
pkg, err := docsonnet.Load(args[0])
if err != nil {
return err
}
data, err := json.MarshalIndent(pkg, "", " ")
if err != nil {
return err
}
fmt.Println(string(data))
return nil
}
return cmd
}
func renderCmd() *cli.Command {
cmd := &cli.Command{
Use: "render",
Short: "writes all found docsonnet packages to Markdown (.md) files, suitable for e.g. GitHub",
Args: cli.ArgsExact(1),
}
output := cmd.Flags().StringP("output", "o", "docs", "directory to write the .md files to")
cmd.Run = func(cmd *cli.Command, args []string) error {
pkg, err := docsonnet.Load(args[0])
if err != nil {
return err
}
for path, pkg := range render.Paths(*pkg) {
to := filepath.Join(*output, path)
if err := os.MkdirAll(filepath.Dir(to), os.ModePerm); err != nil {
return err
}
data := render.Render(pkg)
if err := ioutil.WriteFile(to, []byte(data), 0644); err != nil {
return err
}
}
return nil
}
return cmd
}

View file

@ -3,6 +3,8 @@ package md
import ( import (
"fmt" "fmt"
"strings" "strings"
"gopkg.in/yaml.v2"
) )
type Elem interface { type Elem interface {
@ -128,3 +130,20 @@ func Link(desc Elem, href string) LinkType {
href: href, href: href,
} }
} }
type FrontmatterType struct {
yaml string
}
func (f FrontmatterType) String() string {
return "---\n" + f.yaml + "---"
}
func Frontmatter(data map[string]interface{}) FrontmatterType {
d, err := yaml.Marshal(data)
if err != nil {
panic(err)
}
return FrontmatterType{yaml: string(d)}
}

View file

@ -1,18 +1,11 @@
package render package render
import ( import (
"strings"
"github.com/sh0rez/docsonnet/pkg/docsonnet" "github.com/sh0rez/docsonnet/pkg/docsonnet"
) )
func Paths(pkg docsonnet.Package) map[string]docsonnet.Package { func Paths(pkg docsonnet.Package) map[string]docsonnet.Package {
p := paths(pkg) p := paths(pkg)
for k, v := range p {
delete(p, k)
k = strings.TrimPrefix(k, pkg.Name+"/")
p[k] = v
}
return p return p
} }
@ -26,7 +19,8 @@ func paths(pkg docsonnet.Package) map[string]docsonnet.Package {
for _, sub := range pkg.Sub { for _, sub := range pkg.Sub {
for k, v := range paths(sub) { for k, v := range paths(sub) {
pkgs[pkg.Name+"/"+k] = v v.Name = pkg.Name + "/" + k
pkgs[pkg.Name+"-"+k] = v
} }
} }

View file

@ -10,24 +10,35 @@ import (
"github.com/sh0rez/docsonnet/pkg/slug" "github.com/sh0rez/docsonnet/pkg/slug"
) )
func Render(pkg docsonnet.Package) string { func Render(pkg docsonnet.Package) map[string]string {
return render(pkg, nil, true)
}
func render(pkg docsonnet.Package, parents []string, root bool) map[string]string {
link := "/" + strings.Join(append(parents, pkg.Name), "/")
if root {
link = "/"
}
// head // head
elems := []md.Elem{ elems := []md.Elem{
md.Frontmatter(map[string]interface{}{
"permalink": link,
}),
md.Headline(1, "package "+pkg.Name), md.Headline(1, "package "+pkg.Name),
md.CodeBlock("jsonnet", fmt.Sprintf(`local %s = import "%s"`, pkg.Name, pkg.Import)), md.CodeBlock("jsonnet", fmt.Sprintf(`local %s = import "%s"`, pkg.Name, pkg.Import)),
md.Text(pkg.Help), md.Text(pkg.Help),
} }
// subpackages
if len(pkg.Sub) > 0 { if len(pkg.Sub) > 0 {
elems = append(elems, md.Headline(2, "Subpackages")) elems = append(elems, md.Headline(2, "Subpackages"))
var items []md.Elem var items []md.Elem
for k := range Paths(pkg) { for _, s := range pkg.Sub {
name := strings.TrimSuffix(k, ".md") link := strings.Join(append(parents, pkg.Name, s.Name), "-")
if name == pkg.Name { if root {
continue link = strings.Join(append(parents, s.Name), "-")
} }
items = append(items, md.Link(md.Text(name), k)) items = append(items, md.Link(md.Text(s.Name), link+".md"))
} }
elems = append(elems, md.List(items...)) elems = append(elems, md.List(items...))
} }
@ -45,7 +56,29 @@ func Render(pkg docsonnet.Package) string {
elems = append(elems, renderApi(pkg.API, "")...) elems = append(elems, renderApi(pkg.API, "")...)
} }
return md.Doc(elems...).String() content := md.Doc(elems...).String()
key := strings.Join(append(parents, pkg.Name+".md"), "-")
if root {
key = "README.md"
}
out := map[string]string{
key: content,
}
if len(pkg.Sub) != 0 {
for _, s := range pkg.Sub {
path := append(parents, pkg.Name)
if root {
path = parents
}
got := render(s, path, false)
for k, v := range got {
out[k] = v
}
}
}
return out
} }
func renderIndex(api docsonnet.Fields, path string, s *slug.Slugger) []md.Elem { func renderIndex(api docsonnet.Fields, path string, s *slug.Slugger) []md.Elem {