From 3395e1cb9255a2c5b4101a8040474ec05185decf Mon Sep 17 00:00:00 2001 From: spf13 Date: Thu, 1 May 2014 13:23:32 -0400 Subject: [PATCH] Adding a command that enables converting site to a different metadata format. Doing this revealed some bugs in the encoding functionality in some of the underlying libraries. Please backup before using. --- commands/convert.go | 130 ++++++++++++++++++++++++++++++++++++++++++++ commands/hugo.go | 1 + 2 files changed, 131 insertions(+) create mode 100644 commands/convert.go diff --git a/commands/convert.go b/commands/convert.go new file mode 100644 index 000000000..4ca489f9e --- /dev/null +++ b/commands/convert.go @@ -0,0 +1,130 @@ +// Copyright © 2013 Steve Francia . +// +// Licensed under the Simple Public License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://opensource.org/licenses/Simple-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package commands + +import ( + "fmt" + "path" + + "github.com/spf13/cobra" + "github.com/spf13/hugo/hugolib" + "github.com/spf13/hugo/parser" + jww "github.com/spf13/jwalterweatherman" +) + +var OutputDir string +var Unsafe bool + +var convertCmd = &cobra.Command{ + Use: "convert", + Short: "Convert will modify your content to different formats", + Long: `Convert will modify your content to different formats`, + Run: nil, +} + +var toJSONCmd = &cobra.Command{ + Use: "toJSON", + Short: "Convert front matter to JSON", + Long: `toJSON will convert all front matter in the content + directory to use JSON for the front matter`, + Run: func(cmd *cobra.Command, args []string) { + err := convertContents(rune([]byte(parser.JSON_LEAD)[0])) + if err != nil { + jww.ERROR.Println(err) + } + }, +} + +var toTOMLCmd = &cobra.Command{ + Use: "toTOML", + Short: "Convert front matter to TOML", + Long: `toTOML will convert all front matter in the content + directory to use TOML for the front matter`, + Run: func(cmd *cobra.Command, args []string) { + err := convertContents(rune([]byte(parser.TOML_LEAD)[0])) + if err != nil { + jww.ERROR.Println(err) + } + }, +} + +var toYAMLCmd = &cobra.Command{ + Use: "toYAML", + Short: "Convert front matter to YAML", + Long: `toYAML will convert all front matter in the content + directory to use YAML for the front matter`, + Run: func(cmd *cobra.Command, args []string) { + err := convertContents(rune([]byte(parser.YAML_LEAD)[0])) + if err != nil { + jww.ERROR.Println(err) + } + }, +} + +func init() { + convertCmd.AddCommand(toJSONCmd) + convertCmd.AddCommand(toTOMLCmd) + convertCmd.AddCommand(toYAMLCmd) + convertCmd.PersistentFlags().StringVarP(&OutputDir, "output", "o", "", "filesystem path to write files to") + convertCmd.PersistentFlags().BoolVar(&Unsafe, "unsafe", false, "enable less safe operations, please backup first") +} + +func convertContents(mark rune) (err error) { + InitializeConfig() + site := &hugolib.Site{} + + if err := site.Initialise(); err != nil { + return err + } + + if site.Source == nil { + panic(fmt.Sprintf("site.Source not set")) + } + if len(site.Source.Files()) < 1 { + return fmt.Errorf("No source files found") + } + + jww.FEEDBACK.Println("processing", len(site.Source.Files()), "content files") + for _, file := range site.Source.Files() { + jww.INFO.Println("Attempting to convert", file.LogicalName) + page, err := hugolib.NewPage(file.LogicalName) + if err != nil { + return err + } + + psr, err := parser.ReadFrom(file.Contents) + if err != nil { + return err + } + metadata, err := psr.Metadata() + if err != nil { + return err + } + + page.Dir = file.Dir + page.SetSourceContent(psr.Content()) + page.SetSourceMetaData(metadata, mark) + + if OutputDir != "" { + page.SaveSourceAs(path.Join(OutputDir, page.FullFilePath())) + } else { + if Unsafe { + page.SaveSource() + } else { + jww.FEEDBACK.Println("Unsafe operation not allowed, use --unsafe or set a different output path") + } + } + } + return +} diff --git a/commands/hugo.go b/commands/hugo.go index c5393e90f..fe5642334 100644 --- a/commands/hugo.go +++ b/commands/hugo.go @@ -61,6 +61,7 @@ func AddCommands() { HugoCmd.AddCommand(version) HugoCmd.AddCommand(check) HugoCmd.AddCommand(benchmark) + HugoCmd.AddCommand(convertCmd) } func init() {