140 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
| package cmd
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"fmt"
 | |
| 	"io"
 | |
| 	"os"
 | |
| 	"path/filepath"
 | |
| 	"sort"
 | |
| 	"strings"
 | |
| 
 | |
| 	"github.com/spf13/cobra"
 | |
| 	"github.com/spf13/pflag"
 | |
| )
 | |
| 
 | |
| func init() {
 | |
| 	rootCmd.AddCommand(docsCmd)
 | |
| 	docsCmd.Flags().StringP("path", "p", "./docs", "path to save the docs")
 | |
| }
 | |
| 
 | |
| func printToc(names []string) {
 | |
| 	for i, name := range names {
 | |
| 		name = strings.TrimSuffix(name, filepath.Ext(name))
 | |
| 		name = strings.Replace(name, "-", " ", -1)
 | |
| 		names[i] = name
 | |
| 	}
 | |
| 
 | |
| 	sort.Strings(names)
 | |
| 
 | |
| 	toc := ""
 | |
| 	for _, name := range names {
 | |
| 		toc += "* [" + name + "](cli/" + strings.Replace(name, " ", "-", -1) + ".md)\n"
 | |
| 	}
 | |
| 
 | |
| 	fmt.Println(toc)
 | |
| }
 | |
| 
 | |
| var docsCmd = &cobra.Command{
 | |
| 	Use:    "docs",
 | |
| 	Hidden: true,
 | |
| 	Args:   cobra.NoArgs,
 | |
| 	Run: func(cmd *cobra.Command, args []string) {
 | |
| 		dir := mustGetString(cmd.Flags(), "path")
 | |
| 		generateDocs(rootCmd, dir)
 | |
| 		names := []string{}
 | |
| 
 | |
| 		err := filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
 | |
| 			if err != nil || info.IsDir() {
 | |
| 				return err
 | |
| 			}
 | |
| 
 | |
| 			if !strings.HasPrefix(info.Name(), "filebrowser") {
 | |
| 				return nil
 | |
| 			}
 | |
| 
 | |
| 			names = append(names, info.Name())
 | |
| 			return nil
 | |
| 		})
 | |
| 
 | |
| 		checkErr(err)
 | |
| 		printToc(names)
 | |
| 	},
 | |
| }
 | |
| 
 | |
| func generateDocs(cmd *cobra.Command, dir string) {
 | |
| 	for _, c := range cmd.Commands() {
 | |
| 		if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() {
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		generateDocs(c, dir)
 | |
| 	}
 | |
| 
 | |
| 	basename := strings.Replace(cmd.CommandPath(), " ", "-", -1) + ".md"
 | |
| 	filename := filepath.Join(dir, basename)
 | |
| 	f, err := os.Create(filename)
 | |
| 	checkErr(err)
 | |
| 	defer f.Close()
 | |
| 	generateMarkdown(cmd, f)
 | |
| }
 | |
| 
 | |
| func generateMarkdown(cmd *cobra.Command, w io.Writer) {
 | |
| 	cmd.InitDefaultHelpCmd()
 | |
| 	cmd.InitDefaultHelpFlag()
 | |
| 
 | |
| 	buf := new(bytes.Buffer)
 | |
| 	name := cmd.CommandPath()
 | |
| 
 | |
| 	short := cmd.Short
 | |
| 	long := cmd.Long
 | |
| 	if long == "" {
 | |
| 		long = short
 | |
| 	}
 | |
| 
 | |
| 	buf.WriteString("---\ndescription: " + short + "\n---\n\n")
 | |
| 	buf.WriteString("# " + name + "\n\n")
 | |
| 	buf.WriteString("## Synopsis\n\n")
 | |
| 	buf.WriteString(long + "\n\n")
 | |
| 
 | |
| 	if cmd.Runnable() {
 | |
| 		buf.WriteString(fmt.Sprintf("```\n%s\n```\n\n", cmd.UseLine()))
 | |
| 	}
 | |
| 
 | |
| 	if len(cmd.Example) > 0 {
 | |
| 		buf.WriteString("## Examples\n\n")
 | |
| 		buf.WriteString(fmt.Sprintf("```\n%s\n```\n\n", cmd.Example))
 | |
| 	}
 | |
| 
 | |
| 	printOptions(buf, cmd)
 | |
| 	_, err := buf.WriteTo(w)
 | |
| 	checkErr(err)
 | |
| }
 | |
| 
 | |
| func generateFlagsTable(fs *pflag.FlagSet, buf io.StringWriter) {
 | |
| 	_, _ = buf.WriteString("| Name | Shorthand | Usage |\n")
 | |
| 	_, _ = buf.WriteString("|------|-----------|-------|\n")
 | |
| 
 | |
| 	fs.VisitAll(func(f *pflag.Flag) {
 | |
| 		_, _ = buf.WriteString("|" + f.Name + "|" + f.Shorthand + "|" + f.Usage + "|\n")
 | |
| 	})
 | |
| }
 | |
| 
 | |
| func printOptions(buf *bytes.Buffer, cmd *cobra.Command) {
 | |
| 	flags := cmd.NonInheritedFlags()
 | |
| 	flags.SetOutput(buf)
 | |
| 	if flags.HasAvailableFlags() {
 | |
| 		buf.WriteString("## Options\n\n")
 | |
| 		generateFlagsTable(flags, buf)
 | |
| 		buf.WriteString("\n")
 | |
| 	}
 | |
| 
 | |
| 	parentFlags := cmd.InheritedFlags()
 | |
| 	parentFlags.SetOutput(buf)
 | |
| 	if parentFlags.HasAvailableFlags() {
 | |
| 		buf.WriteString("### Inherited\n\n")
 | |
| 		generateFlagsTable(parentFlags, buf)
 | |
| 		buf.WriteString("\n")
 | |
| 	}
 | |
| }
 |