Skip to content

Commit

Permalink
hugolib: improve menu generation for section pages with content
Browse files Browse the repository at this point in the history
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.

Fixes gohugoio#2974
  • Loading branch information
aroig committed Feb 19, 2017
1 parent 02b120d commit f836592
Showing 1 changed file with 27 additions and 5 deletions.
32 changes: 27 additions & 5 deletions hugolib/site.go
Original file line number Diff line number Diff line change
Expand Up @@ -1446,6 +1446,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 {
Expand All @@ -1454,26 +1455,47 @@ 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.Section() != "" && p.Kind == KindSection {
me := MenuEntry{Identifier: p.Section(),
Name: p.LinkTitle(),
Weight: p.Weight,
URL: p.RelPermalink()}

// menu with same id defined in config, let that one win
if _, ok := flat[twoD{sectionPagesMenu, me.KeyName()}]; ok {
continue
}
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() != "" {
me := MenuEntry{Identifier: p.Section(),
Name: helpers.MakeTitle(helpers.FirstUpper(p.Section())),
URL: s.Info.createNodeMenuEntryURL(p.addLangPathPrefix("/"+p.Section()) + "/")}

// menu with same id defined in config, let that one win
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())
Expand Down

0 comments on commit f836592

Please sign in to comment.