node to page: Make Kind a string - hugo - [fork] hugo port for 9front
 (HTM) git clone git@git.drkhsh.at/hugo.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 9347084d61a91c73bba1e04790b029163c38bacf
 (DIR) parent 9fba2a30a9ab5e17a699920079b3ca192686afd4
 (HTM) Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
       Date:   Sun, 13 Nov 2016 12:33:11 +0100
       
       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
       
       Diffstat:
         M hugolib/hugo_sites.go               |      12 ++++++------
         M hugolib/node.go                     |       2 +-
         M hugolib/page.go                     |      68 +++++++++++++++----------------
         M hugolib/page_collections.go         |      14 +++++++-------
         M hugolib/page_test.go                |      16 +++++++---------
         M hugolib/pagination.go               |       4 ++--
         M hugolib/site.go                     |       4 ++--
       
       7 files changed, 58 insertions(+), 62 deletions(-)
       ---
 (DIR) diff --git a/hugolib/hugo_sites.go b/hugolib/hugo_sites.go
       @@ -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)
        }
        
 (DIR) diff --git a/hugolib/node.go b/hugolib/node.go
       @@ -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
                }
 (DIR) diff --git a/hugolib/page.go b/hugolib/page.go
       @@ -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
                }
        
 (DIR) diff --git a/hugolib/page_collections.go b/hugolib/page_collections.go
       @@ -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)
        }
        
 (DIR) diff --git a/hugolib/page_test.go b/hugolib/page_test.go
       @@ -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.False(t, KindPage.IsNode())
       -        require.True(t, KindHome.IsNode())
       +        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)
       +
        }
        
        func TestChompBOM(t *testing.T) {
 (DIR) diff --git a/hugolib/pagination.go b/hugolib/pagination.go
       @@ -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)
                }
        
 (DIR) diff --git a/hugolib/site.go b/hugolib/site.go
       @@ -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...)
        }