diff --git a/commands/hugo.go b/commands/hugo.go index df6a063c4..cced30143 100644 --- a/commands/hugo.go +++ b/commands/hugo.go @@ -48,7 +48,7 @@ Complete documentation is available at http://hugo.spf13.com`, } var hugoCmdV *cobra.Command -var BuildWatch, Draft, UglyUrls, Verbose, Logging, VerboseLog, DisableRSS bool +var BuildWatch, Draft, UglyUrls, Verbose, Logging, VerboseLog, DisableRSS, DisableSitemap bool var Source, Destination, Theme, BaseUrl, CfgFile, LogFile string func Execute() { @@ -68,6 +68,7 @@ func AddCommands() { func init() { HugoCmd.PersistentFlags().BoolVarP(&Draft, "build-drafts", "D", false, "include content marked as draft") HugoCmd.PersistentFlags().BoolVar(&DisableRSS, "disableRSS", false, "Do not build RSS files") + HugoCmd.PersistentFlags().BoolVar(&DisableSitemap, "disableSitemap", false, "Do not build Sitemap file") HugoCmd.PersistentFlags().StringVarP(&Source, "source", "s", "", "filesystem path to read files relative from") HugoCmd.PersistentFlags().StringVarP(&Destination, "destination", "d", "", "filesystem path to write files to") HugoCmd.PersistentFlags().StringVarP(&Theme, "theme", "t", "", "theme to use (located in /themes/THEMENAME/)") @@ -95,6 +96,7 @@ func InitializeConfig() { viper.SetDefault("MetadataFormat", "toml") viper.SetDefault("DisableRSS", false) + viper.SetDefault("DisableSitemap", false) viper.SetDefault("ContentDir", "content") viper.SetDefault("LayoutDir", "layouts") viper.SetDefault("StaticDir", "static") @@ -120,6 +122,10 @@ func InitializeConfig() { viper.Set("DisableRSS", DisableRSS) } + if hugoCmdV.PersistentFlags().Lookup("disableSitemap").Changed { + viper.Set("DisableSitemap", DisableSitemap) + } + if hugoCmdV.PersistentFlags().Lookup("verbose").Changed { viper.Set("Verbose", Verbose) } diff --git a/hugolib/node.go b/hugolib/node.go index 8ec0b4a2b..1accd03ad 100644 --- a/hugolib/node.go +++ b/hugolib/node.go @@ -28,6 +28,7 @@ type Node struct { Keywords []string Params map[string]interface{} Date time.Time + Sitemap Sitemap UrlPath } diff --git a/hugolib/site.go b/hugolib/site.go index e7b8badc8..f20cabc6f 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -220,6 +220,10 @@ func (s *Site) Render() (err error) { return } s.timerStep("render and write homepage") + if err = s.RenderSitemap(); err != nil { + return + } + s.timerStep("render and write Sitemap") return } @@ -740,6 +744,36 @@ func (s *Site) RenderHomePage() error { return nil } +func (s *Site) RenderSitemap() error { + if viper.GetBool("DisableSitemap") { + return nil + } + + optChanged := false + + n := s.NewNode() + n.Data["Pages"] = s.Pages + + // Force `UglyUrls` option to force `sitemap.xml` file name + switch s.Target.(type) { + case *target.Filesystem: + s.Target.(*target.Filesystem).UglyUrls = true + optChanged = true + } + + smLayouts := []string{"sitemap.xml", "_default/sitemap.xml", "_internal/_default/sitemap.xml"} + err := s.render(n, "sitemap.xml", s.appendThemeTemplates(smLayouts)...) + if err != nil { + return err + } + + if optChanged { + s.Target.(*target.Filesystem).UglyUrls = viper.GetBool("UglyUrls") + } + + return nil +} + func (s *Site) Stats() { jww.FEEDBACK.Printf("%d pages created \n", len(s.Pages)) diff --git a/hugolib/sitemap.go b/hugolib/sitemap.go new file mode 100644 index 000000000..9510555aa --- /dev/null +++ b/hugolib/sitemap.go @@ -0,0 +1,18 @@ +package hugolib + +import jww "github.com/spf13/jwalterweatherman" + +type Sitemap struct { + ChangeFreq string + Priority float32 +} + +func (s Sitemap) Validate() { + if s.Priority < 0 { + jww.WARN.Printf("Sitemap priority should be greater than 0, found: %f", s.Priority) + s.Priority = 0 + } else if s.Priority > 1 { + jww.WARN.Printf("Sitemap priority should be lesser than 1, found: %f", s.Priority) + s.Priority = 1 + } +} diff --git a/hugolib/template_embedded.go b/hugolib/template_embedded.go index 2555f9a21..29d7ce150 100644 --- a/hugolib/template_embedded.go +++ b/hugolib/template_embedded.go @@ -65,6 +65,17 @@ func (t *GoHtmlTemplate) EmbedTemplates() { `) + t.AddInternalTemplate("_default", "sitemap.xml", ` + {{ range .Data.Pages }} + + {{ .Permalink }} + {{ safeHtml ( .Date.Format "2006-01-02T15:04:05-07:00" ) }}{{ with .Sitemap.ChangeFreq }} + {{ . }}{{ end }}{{ with .Sitemap.Priority }} + {{ . }}{{ end }} + + {{ end }} +`) + t.AddInternalTemplate("", "disqus.html", `{{ if .Site.DisqusShortname }}