evcc-io/cmd/gendock.go
2024-10-01 15:15:24 +02:00

71 lines
1.9 KiB
Go

package cmd
import (
"os"
"path/filepath"
"regexp"
"strings"
"github.com/spf13/cobra"
"github.com/spf13/cobra/doc"
)
// gendocCmd represents the gendoc command
var gendocCmd = &cobra.Command{
Use: "gendoc <output-dir>",
Short: "Generate CLI documentation in markdown format",
Args: cobra.ExactArgs(1),
Hidden: true,
Run: runGendoc,
}
func init() {
rootCmd.AddCommand(gendocCmd)
}
func runGendoc(cmd *cobra.Command, args []string) {
outputDir := args[0]
// Ensure the output directory exists
if err := os.MkdirAll(outputDir, 0o755); err != nil {
log.FATAL.Fatalf("Failed to create output directory: %v", err)
}
if err := doc.GenMarkdownTree(rootCmd, outputDir); err != nil {
log.FATAL.Fatalf("Failed to generate documentation: %v", err)
}
// make some modifications to the generated files
err := filepath.Walk(outputDir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() && strings.HasSuffix(info.Name(), ".md") {
content, err := os.ReadFile(path)
if err != nil {
return err
}
// reduce header level by one
modifiedContent := strings.ReplaceAll(string(content), "## ", "# ")
// lowercase "see also"
modifiedContent = strings.ReplaceAll(modifiedContent, "SEE ALSO", "See also")
// convert single line indented code to backtick surrounded code
codeRe := regexp.MustCompile("\n\n\t(.*)\n")
modifiedContent = codeRe.ReplaceAllString(modifiedContent, "\n\n```\n$1\n```\n")
// remove auto generated date line
dateRe := regexp.MustCompile("##### Auto generated by spf13/cobra on.*\n")
modifiedContent = dateRe.ReplaceAllString(modifiedContent, "\n")
if err := os.WriteFile(path, []byte(modifiedContent), 0o644); err != nil {
return err
}
}
return nil
})
if err != nil {
log.FATAL.Fatalf("Failed to modify documentation: %v", err)
}
log.INFO.Printf("Documentation generated and modified in %s", outputDir)
}