From 0bf1182c918382e56ccf8c061324b4bab6083c8c Mon Sep 17 00:00:00 2001
From: Henrique Dias <hacdias@gmail.com>
Date: Mon, 14 Sep 2015 14:42:48 +0100
Subject: [PATCH] reuse frontmatter functions

---
 frontmatter/frontmatter.go |  74 ++++++++++++++++++++++++++
 settings/settings.go       | 104 +++++--------------------------------
 templates/frontmatter.tmpl |   4 +-
 templates/settings.tmpl    |   2 +-
 4 files changed, 90 insertions(+), 94 deletions(-)
 create mode 100644 frontmatter/frontmatter.go

diff --git a/frontmatter/frontmatter.go b/frontmatter/frontmatter.go
new file mode 100644
index 00000000..2cfb5117
--- /dev/null
+++ b/frontmatter/frontmatter.go
@@ -0,0 +1,74 @@
+package frontmatter
+
+import (
+	"sort"
+
+	"github.com/hacdias/caddy-hugo/utils"
+	"github.com/spf13/hugo/parser"
+)
+
+// Pretty creates a new FrontMatter object
+func Pretty(content []byte, language string) (interface{}, error) {
+	var err error
+	var c interface{}
+
+	if language == "yaml" {
+		c, err = parser.HandleYAMLMetaData(content)
+	} else if language == "json" {
+		c, err = parser.HandleJSONMetaData(content)
+	} else if language == "toml" {
+		c, err = parser.HandleTOMLMetaData(content)
+	}
+
+	if err != nil {
+		return []string{}, err
+	}
+
+	return rawToPretty(c, ""), nil
+}
+
+type frontmatter struct {
+	Name       string
+	Tag        string
+	Content    interface{}
+	SubContent bool
+}
+
+func rawToPretty(config interface{}, master string) interface{} {
+	var mapsNames []string
+	var stringsNames []string
+
+	for index, element := range config.(map[string]interface{}) {
+		if utils.IsMap(element) {
+			mapsNames = append(mapsNames, index)
+		} else {
+			stringsNames = append(stringsNames, index)
+		}
+	}
+
+	sort.Strings(mapsNames)
+	sort.Strings(stringsNames)
+	names := append(stringsNames, mapsNames...)
+
+	settings := make([]interface{}, len(names))
+
+	for index := range names {
+		c := new(frontmatter)
+		c.Name = names[index]
+		c.Tag = master + "_" + names[index]
+		c.SubContent = false
+
+		i := config.(map[string]interface{})[names[index]]
+
+		if utils.IsMap(i) {
+			c.Content = rawToPretty(i, c.Name)
+			c.SubContent = true
+		} else {
+			c.Content = i
+		}
+
+		settings[index] = c
+	}
+
+	return settings
+}
diff --git a/settings/settings.go b/settings/settings.go
index 67be6471..66280ea0 100644
--- a/settings/settings.go
+++ b/settings/settings.go
@@ -2,49 +2,45 @@ package settings
 
 import (
 	"io/ioutil"
+	"log"
 	"net/http"
 	"os"
-	"sort"
 
+	"github.com/hacdias/caddy-hugo/frontmatter"
 	"github.com/hacdias/caddy-hugo/page"
-	"github.com/hacdias/caddy-hugo/utils"
-	"github.com/spf13/hugo/parser"
 )
 
