Add handling for publishDates (which will be ignored if in the future). Fixed #260

This commit is contained in:
spf13 2014-05-29 00:48:40 -04:00
parent 4ebaec8906
commit c502f078bc
4 changed files with 81 additions and 3 deletions

View file

@ -51,7 +51,7 @@ Complete documentation is available at http://hugo.spf13.com`,
var hugoCmdV *cobra.Command var hugoCmdV *cobra.Command
var BuildWatch, Draft, UglyUrls, Verbose, Logging, VerboseLog, DisableRSS, DisableSitemap bool var BuildWatch, Draft, Future, UglyUrls, Verbose, Logging, VerboseLog, DisableRSS, DisableSitemap bool
var Source, Destination, Theme, BaseUrl, CfgFile, LogFile string var Source, Destination, Theme, BaseUrl, CfgFile, LogFile string
func Execute() { func Execute() {
@ -70,6 +70,7 @@ func AddCommands() {
func init() { func init() {
HugoCmd.PersistentFlags().BoolVarP(&Draft, "buildDrafts", "D", false, "include content marked as draft") HugoCmd.PersistentFlags().BoolVarP(&Draft, "buildDrafts", "D", false, "include content marked as draft")
HugoCmd.PersistentFlags().BoolVarP(&Future, "buildFuture", "F", false, "include content with datePublished in the future")
HugoCmd.PersistentFlags().BoolVar(&DisableRSS, "disableRSS", false, "Do not build RSS files") HugoCmd.PersistentFlags().BoolVar(&DisableRSS, "disableRSS", false, "Do not build RSS files")
HugoCmd.PersistentFlags().BoolVar(&DisableSitemap, "disableSitemap", false, "Do not build Sitemap file") 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(&Source, "source", "s", "", "filesystem path to read files relative from")
@ -108,6 +109,7 @@ func InitializeConfig() {
viper.SetDefault("PublishDir", "public") viper.SetDefault("PublishDir", "public")
viper.SetDefault("DefaultLayout", "post") viper.SetDefault("DefaultLayout", "post")
viper.SetDefault("BuildDrafts", false) viper.SetDefault("BuildDrafts", false)
viper.SetDefault("BuildFuture", false)
viper.SetDefault("UglyUrls", false) viper.SetDefault("UglyUrls", false)
viper.SetDefault("Verbose", false) viper.SetDefault("Verbose", false)
viper.SetDefault("CanonifyUrls", false) viper.SetDefault("CanonifyUrls", false)
@ -122,6 +124,10 @@ func InitializeConfig() {
viper.Set("BuildDrafts", Draft) viper.Set("BuildDrafts", Draft)
} }
if hugoCmdV.PersistentFlags().Lookup("buildFuture").Changed {
viper.Set("BuildFuture", Future)
}
if hugoCmdV.PersistentFlags().Lookup("uglyUrls").Changed { if hugoCmdV.PersistentFlags().Lookup("uglyUrls").Changed {
viper.Set("UglyUrls", UglyUrls) viper.Set("UglyUrls", UglyUrls)
} }

View file

@ -44,6 +44,7 @@ type Page struct {
Params map[string]interface{} Params map[string]interface{}
contentType string contentType string
Draft bool Draft bool
PublishDate time.Time
Aliases []string Aliases []string
Tmpl Template Tmpl Template
Markup string Markup string
@ -276,6 +277,15 @@ func (p *Page) LinkTitle() string {
} }
} }
func (page *Page) ShouldBuild() bool {
if viper.GetBool("BuildFuture") || page.PublishDate.IsZero() || page.PublishDate.Before(time.Now()) {
if viper.GetBool("BuildDrafts") || !page.Draft {
return true
}
}
return false
}
func (p *Page) Permalink() (string, error) { func (p *Page) Permalink() (string, error) {
link, err := p.permalink() link, err := p.permalink()
if err != nil { if err != nil {
@ -323,8 +333,10 @@ func (page *Page) update(f interface{}) error {
page.contentType = cast.ToString(v) page.contentType = cast.ToString(v)
case "keywords": case "keywords":
page.Keywords = cast.ToStringSlice(v) page.Keywords = cast.ToStringSlice(v)
case "date", "pubdate": case "date":
page.Date = cast.ToTime(v) page.Date = cast.ToTime(v)
case "publishdate", "pubdate":
page.PublishDate = cast.ToTime(v)
case "draft": case "draft":
page.Draft = cast.ToBool(v) page.Draft = cast.ToBool(v)
case "layout": case "layout":

View file

@ -344,7 +344,7 @@ func (s *Site) CreatePages() (err error) {
return err return err
} }
if viper.GetBool("BuildDrafts") || !page.Draft { if page.ShouldBuild() {
s.Pages = append(s.Pages, page) s.Pages = append(s.Pages, page)
} }

View file

@ -219,6 +219,66 @@ func TestTargetPath(t *testing.T) {
} }
} }
func TestDraftAndFutureRender(t *testing.T) {
files := make(map[string][]byte)
target := &target.InMemoryTarget{Files: files}
sources := []source.ByteSource{
{"sect/doc1.md", []byte("---\ntitle: doc1\ndraft: true\npublishdate: \"2414-05-29\"\n---\n# doc1\n*some content*"), "sect"},
{"sect/doc2.md", []byte("---\ntitle: doc2\ndraft: true\npublishdate: \"2012-05-29\"\n---\n# doc2\n*some content*"), "sect"},
{"sect/doc3.md", []byte("---\ntitle: doc3\ndraft: false\npublishdate: \"2414-05-29\"\n---\n# doc3\n*some content*"), "sect"},
{"sect/doc4.md", []byte("---\ntitle: doc4\ndraft: false\npublishdate: \"2012-05-29\"\n---\n# doc4\n*some content*"), "sect"},
}
siteSetup := func() *Site {
s := &Site{
Target: target,
Source: &source.InMemorySource{ByteSource: sources},
}
s.initializeSiteInfo()
if err := s.CreatePages(); err != nil {
t.Fatalf("Unable to create pages: %s", err)
}
return s
}
viper.Set("baseurl", "http://auth/bub")
// Testing Defaults.. Only draft:true and publishDate in the past should be rendered
s := siteSetup()
if len(s.Pages) != 1 {
t.Fatal("Draft or Future dated content published unexpectedly")
}
// only publishDate in the past should be rendered
viper.Set("BuildDrafts", true)
s = siteSetup()
if len(s.Pages) != 2 {
t.Fatal("Future Dated Posts published unexpectedly")
}
// drafts should not be rendered, but all dates should
viper.Set("BuildDrafts", false)
viper.Set("BuildFuture", true)
s = siteSetup()
if len(s.Pages) != 2 {
t.Fatal("Draft posts published unexpectedly")
}
// all 4 should be included
viper.Set("BuildDrafts", true)
viper.Set("BuildFuture", true)
s = siteSetup()
if len(s.Pages) != 4 {
t.Fatal("Drafts or Future posts not included as expected")
}
//setting defaults back
viper.Set("BuildDrafts", false)
viper.Set("BuildFuture", false)
}
func TestSkipRender(t *testing.T) { func TestSkipRender(t *testing.T) {
files := make(map[string][]byte) files := make(map[string][]byte)
target := &target.InMemoryTarget{Files: files} target := &target.InMemoryTarget{Files: files}