hugo

Fork of github.com/gohugoio/hugo with reverse pagination support

git clone git://git.shimmy1996.com/hugo.git

gendoc.go (2983B)

    1 // Copyright 2016 The Hugo Authors. All rights reserved.
    2 //
    3 // Licensed under the Apache License, Version 2.0 (the "License");
    4 // you may not use this file except in compliance with the License.
    5 // You may obtain a copy of the License at
    6 // http://www.apache.org/licenses/LICENSE-2.0
    7 //
    8 // Unless required by applicable law or agreed to in writing, software
    9 // distributed under the License is distributed on an "AS IS" BASIS,
   10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   11 // See the License for the specific language governing permissions and
   12 // limitations under the License.
   13 
   14 package commands
   15 
   16 import (
   17 	"fmt"
   18 	"path"
   19 	"path/filepath"
   20 	"strings"
   21 
   22 	"github.com/gohugoio/hugo/helpers"
   23 	"github.com/gohugoio/hugo/hugofs"
   24 	"github.com/spf13/cobra"
   25 	"github.com/spf13/cobra/doc"
   26 	jww "github.com/spf13/jwalterweatherman"
   27 )
   28 
   29 var _ cmder = (*genDocCmd)(nil)
   30 
   31 type genDocCmd struct {
   32 	gendocdir string
   33 	*baseCmd
   34 }
   35 
   36 func newGenDocCmd() *genDocCmd {
   37 	const gendocFrontmatterTemplate = `---
   38 title: "%s"
   39 slug: %s
   40 url: %s
   41 ---
   42 `
   43 
   44 	cc := &genDocCmd{}
   45 
   46 	cc.baseCmd = newBaseCmd(&cobra.Command{
   47 		Use:   "doc",
   48 		Short: "Generate Markdown documentation for the Hugo CLI.",
   49 		Long: `Generate Markdown documentation for the Hugo CLI.
   50 
   51 This command is, mostly, used to create up-to-date documentation
   52 of Hugo's command-line interface for https://gohugo.io/.
   53 
   54 It creates one Markdown file per command with front matter suitable
   55 for rendering in Hugo.`,
   56 
   57 		RunE: func(cmd *cobra.Command, args []string) error {
   58 			cmd.VisitParents(func(c *cobra.Command) {
   59 				// Disable the "Auto generated by spf13/cobra on DATE"
   60 				// as it creates a lot of diffs.
   61 				c.DisableAutoGenTag = true
   62 			})
   63 
   64 			if !strings.HasSuffix(cc.gendocdir, helpers.FilePathSeparator) {
   65 				cc.gendocdir += helpers.FilePathSeparator
   66 			}
   67 			if found, _ := helpers.Exists(cc.gendocdir, hugofs.Os); !found {
   68 				jww.FEEDBACK.Println("Directory", cc.gendocdir, "does not exist, creating...")
   69 				if err := hugofs.Os.MkdirAll(cc.gendocdir, 0777); err != nil {
   70 					return err
   71 				}
   72 			}
   73 			prepender := func(filename string) string {
   74 				name := filepath.Base(filename)
   75 				base := strings.TrimSuffix(name, path.Ext(name))
   76 				url := "/commands/" + strings.ToLower(base) + "/"
   77 				return fmt.Sprintf(gendocFrontmatterTemplate, strings.Replace(base, "_", " ", -1), base, url)
   78 			}
   79 
   80 			linkHandler := func(name string) string {
   81 				base := strings.TrimSuffix(name, path.Ext(name))
   82 				return "/commands/" + strings.ToLower(base) + "/"
   83 			}
   84 			jww.FEEDBACK.Println("Generating Hugo command-line documentation in", cc.gendocdir, "...")
   85 			doc.GenMarkdownTreeCustom(cmd.Root(), cc.gendocdir, prepender, linkHandler)
   86 			jww.FEEDBACK.Println("Done.")
   87 
   88 			return nil
   89 		},
   90 	})
   91 
   92 	cc.cmd.PersistentFlags().StringVar(&cc.gendocdir, "dir", "/tmp/hugodoc/", "the directory to write the doc.")
   93 
   94 	// For bash-completion
   95 	cc.cmd.PersistentFlags().SetAnnotation("dir", cobra.BashCompSubdirsInDir, []string{})
   96 
   97 	return cc
   98 }