-type settings struct {
-	Settings interface{}
-	Keys     []string
-}
-
 // Execute the page
 func Execute(w http.ResponseWriter, r *http.Request) (int, error) {
 	if r.Method == "POST" {
 
 	} else {
-		frontmatter := getConfigFrontMatter()
+		language := getConfigFrontMatter()
 
-		// 500 if the format of frontmatter can't be defined
-		if frontmatter == "" {
+		if language == "" {
+			log.Print("Configuration frontmatter can't be defined")
 			return 500, nil
 		}
 
-		config, err := getConfig(frontmatter)
+		content, err := ioutil.ReadFile("config." + language)
 
 		if err != nil {
+			log.Print(err)
 			return 500, err
 		}
 
-		//	configIndex := getConfigNames(config)
+		f, err := frontmatter.Pretty(content, language)
 
-		cnf := new(settings)
-		cnf.Settings = getConfigNames(config, "")
+		if err != nil {
+			log.Print(err)
+			return 500, err
+		}
 
 		page := new(page.Page)
 		page.Title = "Settings"
-		page.Body = cnf
+		page.Body = f
 		return page.Render(w, "settings", "frontmatter")
 	}
-
 	return 200, nil
 }
 
@@ -65,77 +61,3 @@ func getConfigFrontMatter() string {
 
 	return frontmatter
 }
-
-func getConfigFileContent(frontmatter string) []byte {
-	file, err := ioutil.ReadFile("config." + frontmatter)
-
-	if err != nil {
-		// there were a problem opening the file
-		return []byte{}
-	}
-
-	return file
-}
-
-// make it generic to frontmatter. everything bellow -> new file
-func getConfig(frontmatter string) (interface{}, error) {
-	content := getConfigFileContent(frontmatter)
-	//	config := []string{}
-
-	// get the config into a map
-	if frontmatter == "yaml" {
-		return parser.HandleYAMLMetaData(content)
-	} else if frontmatter == "json" {
-		return parser.HandleJSONMetaData(content)
-	} else if frontmatter == "toml" {
-		return parser.HandleTOMLMetaData(content)
-	}
-
-	return []string{}, nil
-}
-
-type conf struct {
-	Name       string
-	Master     string
-	Content    interface{}
-	SubContent bool
-}
-
-func getConfigNames(config interface{}, master string) interface{} {
-	var mapsNames []string
-	var stringsNames []string
-
-	for index, element := range config.(map[string]interface{}) {
-		if utils.IsMap(element) {
-			mapsNames = append(mapsNames, index)
-		} else {
-			stringsNames = append(stringsNames, index)
-		}
-	}
-
-	sort.Strings(mapsNames)
-	sort.Strings(stringsNames)
-	names := append(stringsNames, mapsNames...)
-
-	settings := make([]interface{}, len(names))
-
-	for index := range names {
-		c := new(conf)
-		c.Name = names[index]
-		c.Master = master
-		c.SubContent = false
-
-		i := config.(map[string]interface{})[names[index]]
-
-		if utils.IsMap(i) {
-			c.Content = getConfigNames(i, c.Name)
-			c.SubContent = true
-		} else {
-			c.Content = i
-		}
-
-		settings[index] = c
-	}
-
-	return settings
-}
diff --git a/templates/frontmatter.tmpl b/templates/frontmatter.tmpl
index b7062fcd..cb9261b1 100644
--- a/templates/frontmatter.tmpl
+++ b/templates/frontmatter.tmpl
@@ -4,8 +4,8 @@
       <h2>{{ splitCapitalize $value.Name }}</h2>
       {{ template "frontmatter" $value.Content }}
     {{ else}}
-    <label for="{{ $value.Master }}_{{ $value.Name }}">{{ splitCapitalize $value.Name }}</label>
-    <input name="{{ $value.Master }}_{{ $value.Name }}" id="{{ $value.Master }}_{{ $value.Name }}" value="{{ $value.Content }}"></input><br>
+    <label for="{{ $value.Tag }}">{{ splitCapitalize $value.Name }}</label>
+    <input name="{{ $value.Tag }}" id="{{ $value.Tag }}" value="{{ $value.Content }}"></input><br>
     {{ end }}
   {{ end }}
 {{ end }}
diff --git a/templates/settings.tmpl b/templates/settings.tmpl
index 257931d5..de3b9419 100644
--- a/templates/settings.tmpl
+++ b/templates/settings.tmpl
@@ -4,7 +4,7 @@
 <div class="content">
   <h1>Settings</h1>
   <form>
-  {{ template "frontmatter" .Settings }}
+  {{ template "frontmatter" . }}
   </form>
 </div>
 {{ end }}