1 # Generating Markdown Docs For Your Own cobra.Command
3 Generating man pages from a cobra command is incredibly easy. An example is as follows:
11 "github.com/spf13/cobra"
12 "github.com/spf13/cobra/doc"
16 cmd := &cobra.Command{
18 Short: "my test program",
20 err := doc.GenMarkdownTree(cmd, "/tmp")
27 That will get you a Markdown document `/tmp/test.md`
29 ## Generate markdown docs for the entire command tree
31 This program can actually generate docs for the kubectl command in the kubernetes project
41 "k8s.io/kubernetes/pkg/kubectl/cmd"
42 cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
44 "github.com/spf13/cobra/doc"
48 kubectl := cmd.NewKubectlCommand(cmdutil.NewFactory(nil), os.Stdin, ioutil.Discard, ioutil.Discard)
49 err := doc.GenMarkdownTree(kubectl, "./")
56 This will generate a whole series of files, one for each command in the tree, in the directory specified (in this case "./")
58 ## Generate markdown docs for a single command
60 You may wish to have more control over the output, or only generate for a single command, instead of the entire command tree. If this is the case you may prefer to `GenMarkdown` instead of `GenMarkdownTree`
63 out := new(bytes.Buffer)
64 err := doc.GenMarkdown(cmd, out)
70 This will write the markdown doc for ONLY "cmd" into the out, buffer.
72 ## Customize the output
74 Both `GenMarkdown` and `GenMarkdownTree` have alternate versions with callbacks to get some control of the output:
77 func GenMarkdownTreeCustom(cmd *Command, dir string, filePrepender, linkHandler func(string) string) error {
83 func GenMarkdownCustom(cmd *Command, out *bytes.Buffer, linkHandler func(string) string) error {
88 The `filePrepender` will prepend the return value given the full filepath to the rendered Markdown file. A common use case is to add front matter to use the generated documentation with [Hugo](http://gohugo.io/):
91 const fmTemplate = `---
99 filePrepender := func(filename string) string {
100 now := time.Now().Format(time.RFC3339)
101 name := filepath.Base(filename)
102 base := strings.TrimSuffix(name, path.Ext(name))
103 url := "/commands/" + strings.ToLower(base) + "/"
104 return fmt.Sprintf(fmTemplate, now, strings.Replace(base, "_", " ", -1), base, url)
108 The `linkHandler` can be used to customize the rendered internal links to the commands, given a filename:
111 linkHandler := func(name string) string {
112 base := strings.TrimSuffix(name, path.Ext(name))
113 return "/commands/" + strings.ToLower(base) + "/"