node to page: Make Kind a string

Having a custom string type isn't worth it when it doesn't work
with `where`, `eq` etc.

Fixes #2689
Updates #2297
This commit is contained in:
Bjørn Erik Pedersen 2016-11-13 12:33:11 +01:00
parent 9fba2a30a9
commit 9347084d61
7 changed files with 57 additions and 61 deletions

View file

@ -192,7 +192,7 @@ func (h *HugoSites) renderCrossSitesArtifacts() error {
func (h *HugoSites) assignMissingTranslations() error {
// This looks heavy, but it should be a small number of nodes by now.
allPages := h.findAllPagesByNodeTypeNotIn(KindPage)
for _, nodeType := range []Kind{KindHome, KindSection, KindTaxonomy, KindTaxonomyTerm} {
for _, nodeType := range []string{KindHome, KindSection, KindTaxonomy, KindTaxonomyTerm} {
nodes := h.findPagesByNodeTypeIn(nodeType, allPages)
// Assign translations
@ -304,7 +304,7 @@ func (h *HugoSites) createMissingPages() error {
// TODO(bep) np move
// Move the new* methods after cleanup in site.go
func (s *Site) newNodePage(typ Kind) *Page {
func (s *Site) newNodePage(typ string) *Page {
return &Page{
Kind: typ,
Node: Node{
@ -566,19 +566,19 @@ func (s *Site) updateBuildStats(page *Page) {
}
// TODO(bep) np remove
func (h *HugoSites) findAllPagesByNodeType(n Kind) Pages {
func (h *HugoSites) findAllPagesByNodeType(n string) Pages {
return h.Sites[0].findAllPagesByNodeType(n)
}
func (h *HugoSites) findPagesByNodeTypeNotIn(n Kind, inPages Pages) Pages {
func (h *HugoSites) findPagesByNodeTypeNotIn(n string, inPages Pages) Pages {
return h.Sites[0].findPagesByNodeTypeNotIn(n, inPages)
}
func (h *HugoSites) findPagesByNodeTypeIn(n Kind, inPages Pages) Pages {
func (h *HugoSites) findPagesByNodeTypeIn(n string, inPages Pages) Pages {
return h.Sites[0].findPagesByNodeTypeIn(n, inPages)
}
func (h *HugoSites) findAllPagesByNodeTypeNotIn(n Kind) Pages {
func (h *HugoSites) findAllPagesByNodeTypeNotIn(n string) Pages {
return h.findPagesByNodeTypeNotIn(n, h.Sites[0].AllPages)
}

View file

@ -291,7 +291,7 @@ func sectionsFromFilename(filename string) []string {
}
// TODO(bep) np node identificator
func nodeTypeFromFilename(filename string) Kind {
func kindFromFilename(filename string) string {
if !strings.Contains(filename, "_index") {
return KindPage
}

View file

@ -49,53 +49,35 @@ var (
cjk = regexp.MustCompile(`\p{Han}|\p{Hangul}|\p{Hiragana}|\p{Katakana}`)
)
// Kind is the discriminator that identifies the different page types
// in the different page collections. This can, as an example, be used
// to to filter regular pages, find sections etc.
// NOTE: THe exported constants below are used to filter pages from
// templates in the wild, so do not change the values!
type Kind string
const (
KindPage Kind = "page"
KindPage = "page"
// The rest are node types; home page, sections etc.
KindHome Kind = "home"
KindSection Kind = "section"
KindTaxonomy Kind = "taxonomy"
KindTaxonomyTerm Kind = "taxonomyTerm"
KindHome = "home"
KindSection = "section"
KindTaxonomy = "taxonomy"
KindTaxonomyTerm = "taxonomyTerm"
// Temporary state.
kindUnknown Kind = "unknown"
kindUnknown = "unknown"
// The following are (currently) temporary nodes,
// i.e. nodes we create just to render in isolation.
kindSitemap Kind = "sitemap"
kindRobotsTXT Kind = "robotsTXT"
kind404 Kind = "404"
kindSitemap = "sitemap"
kindRobotsTXT = "robotsTXT"
kind404 = "404"
)
// IsNode returns whether this is an item of one of the list types in Hugo,
// i.e. not a regular content page.
func (k Kind) IsNode() bool {
return k != KindPage
}
// IsHome returns whether this is the home page.
func (k Kind) IsHome() bool {
return k == KindHome
}
// IsPage returns whether this is a regular content page.
func (k Kind) IsPage() bool {
return k == KindPage
}
type Page struct {
// Kind is the discriminator that identifies the different page types
// in the different page collections. This can, as an example, be used
// to to filter regular pages, find sections etc.
// Kind will, for the pages available to the templates, be one of:
// page, home, section, taxonomy and taxonomyTerm.
Kind
// It is of string type to make it easy to reason about in
// the templates.
Kind string
// Since Hugo 0.18 we got rid of the Node type. So now all pages are ...
// pages (regular pages, home page, sections etc.).
@ -171,6 +153,22 @@ type Page struct {
site *Site
}
// IsNode returns whether this is an item of one of the list types in Hugo,
// i.e. not a regular content page.
func (p *Page) IsNode() bool {
return p.Kind != KindPage
}
// IsHome returns whether this is the home page.
func (p *Page) IsHome() bool {
return p.Kind == KindHome
}
// IsPage returns whether this is a regular content page.
func (p *Page) IsPage() bool {
return p.Kind == KindPage
}
type Source struct {
Frontmatter []byte
Content []byte
@ -485,7 +483,7 @@ func (p *Page) getRenderingConfig() *helpers.Blackfriday {
func newPage(filename string) *Page {
page := Page{
Kind: nodeTypeFromFilename(filename),
Kind: kindFromFilename(filename),
contentType: "",
Source: Source{File: *source.NewFile(filename)},
Node: Node{Keywords: []string{}, Sitemap: Sitemap{Priority: -1}},
@ -1378,7 +1376,7 @@ func (p *Page) updatePageDates() {
// TODO(bep) np there is a potential issue with page sorting for home pages
// etc. without front matter dates set, but let us wrap the head around
// that in another time.
if !p.Kind.IsNode() {
if !p.IsNode() {
return
}

View file

@ -61,11 +61,11 @@ func newPageCollectionsFromPages(pages Pages) *PageCollections {
// TODO(bep) np clean and remove finders
func (c *PageCollections) findPagesByNodeType(n Kind) Pages {
func (c *PageCollections) findPagesByNodeType(n string) Pages {
return c.findPagesByNodeTypeIn(n, c.Pages)
}
func (c *PageCollections) getPage(typ Kind, path ...string) *Page {
func (c *PageCollections) getPage(typ string, path ...string) *Page {
pages := c.findPagesByNodeTypeIn(typ, c.Pages)
if len(pages) == 0 {
@ -94,11 +94,11 @@ func (c *PageCollections) getPage(typ Kind, path ...string) *Page {
return nil
}
func (c *PageCollections) findIndexNodesByNodeType(n Kind) Pages {
func (c *PageCollections) findIndexNodesByNodeType(n string) Pages {
return c.findPagesByNodeTypeIn(n, c.indexPages)
}
func (*PageCollections) findPagesByNodeTypeIn(n Kind, inPages Pages) Pages {
func (*PageCollections) findPagesByNodeTypeIn(n string, inPages Pages) Pages {
var pages Pages
for _, p := range inPages {
if p.Kind == n {
@ -108,7 +108,7 @@ func (*PageCollections) findPagesByNodeTypeIn(n Kind, inPages Pages) Pages {
return pages
}
func (*PageCollections) findPagesByNodeTypeNotIn(n Kind, inPages Pages) Pages {
func (*PageCollections) findPagesByNodeTypeNotIn(n string, inPages Pages) Pages {
var pages Pages
for _, p := range inPages {
if p.Kind != n {
@ -118,11 +118,11 @@ func (*PageCollections) findPagesByNodeTypeNotIn(n Kind, inPages Pages) Pages {
return pages
}
func (c *PageCollections) findAllPagesByNodeType(n Kind) Pages {
func (c *PageCollections) findAllPagesByNodeType(n string) Pages {
return c.findPagesByNodeTypeIn(n, c.Pages)
}
func (c *PageCollections) findRawAllPagesByNodeType(n Kind) Pages {
func (c *PageCollections) findRawAllPagesByNodeType(n string) Pages {
return c.findPagesByNodeTypeIn(n, c.rawAllPages)
}

View file

@ -1278,17 +1278,15 @@ func TestIndexPageSimpleMethods(t *testing.T) {
}
}
func TestPageType(t *testing.T) {
func TestKind(t *testing.T) {
// Add tests for these constants to make sure they don't change
require.Equal(t, Kind("page"), KindPage)
require.Equal(t, Kind("home"), KindHome)
require.Equal(t, Kind("section"), KindSection)
require.Equal(t, Kind("taxonomy"), KindTaxonomy)
require.Equal(t, Kind("taxonomyTerm"), KindTaxonomyTerm)
require.Equal(t, "page", KindPage)
require.Equal(t, "home", KindHome)
require.Equal(t, "section", KindSection)
require.Equal(t, "taxonomy", KindTaxonomy)
require.Equal(t, "taxonomyTerm", KindTaxonomyTerm)
require.False(t, KindPage.IsNode())
require.True(t, KindHome.IsNode())
}
func TestChompBOM(t *testing.T) {

View file

@ -260,7 +260,7 @@ func splitPageGroups(pageGroups PagesGroup, size int) []paginatedElement {
// Paginator gets this Node's paginator if it's already created.
// If it's not, one will be created with all pages in Data["Pages"].
func (n *Page) Paginator(options ...interface{}) (*Pager, error) {
if !n.Kind.IsNode() {
if !n.IsNode() {
return nil, fmt.Errorf("Paginators not supported for pages of type %q (%q)", n.Kind, n.Title)
}
pagerSize, err := resolvePagerSize(options...)
@ -303,7 +303,7 @@ func (n *Page) Paginator(options ...interface{}) (*Pager, error) {
// If it's not, one will be created with the qiven sequence.
// Note that repeated calls will return the same result, even if the sequence is different.
func (n *Page) Paginate(seq interface{}, options ...interface{}) (*Pager, error) {
if !n.Kind.IsNode() {
if !n.IsNode() {
return nil, fmt.Errorf("Paginators not supported for pages of type %q (%q)", n.Kind, n.Title)
}

View file

@ -1561,7 +1561,7 @@ func (s *Site) assembleSections() {
}
}
func (s *Site) nodeTypeFromSections(sections []string) Kind {
func (s *Site) nodeTypeFromSections(sections []string) string {
if _, isTaxonomy := s.Taxonomies[sections[0]]; isTaxonomy {
if len(sections) == 1 {
return KindTaxonomyTerm
@ -1662,7 +1662,7 @@ func (s *Site) Stats() {
// This will return nil when no page could be found.
//
// The valid page types are: home, section, taxonomy and taxonomyTerm
func (s *SiteInfo) GetPage(typ Kind, path ...string) *Page {
func (s *SiteInfo) GetPage(typ string, path ...string) *Page {
return s.getPage(typ, path...)
}