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")
 | 
						|
	}
 | 
						|
}
 |