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.

Updates gohugoio#2974
  • Loading branch information
aroig authored and bep committed Feb 20, 2017
1 parent fe9fd0a commit 4fe44e0
Showing 1 changed file with 32 additions and 8 deletions.
40 changes: 32 additions & 8 deletions hugolib/site.go
Expand Up @@ -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 {
Expand All @@ -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())
Expand Down

0 comments on commit 4fe44e0

Please sign in to comment.