hugolib: Improve menu generation for section pages with content
authorAbdo Roig-Maranges <abdo.roig@gmail.com>
Sun, 22 Jan 2017 11:28:31 +0000 (12:28 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 20 Feb 2017 21:20:02 +0000 (22:20 +0100)
When using the lazy blogger setting to automatically generate menu
entries from section pages, we now recognize section pages that have
content, and use the weight and linktitle configured in the frontmatter.

This way, we can use the lazy blogger automatic generation, and
influence menu order and translations, directly from the frontmatter.

Updates #2974

hugolib/site.go

index 2882ce8596178c43f5632f39fc2cf6d1c11b25c1..dd8169a966c67ecf5f7baeee3aa9b6ff933f989d 100644 (file)
@@ -1430,6 +1430,7 @@ func (s *Site) assembleMenus() {
        flat := map[twoD]*MenuEntry{}
        children := map[twoD]Menu{}
 
+       // add menu entries from config to flat hash
        menuConfig := s.getMenusFromConfig()
        for name, menu := range menuConfig {
                for _, me := range *menu {
@@ -1438,26 +1439,49 @@ func (s *Site) assembleMenus() {
        }
 
        sectionPagesMenu := s.Info.sectionPagesMenu
-       sectionPagesMenus := make(map[string]interface{})
-       //creating flat hash
        pages := s.Pages
-       for _, p := range pages {
-               if sectionPagesMenu != "" {
+
+       if sectionPagesMenu != "" {
+               // Create menu entries for section pages with content
+               for _, p := range pages {
+                       if p.Kind == KindSection {
+                               // menu with same id defined in config, let that one win
+                               if _, ok := flat[twoD{sectionPagesMenu, p.Section()}]; ok {
+                                       continue
+                               }
+
+                               me := MenuEntry{Identifier: p.Section(),
+                                       Name:   p.LinkTitle(),
+                                       Weight: p.Weight,
+                                       URL:    p.RelPermalink()}
+
+                               flat[twoD{sectionPagesMenu, me.KeyName()}] = &me
+                       }
+               }
+
+               // Create entries for remaining content-less section pages
+               sectionPagesMenus := make(map[string]interface{})
+               for _, p := range pages {
                        if _, ok := sectionPagesMenus[p.Section()]; !ok {
                                if p.Section() != "" {
+                                       // menu with same id defined in config, let that one win
+                                       if _, ok := flat[twoD{sectionPagesMenu, p.Section()}]; ok {
+                                               continue
+                                       }
+
                                        me := MenuEntry{Identifier: p.Section(),
                                                Name: helpers.MakeTitle(helpers.FirstUpper(p.Section())),
                                                URL:  s.Info.createNodeMenuEntryURL(p.addLangPathPrefix("/"+p.Section()) + "/")}
-                                       if _, ok := flat[twoD{sectionPagesMenu, me.KeyName()}]; ok {
-                                               // menu with same id defined in config, let that one win
-                                               continue
-                                       }
+
                                        flat[twoD{sectionPagesMenu, me.KeyName()}] = &me
                                        sectionPagesMenus[p.Section()] = true
                                }
                        }
                }
+       }
 
+       // Add menu entries provided by pages
+       for _, p := range pages {
                for name, me := range p.Menus() {
                        if _, ok := flat[twoD{name, me.KeyName()}]; ok {
                                s.Log.ERROR.Printf("Two or more menu items have the same name/identifier in Menu %q: %q.\nRename or set an unique identifier.\n", name, me.KeyName())