package main import ( "fmt" "html/template" "os" "strings" "github.com/BurntSushi/toml" ) // Config contains site configuration. type Config struct { Title string `toml:"title"` URLs []string `toml:"urls"` Feeds map[string]string `toml:"feeds"` Tasks map[string]*Task `toml:"tasks"` Permalinks map[string]string `toml:"permalinks"` templates *Templates } // Task represents a site build task. type Task struct { InputExt string `toml:"input_ext"` // input file extension OutputExt string `toml:"output_ext"` // output file extension TemplateExt string `toml:"template_ext"` // template file extension PreProcess string `toml:"preprocess"` // preprocess command PostProcess string `toml:"postprocess"` // postprocess command StaticDir string `toml:"static_dir"` // static file directory OutputDir string `toml:"output_dir"` // output directory UglyURLs bool `toml:"ugly_urls"` // whether to use ugly URLs } // LoadConfig loads the configuration from the provided path. func LoadConfig(path string) (*Config, error) { f, err := os.Open(path) if err != nil { return nil, err } defer f.Close() c := &Config{} if _, err := toml.DecodeReader(f, c); err != nil { return nil, err } // Site contains site metadata passed to templates type Site struct { Title string URLs []string } // Initialize templates c.templates = NewTemplates() c.templates.Funcs(map[string]interface{}{ "site": func() Site { return Site{ Title: c.Title, URLs: c.URLs, } }, "partial": func(name string, data interface{}) (interface{}, error) { t, ok := c.templates.FindPartial(name) if !ok { return "", fmt.Errorf("Error: partial %q not found", name) } var b strings.Builder if err := t.Execute(&b, data); err != nil { return "", err } return b.String(), nil }, "safeHTML": func(s string) template.HTML { return template.HTML(s) }, "safeHTMLAttr": func(s string) template.HTMLAttr { return template.HTMLAttr(s) }, "safeCSS": func(s string) template.CSS { return template.CSS(s) }, "safeJS": func(s string) template.JS { return template.JS(s) }, "safeURL": func(s string) template.URL { return template.URL(s) }, }) return c, nil }