summaryrefslogtreecommitdiffstats
path: root/commands/convert.go
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2023-01-04 18:24:36 +0100
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2023-05-16 18:01:29 +0200
commit241b21b0fd34d91fccb2ce69874110dceae6f926 (patch)
treed4e0118eac7e9c42f065815447a70805f8d6ad3e /commands/convert.go
parent6aededf6b42011c3039f5f66487a89a8dd65e0e7 (diff)
Create a struct with all of Hugo's config options
Primary motivation is documentation, but it will also hopefully simplify the code. Also, * Lower case the default output format names; this is in line with the custom ones (map keys) and how it's treated all the places. This avoids doing `stringds.EqualFold` everywhere. Closes #10896 Closes #10620
Diffstat (limited to 'commands/convert.go')
-rw-r--r--commands/convert.go202
1 files changed, 109 insertions, 93 deletions
diff --git a/commands/convert.go b/commands/convert.go
index 1ec965a0b..0cae5ad7e 100644
--- a/commands/convert.go
+++ b/commands/convert.go
@@ -1,4 +1,4 @@
-// Copyright 2019 The Hugo Authors. All rights reserved.
+// Copyright 2023 The Hugo Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -15,122 +15,119 @@ package commands
import (
"bytes"
+ "context"
"fmt"
"path/filepath"
"strings"
"time"
- "github.com/gohugoio/hugo/parser/pageparser"
-
- "github.com/gohugoio/hugo/resources/page"
-
- "github.com/gohugoio/hugo/hugofs"
-
+ "github.com/bep/simplecobra"
+ "github.com/gohugoio/hugo/config"
"github.com/gohugoio/hugo/helpers"
-
+ "github.com/gohugoio/hugo/hugofs"
+ "github.com/gohugoio/hugo/hugolib"
"github.com/gohugoio/hugo/parser"
"github.com/gohugoio/hugo/parser/metadecoders"
-
- "github.com/gohugoio/hugo/hugolib"
-
+ "github.com/gohugoio/hugo/parser/pageparser"
+ "github.com/gohugoio/hugo/resources/page"
"github.com/spf13/cobra"
)
-var _ cmder = (*convertCmd)(nil)
-
-type convertCmd struct {
- outputDir string
- unsafe bool
-
- *baseBuilderCmd
-}
-
-func (b *commandsBuilder) newConvertCmd() *convertCmd {
- cc := &convertCmd{}
-
- cmd := &cobra.Command{
- Use: "convert",
- Short: "Convert your content to different formats",
- Long: `Convert your content (e.g. front matter) to different formats.
-
-See convert's subcommands toJSON, toTOML and toYAML for more information.`,
- RunE: nil,
- }
-
- cmd.AddCommand(
- &cobra.Command{
- Use: "toJSON",
- Short: "Convert front matter to JSON",
- Long: `toJSON converts all front matter in the content directory
+func newConvertCommand() *convertCommand {
+ var c *convertCommand
+ c = &convertCommand{
+ commands: []simplecobra.Commander{
+ &simpleCommand{
+ name: "toJSON",
+ short: "Convert front matter to JSON",
+ long: `toJSON converts all front matter in the content directory
to use JSON for the front matter.`,
- RunE: func(cmd *cobra.Command, args []string) error {
- return cc.convertContents(metadecoders.JSON)
+ run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error {
+ return c.convertContents(metadecoders.JSON)
+ },
+ withc: func(cmd *cobra.Command) {
+ },
},
- },
- &cobra.Command{
- Use: "toTOML",
- Short: "Convert front matter to TOML",
- Long: `toTOML converts all front matter in the content directory
+ &simpleCommand{
+ name: "toTOML",
+ short: "Convert front matter to TOML",
+ long: `toTOML converts all front matter in the content directory
to use TOML for the front matter.`,
- RunE: func(cmd *cobra.Command, args []string) error {
- return cc.convertContents(metadecoders.TOML)
+ run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error {
+ return c.convertContents(metadecoders.TOML)
+ },
+ withc: func(cmd *cobra.Command) {
+ },
},
- },
- &cobra.Command{
- Use: "toYAML",
- Short: "Convert front matter to YAML",
- Long: `toYAML converts all front matter in the content directory
+ &simpleCommand{
+ name: "toYAML",
+ short: "Convert front matter to YAML",
+ long: `toYAML converts all front matter in the content directory
to use YAML for the front matter.`,
- RunE: func(cmd *cobra.Command, args []string) error {
- return cc.convertContents(metadecoders.YAML)
+ run: func(ctx context.Context, cd *simplecobra.Commandeer, r *rootCommand, args []string) error {
+ return c.convertContents(metadecoders.YAML)
+ },
+ withc: func(cmd *cobra.Command) {
+ },
},
},
- )
+ }
+ return c
+}
- cmd.PersistentFlags().StringVarP(&cc.outputDir, "output", "o", "", "filesystem path to write files to")
- cmd.PersistentFlags().BoolVar(&cc.unsafe, "unsafe", false, "enable less safe operations, please backup first")
+type convertCommand struct {
+ // Flags.
+ outputDir string
+ unsafe bool
- cc.baseBuilderCmd = b.newBuilderBasicCmd(cmd)
+ // Deps.
+ r *rootCommand
+ h *hugolib.HugoSites
- return cc
+ // Commmands.
+ commands []simplecobra.Commander
}
-func (cc *convertCmd) convertContents(format metadecoders.Format) error {
- if cc.outputDir == "" && !cc.unsafe {
- return newUserError("Unsafe operation not allowed, use --unsafe or set a different output path")
- }
+func (c *convertCommand) Commands() []simplecobra.Commander {
+ return c.commands
+}
- c, err := initializeConfig(true, false, false, &cc.hugoBuilderCommon, cc, nil)
- if err != nil {
- return err
- }
+func (c *convertCommand) Name() string {
+ return "convert"
+}
- c.Cfg.Set("buildDrafts", true)
+func (c *convertCommand) Run(ctx context.Context, cd *simplecobra.Commandeer, args []string) error {
+ return nil
+}
- h, err := hugolib.NewHugoSites(*c.DepsCfg)
- if err != nil {
- return err
- }
+func (c *convertCommand) WithCobraCommand(cmd *cobra.Command) error {
+ cmd.Short = "Convert your content to different formats"
+ cmd.Long = `Convert your content (e.g. front matter) to different formats.
- if err := h.Build(hugolib.BuildCfg{SkipRender: true}); err != nil {
- return err
- }
+See convert's subcommands toJSON, toTOML and toYAML for more information.`
- site := h.Sites[0]
+ cmd.PersistentFlags().StringVarP(&c.outputDir, "output", "o", "", "filesystem path to write files to")
+ cmd.PersistentFlags().BoolVar(&c.unsafe, "unsafe", false, "enable less safe operations, please backup first")
- site.Log.Println("processing", len(site.AllPages()), "content files")
- for _, p := range site.AllPages() {
- if err := cc.convertAndSavePage(p, site, format); err != nil {
- return err
- }
+ return nil
+}
+
+func (c *convertCommand) Init(cd, runner *simplecobra.Commandeer) error {
+ c.r = cd.Root.Command.(*rootCommand)
+ cfg := config.New()
+ cfg.Set("buildDrafts", true)
+ h, err := c.r.Hugo(flagsToCfg(cd, cfg))
+ if err != nil {
+ return err
}
+ c.h = h
return nil
}
-func (cc *convertCmd) convertAndSavePage(p page.Page, site *hugolib.Site, targetFormat metadecoders.Format) error {
+func (c *convertCommand) convertAndSavePage(p page.Page, site *hugolib.Site, targetFormat metadecoders.Format) error {
// The resources are not in .Site.AllPages.
for _, r := range p.Resources().ByType("page") {
- if err := cc.convertAndSavePage(r.(page.Page), site, targetFormat); err != nil {
+ if err := c.convertAndSavePage(r.(page.Page), site, targetFormat); err != nil {
return err
}
}
@@ -140,9 +137,9 @@ func (cc *convertCmd) convertAndSavePage(p page.Page, site *hugolib.Site, target
return nil
}
- errMsg := fmt.Errorf("Error processing file %q", p.File().Path())
+ errMsg := fmt.Errorf("error processing file %q", p.File().Path())
- site.Log.Infoln("Attempting to convert", p.File().Filename())
+ site.Log.Infoln("ttempting to convert", p.File().Filename())
f := p.File()
file, err := f.FileInfo().Meta().Open()
@@ -182,26 +179,45 @@ func (cc *convertCmd) convertAndSavePage(p page.Page, site *hugolib.Site, target
newFilename := p.File().Filename()
- if cc.outputDir != "" {
+ if c.outputDir != "" {
contentDir := strings.TrimSuffix(newFilename, p.File().Path())
contentDir = filepath.Base(contentDir)
- newFilename = filepath.Join(cc.outputDir, contentDir, p.File().Path())
+ newFilename = filepath.Join(c.outputDir, contentDir, p.File().Path())
}
fs := hugofs.Os
if err := helpers.WriteToDisk(newFilename, &newContent, fs); err != nil {
- return fmt.Errorf("Failed to save file %q:: %w", newFilename, err)
+ return fmt.Errorf("failed to save file %q:: %w", newFilename, err)
}
return nil
}
-type parsedFile struct {
- frontMatterFormat metadecoders.Format
- frontMatterSource []byte
- frontMatter map[string]any
+func (c *convertCommand) convertContents(format metadecoders.Format) error {
+ if c.outputDir == "" && !c.unsafe {
+ return newUserError("Unsafe operation not allowed, use --unsafe or set a different output path")
+ }
+
+ if err := c.h.Build(hugolib.BuildCfg{SkipRender: true}); err != nil {
+ return err
+ }
+
+ site := c.h.Sites[0]
+
+ var pagesBackedByFile page.Pages
+ for _, p := range site.AllPages() {
+ if p.File().IsZero() {
+ continue
+ }
+ pagesBackedByFile = append(pagesBackedByFile, p)
+ }
- // Everything after Front Matter
- content []byte
+ site.Log.Println("processing", len(pagesBackedByFile), "content files")
+ for _, p := range site.AllPages() {
+ if err := c.convertAndSavePage(p, site, format); err != nil {
+ return err
+ }
+ }
+ return nil
}