updates! settings!
This commit is contained in:
		
							parent
							
								
									082073acda
								
							
						
					
					
						commit
						788218e115
					
				
							
								
								
									
										23
									
								
								hugo.go
								
								
								
								
							
							
						
						
									
										23
									
								
								hugo.go
								
								
								
								
							| 
						 | 
					@ -10,6 +10,7 @@ import (
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hacdias/caddy-hugo/assets"
 | 
						"github.com/hacdias/caddy-hugo/assets"
 | 
				
			||||||
	"github.com/hacdias/caddy-hugo/edit"
 | 
						"github.com/hacdias/caddy-hugo/edit"
 | 
				
			||||||
 | 
						"github.com/hacdias/caddy-hugo/settings"
 | 
				
			||||||
	"github.com/mholt/caddy/config/setup"
 | 
						"github.com/mholt/caddy/config/setup"
 | 
				
			||||||
	"github.com/mholt/caddy/middleware"
 | 
						"github.com/mholt/caddy/middleware"
 | 
				
			||||||
	"github.com/spf13/hugo/commands"
 | 
						"github.com/spf13/hugo/commands"
 | 
				
			||||||
| 
						 | 
					@ -27,18 +28,11 @@ func Setup(c *setup.Controller) (middleware.Middleware, error) {
 | 
				
			||||||
type handler struct{ Next middleware.Handler }
 | 
					type handler struct{ Next middleware.Handler }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) {
 | 
					func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) (int, error) {
 | 
				
			||||||
	if urlMatch(r, "/admin") {
 | 
						if middleware.Path(r.URL.Path).Matches("/admin") {
 | 
				
			||||||
		return route(w, r)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return h.Next.ServeHTTP(w, r)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
func route(w http.ResponseWriter, r *http.Request) (int, error) {
 | 
					 | 
				
			||||||
		page := parseComponents(r)[1]
 | 
							page := parseComponents(r)[1]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if page == "assets" {
 | 
							if page == "assets" {
 | 
				
			||||||
		filename := strings.Replace(r.URL.Path, assetsURL, "static", 1)
 | 
								filename := strings.Replace(r.URL.Path, "/admin/assets", "static", 1)
 | 
				
			||||||
			file, err := assets.Asset(filename)
 | 
								file, err := assets.Asset(filename)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
| 
						 | 
					@ -52,21 +46,26 @@ func route(w http.ResponseWriter, r *http.Request) (int, error) {
 | 
				
			||||||
			header.Set("Content-Type", mime)
 | 
								header.Set("Content-Type", mime)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			w.Write(file)
 | 
								w.Write(file)
 | 
				
			||||||
 | 
								return 200, nil
 | 
				
			||||||
		} else if page == "content" {
 | 
							} else if page == "content" {
 | 
				
			||||||
			w.Write([]byte("Content Page"))
 | 
								w.Write([]byte("Content Page"))
 | 
				
			||||||
 | 
								return 200, nil
 | 
				
			||||||
		} else if page == "browse" {
 | 
							} else if page == "browse" {
 | 
				
			||||||
			w.Write([]byte("Show Data Folder"))
 | 
								w.Write([]byte("Show Data Folder"))
 | 
				
			||||||
 | 
								return 200, nil
 | 
				
			||||||
		} else if page == "edit" {
 | 
							} else if page == "edit" {
 | 
				
			||||||
			return edit.Execute(w, r)
 | 
								return edit.Execute(w, r)
 | 
				
			||||||
		} else if page == "settings" {
 | 
							} else if page == "settings" {
 | 
				
			||||||
		w.Write([]byte("Settings Page"))
 | 
								return settings.Execute(w, r)
 | 
				
			||||||
	} else {
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return 404, nil
 | 
							return 404, nil
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 200, nil
 | 
						return h.Next.ServeHTTP(w, r)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: utils package
 | 
				
			||||||
func parseComponents(r *http.Request) []string {
 | 
					func parseComponents(r *http.Request) []string {
 | 
				
			||||||
	//The URL that the user queried.
 | 
						//The URL that the user queried.
 | 
				
			||||||
	path := r.URL.Path
 | 
						path := r.URL.Path
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										38
									
								
								page/page.go
								
								
								
								
							
							
						
						
									
										38
									
								
								page/page.go
								
								
								
								
							| 
						 | 
					@ -3,7 +3,9 @@ package page
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"html/template"
 | 
						"html/template"
 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
 | 
						"reflect"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
 | 
						"unicode"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/hacdias/caddy-hugo/assets"
 | 
						"github.com/hacdias/caddy-hugo/assets"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
| 
						 | 
					@ -14,6 +16,40 @@ const (
 | 
				
			||||||
	footerMark        = "{{#FOOTER#}}"
 | 
						footerMark        = "{{#FOOTER#}}"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var funcMap = template.FuncMap{
 | 
				
			||||||
 | 
						"splitCapitalize": splitCapitalize,
 | 
				
			||||||
 | 
						"isMap":           isMap,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: utilspackage
 | 
				
			||||||
 | 
					func isMap(sth interface{}) bool {
 | 
				
			||||||
 | 
						return reflect.ValueOf(sth).Kind() == reflect.Map
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: utils package
 | 
				
			||||||
 | 
					func splitCapitalize(name string) string {
 | 
				
			||||||
 | 
						var words []string
 | 
				
			||||||
 | 
						l := 0
 | 
				
			||||||
 | 
						for s := name; s != ""; s = s[l:] {
 | 
				
			||||||
 | 
							l = strings.IndexFunc(s[1:], unicode.IsUpper) + 1
 | 
				
			||||||
 | 
							if l <= 0 {
 | 
				
			||||||
 | 
								l = len(s)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							words = append(words, s[:l])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						name = ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, element := range words {
 | 
				
			||||||
 | 
							name += element + " "
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						name = strings.ToLower(name[:len(name)-1])
 | 
				
			||||||
 | 
						name = strings.ToUpper(string(name[0])) + name[1:len(name)]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return name
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Page type
 | 
					// Page type
 | 
				
			||||||
type Page struct {
 | 
					type Page struct {
 | 
				
			||||||
	Title string
 | 
						Title string
 | 
				
			||||||
| 
						 | 
					@ -48,7 +84,7 @@ func (p *Page) Render(name string, w http.ResponseWriter) (int, error) {
 | 
				
			||||||
	page = strings.Replace(page, headerMark, header, -1)
 | 
						page = strings.Replace(page, headerMark, header, -1)
 | 
				
			||||||
	page = strings.Replace(page, footerMark, footer, -1)
 | 
						page = strings.Replace(page, footerMark, footer, -1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	tpl, err := template.New("page").Parse(page)
 | 
						tpl, err := template.New("page").Funcs(funcMap).Parse(page)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return 500, err
 | 
							return 500, err
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,81 @@
 | 
				
			||||||
 | 
					package settings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/hacdias/caddy-hugo/page"
 | 
				
			||||||
 | 
						"github.com/spf13/hugo/parser"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Execute the page
 | 
				
			||||||
 | 
					func Execute(w http.ResponseWriter, r *http.Request) (int, error) {
 | 
				
			||||||
 | 
						if r.Method == "POST" {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							frontmatter := getConfigFrontMatter()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// 500 if the format of frontmatter can't be defined
 | 
				
			||||||
 | 
							if frontmatter == "" {
 | 
				
			||||||
 | 
								return 500, nil
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							config, err := getConfig(frontmatter)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return 500, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							page := new(page.Page)
 | 
				
			||||||
 | 
							page.Title = "settings"
 | 
				
			||||||
 | 
							page.Body = config
 | 
				
			||||||
 | 
							return page.Render("settings", w)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 200, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getConfigFrontMatter() string {
 | 
				
			||||||
 | 
						var frontmatter string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if _, err := os.Stat("config.yaml"); err == nil {
 | 
				
			||||||
 | 
							frontmatter = "yaml"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if _, err := os.Stat("config.json"); err == nil {
 | 
				
			||||||
 | 
							frontmatter = "json"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if _, err := os.Stat("config.toml"); err == nil {
 | 
				
			||||||
 | 
							frontmatter = "toml"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return frontmatter
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getConfig(frontmatter string) (interface{}, error) {
 | 
				
			||||||
 | 
						content := getConfigFileContent(frontmatter)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch frontmatter {
 | 
				
			||||||
 | 
						case "yaml":
 | 
				
			||||||
 | 
							return parser.HandleYAMLMetaData(content)
 | 
				
			||||||
 | 
						case "json":
 | 
				
			||||||
 | 
							return parser.HandleJSONMetaData(content)
 | 
				
			||||||
 | 
						case "toml":
 | 
				
			||||||
 | 
							return parser.HandleTOMLMetaData(content)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return []string{}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,30 @@
 | 
				
			||||||
 | 
					{{#HEADER#}}
 | 
				
			||||||
 | 
					{{ with .Body }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="content">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <h1>Settings</h1>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  <form>
 | 
				
			||||||
 | 
					  {{ range $key, $value := . }}
 | 
				
			||||||
 | 
					    {{ if isMap $value }}
 | 
				
			||||||
 | 
					      <h2>{{ splitCapitalize $key }}</h2>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      <div id="{{ $key }}">
 | 
				
			||||||
 | 
					        <!-- call this range again -->
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    {{ else }}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <label for="{{ $key }}">{{ splitCapitalize $key }}</label>
 | 
				
			||||||
 | 
					    <input name="{{ $key }}" id="{{ $key }}" value="{{ $value }}"></input><br>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    {{ end }}
 | 
				
			||||||
 | 
					  {{ end }}
 | 
				
			||||||
 | 
					  </form>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{{ end }}
 | 
				
			||||||
 | 
					{{#FOOTER#}}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue