summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorspf13 <steve.francia@gmail.com>2014-05-01 13:23:32 -0400
committerspf13 <steve.francia@gmail.com>2014-05-01 13:23:32 -0400
commit3395e1cb9255a2c5b4101a8040474ec05185decf (patch)
tree2f9728d5b73310adca32ada4af604907c8c12d21
parent859a78e1bda04bcaad11aa022d792d419e2ad769 (diff)
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.
-rw-r--r--commands/convert.go130
-rw-r--r--commands/hugo.go1
2 files changed, 131 insertions, 0 deletions
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 <spf@spf13.com>.
+//
+// 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() {