diff --git a/assets/public/js/application.js b/assets/public/js/application.js index e0ed0812..d114fe31 100644 --- a/assets/public/js/application.js +++ b/assets/public/js/application.js @@ -1,7 +1,7 @@ 'use strict'; document.addEventListener('DOMContentLoaded', event => { - let link = document.querySelector('header > div:first-child a:first-child').getAttribute('href') + "/settings/" + let link = document.querySelector('.only-side > p a:first-child').getAttribute('href') + "/settings/" document.getElementById('logout').insertAdjacentHTML('beforebegin', `
settings diff --git a/setup.go b/setup.go index 193aeddb..c369673b 100644 --- a/setup.go +++ b/setup.go @@ -5,7 +5,6 @@ import ( "fmt" "io/ioutil" "log" - "net/http" "os" "os/exec" "path/filepath" @@ -22,7 +21,10 @@ import ( ) // AssetsURL is the base url for the assets -const AssetsURL = "/_hugointernal" +const ( + AssetsURL = "/_hugointernal" + HugoNotFound = "It seems that you don't have 'hugo' on your PATH." +) func init() { caddy.RegisterPlugin("hugo", caddy.Plugin{ @@ -35,8 +37,140 @@ func init() { // middleware thing. func setup(c *caddy.Controller) error { cnf := httpserver.GetConfig(c) - conf, _ := parse(c, cnf.Root) + conf, fm, err := parse(c, cnf.Root) + + if err != nil { + return err + } + + // Generates the Hugo website for the first time the plugin is activated. + go RunHugo(conf, true) + + mid := func(next httpserver.Handler) httpserver.Handler { + fm.Next = next + + return &Hugo{ + Next: next, + Config: conf, + FileManager: fm, + } + } + + cnf.AddMiddleware(mid) + return nil +} + +// Config is a configuration for managing a particular hugo website. +type Config struct { + Public string // Public content path + Root string // Hugo files path + Hugo string // Hugo executable location + Styles string // Admin styles path + Args []string // Hugo arguments + BaseURL string // BaseURL of admin interface +} + +// Parse parses the configuration set by the user so it can be +// used by the middleware +func parse(c *caddy.Controller, root string) (*Config, *filemanager.FileManager, error) { + var ( + cfg *Config + fm *filemanager.FileManager + err error + tokens string + ) + + cfg = new(Config) + + if cfg.Hugo, err = exec.LookPath("hugo"); err != nil { + fmt.Println(HugoNotFound) + return cfg, fm, errors.New(HugoNotFound) + } + + for c.Next() { + cfg.Public = strings.Replace(root, "./", "", -1) + cfg.BaseURL = "/admin" + cfg.Root = "./" + + args := c.RemainingArgs() + + if len(args) >= 1 { + cfg.Root = args[0] + cfg.Root = strings.TrimSuffix(cfg.Root, "/") + cfg.Root += "/" + } + + if len(args) >= 2 { + cfg.BaseURL = args[1] + cfg.BaseURL = strings.TrimPrefix(cfg.BaseURL, "/") + cfg.BaseURL = "/" + cfg.BaseURL + } + + for c.NextBlock() { + switch c.Val() { + case "flag": + if !c.NextArg() { + return cfg, &filemanager.FileManager{}, c.ArgErr() + } + + values := strings.Split(c.Val(), " ") + + if len(values) == 0 { + return cfg, fm, errors.New("Not enough arguments for 'flag' option.") + } + + value := "true" + + if len(values) > 1 { + value = values[1] + } + + cfg.Args = append(cfg.Args, "--"+values[0]+"="+value) + default: + if c.Val() == "show" { + fmt.Println("Option 'show' is not allowed here.") + c.NextArg() + continue + } + + line := "\n\t" + c.Val() + + if c.NextArg() { + line += " " + c.Val() + } + + tokens += line + } + } + } + + tokens = "filemanager " + cfg.BaseURL + " {\n\tshow " + cfg.Root + tokens + tokens += "\n}" + + fmConfig, err := config.Parse(caddy.NewTestController("http", tokens)) + + if err != nil { + return cfg, fm, err + } + + fm = &filemanager.FileManager{Configs: fmConfig} + fm.Configs[0].HugoEnabled = true + + format := getFrontMatter(cfg) + + for _, user := range fm.Configs[0].Users { + user.FrontMatter = format + } + + if err != nil { + return cfg, fm, err + } + + return cfg, fm, nil +} + +func getFrontMatter(conf *Config) string { format := "toml" // Checks if there is an Hugo website in the path that is provided. @@ -94,104 +228,5 @@ func setup(c *caddy.Controller) error { } } - // Generates the Hugo website for the first time the plugin is activated. - go RunHugo(conf, true) - - mid := func(next httpserver.Handler) httpserver.Handler { - return &Hugo{ - Next: next, - Config: conf, - FileManager: &filemanager.FileManager{ - Next: next, - Configs: []config.Config{ - config.Config{ - HugoEnabled: true, - User: &config.User{ - PathScope: conf.Root, - FrontMatter: format, - Root: http.Dir(conf.Root), - StyleSheet: conf.Styles, - }, - BaseURL: conf.BaseURL, - AbsoluteURL: strings.Replace(cnf.Addr.Path+"/"+conf.BaseURL, "//", "/", -1), - AddrPath: strings.TrimSuffix(cnf.Addr.Path, "/"), - }, - }, - }, - } - } - - cnf.AddMiddleware(mid) - return nil -} - -// Config is a configuration for managing a particular hugo website. -type Config struct { - Public string // Public content path - Root string // Hugo files path - Hugo string // Hugo executable location - Styles string // Admin styles path - Args []string // Hugo arguments - BaseURL string // BaseURL of admin interface - FileManager *filemanager.FileManager -} - -// Parse parses the configuration set by the user so it can be -// used by the middleware -func parse(c *caddy.Controller, root string) (*Config, error) { - conf := &Config{ - Public: strings.Replace(root, "./", "", -1), - BaseURL: "/admin", - Root: "./", - } - - if hugo, err := exec.LookPath("hugo"); err == nil { - conf.Hugo = hugo - } else { - fmt.Println("It seems that you don't have 'hugo' on your PATH.") - return conf, errors.New("It seems that you don't have 'hugo' on your PATH.") - } - - for c.Next() { - args := c.RemainingArgs() - - switch len(args) { - case 1: - conf.Root = args[0] - conf.Root = strings.TrimSuffix(conf.Root, "/") - conf.Root += "/" - } - - for c.NextBlock() { - switch c.Val() { - case "styles": - if !c.NextArg() { - return conf, c.ArgErr() - } - tplBytes, err := ioutil.ReadFile(c.Val()) - if err != nil { - return conf, err - } - conf.Styles = string(tplBytes) - case "admin": - if !c.NextArg() { - return conf, c.ArgErr() - } - conf.BaseURL = c.Val() - conf.BaseURL = strings.TrimPrefix(conf.BaseURL, "/") - conf.BaseURL = "/" + conf.BaseURL - default: - key := "--" + c.Val() - value := "true" - - if c.NextArg() { - value = c.Val() - } - - conf.Args = append(conf.Args, key+"="+value) - } - } - } - - return conf, nil + return format }