mirror of
https://github.com/TECHNOFAB11/docsonnet.git
synced 2026-02-02 07:35:11 +01:00
feat: make paths work
This commit is contained in:
parent
21c8ebc75f
commit
75f8e7373c
6 changed files with 83 additions and 77 deletions
3
go.mod
3
go.mod
|
|
@ -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
2
go.sum
|
|
@ -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
77
main.go
|
|
@ -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
|
|
||||||
}
|
|
||||||
|
|
|
||||||
19
pkg/md/md.go
19
pkg/md/md.go
|
|
@ -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)}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue