shithub: hugo

Download patch

ref: f8e675d064fb0b14515cdc6c9488b83bfdad0c5b
parent: 179225449ca812e52f10be532b5fa165f7cfadf5
author: Vincent Batoufflet <[email protected]>
date: Tue May 6 08:50:23 EDT 2014

Add base Sitemap support

--- a/commands/hugo.go
+++ b/commands/hugo.go
@@ -48,7 +48,7 @@
 }
 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 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 @@
 
 	viper.SetDefault("MetadataFormat", "toml")
 	viper.SetDefault("DisableRSS", false)
+	viper.SetDefault("DisableSitemap", false)
 	viper.SetDefault("ContentDir", "content")
 	viper.SetDefault("LayoutDir", "layouts")
 	viper.SetDefault("StaticDir", "static")
@@ -118,6 +120,10 @@
 
 	if hugoCmdV.PersistentFlags().Lookup("disableRSS").Changed {
 		viper.Set("DisableRSS", DisableRSS)
+	}
+
+	if hugoCmdV.PersistentFlags().Lookup("disableSitemap").Changed {
+		viper.Set("DisableSitemap", DisableSitemap)
 	}
 
 	if hugoCmdV.PersistentFlags().Lookup("verbose").Changed {
--- a/hugolib/node.go
+++ b/hugolib/node.go
@@ -28,6 +28,7 @@
 	Keywords    []string
 	Params      map[string]interface{}
 	Date        time.Time
+	Sitemap     Sitemap
 	UrlPath
 }
 
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -220,6 +220,10 @@
 		return
 	}
 	s.timerStep("render and write homepage")
+	if err = s.RenderSitemap(); err != nil {
+		return
+	}
+	s.timerStep("render and write Sitemap")
 	return
 }
 
@@ -735,6 +739,36 @@
 
 		layouts := []string{"404.html"}
 		return s.render(n, "404.html", s.appendThemeTemplates(layouts)...)
+	}
+
+	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
--- /dev/null
+++ b/hugolib/sitemap.go
@@ -1,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
+	}
+}
--- a/hugolib/template_embedded.go
+++ b/hugolib/template_embedded.go
@@ -65,6 +65,17 @@
   </channel>
 </rss>`)
 
+	t.AddInternalTemplate("_default", "sitemap.xml", `<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
+  {{ range .Data.Pages }}
+  <url>
+    <loc>{{ .Permalink }}</loc>
+    <lastmod>{{ safeHtml ( .Date.Format "2006-01-02T15:04:05-07:00" ) }}</lastmod>{{ with .Sitemap.ChangeFreq }}
+    <changefreq>{{ . }}</changefreq>{{ end }}{{ with .Sitemap.Priority }}
+    <priority>{{ . }}</priority>{{ end }}
+  </url>
+  {{ end }}
+</urlset>`)
+
 	t.AddInternalTemplate("", "disqus.html", `{{ if .Site.DisqusShortname }}<div id="disqus_thread"></div>
 <script type="text/javascript">
     var disqus_shortname = '{{ .Site.DisqusShortname }}';