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
|
||||
|
||||
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-jsonnet v0.15.0
|
||||
github.com/markbates/pkger v0.15.1
|
||||
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/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.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/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM=
|
||||
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
|
||||
|
|
|
|||
77
main.go
77
main.go
|
|
@ -1,11 +1,9 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/go-clix/cli"
|
||||
|
|
@ -22,66 +20,25 @@ func main() {
|
|||
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 {
|
||||
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 (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
type Elem interface {
|
||||
|
|
@ -128,3 +130,20 @@ func Link(desc Elem, href string) LinkType {
|
|||
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
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/sh0rez/docsonnet/pkg/docsonnet"
|
||||
)
|
||||
|
||||
func Paths(pkg docsonnet.Package) map[string]docsonnet.Package {
|
||||
p := paths(pkg)
|
||||
for k, v := range p {
|
||||
delete(p, k)
|
||||
k = strings.TrimPrefix(k, pkg.Name+"/")
|
||||
p[k] = v
|
||||
}
|
||||
return p
|
||||
}
|
||||
|
||||
|
|
@ -26,7 +19,8 @@ func paths(pkg docsonnet.Package) map[string]docsonnet.Package {
|
|||
|
||||
for _, sub := range pkg.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"
|
||||
)
|
||||
|
||||
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
|
||||
elems := []md.Elem{
|
||||
md.Frontmatter(map[string]interface{}{
|
||||
"permalink": link,
|
||||
}),
|
||||
md.Headline(1, "package "+pkg.Name),
|
||||
md.CodeBlock("jsonnet", fmt.Sprintf(`local %s = import "%s"`, pkg.Name, pkg.Import)),
|
||||
md.Text(pkg.Help),
|
||||
}
|
||||
|
||||
// subpackages
|
||||
if len(pkg.Sub) > 0 {
|
||||
elems = append(elems, md.Headline(2, "Subpackages"))
|
||||
var items []md.Elem
|
||||
for k := range Paths(pkg) {
|
||||
name := strings.TrimSuffix(k, ".md")
|
||||
if name == pkg.Name {
|
||||
continue
|
||||
for _, s := range pkg.Sub {
|
||||
link := strings.Join(append(parents, pkg.Name, s.Name), "-")
|
||||
if root {
|
||||
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...))
|
||||
}
|
||||
|
|
@ -45,7 +56,29 @@ func Render(pkg docsonnet.Package) string {
|
|||
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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue