diff options
author | David Jones <david@davidejones.com> | 2020-11-22 13:09:59 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-22 22:09:59 +0100 |
commit | 8f5c9a747fcebb02bb99f5de272046411eb15370 (patch) | |
tree | da9d219c001c2ddccafe8f5c5d05d962bf8c6275 | |
parent | e4fcb672ed8bae21fd9780292b54fea3040dd877 (diff) |
Add menu params
Fixes #7951
-rw-r--r-- | docs/content/en/content-management/menus.md | 18 | ||||
-rw-r--r-- | docs/content/en/templates/menu-templates.md | 20 | ||||
-rw-r--r-- | hugolib/menu_test.go | 50 | ||||
-rw-r--r-- | navigation/menu.go | 3 |
4 files changed, 91 insertions, 0 deletions
diff --git a/docs/content/en/content-management/menus.md b/docs/content/en/content-management/menus.md index 9ac6f8bff..6b89c44da 100644 --- a/docs/content/en/content-management/menus.md +++ b/docs/content/en/content-management/menus.md @@ -113,6 +113,24 @@ This means that `.Title` will be used unless `.LinkTitle` is present, etc. In pr In this example, the top level of the menu is defined in your [site `config` file][config]. All content entries are attached to one of these entries via the `.Parent` field. +## Params + +You can also add user-defined content to menu items via the `params` field. + +A common use case is to define a custom param to add a css class to a specific menu item. + +{{< code-toggle file="config" >}} +[[menu.main]] + name = "about hugo" + pre = "<i class='fa fa-heart'></i>" + weight = -110 + identifier = "about" + url = "/about/" + [menu.main.params] + class = "highlight-menu-item" +{{</ code-toggle >}} + + ## Render Menus See [Menu Templates](/templates/menu-templates/) for information on how to render your site menus within your templates. diff --git a/docs/content/en/templates/menu-templates.md b/docs/content/en/templates/menu-templates.md index b39fe42a9..8893d7b5a 100644 --- a/docs/content/en/templates/menu-templates.md +++ b/docs/content/en/templates/menu-templates.md @@ -160,3 +160,23 @@ Here's an example: {{ end }} </nav> ``` + +## Using .Params in Menus + +User-defined content on menu items are accessible via `.Params`. + +Here's an example: + +``` +<nav class="sidebar-nav"> + {{ range .Site.Menus.main }} + <a href="{{ .URL }}" title="{{ .Title }}" class="{{ with .Params.class }}{{ . }}{{ end }}"> + {{- .Name -}} + </a> + {{ end }} +</nav> +``` + +{{% note %}} +With Menu-level .Params they can easily exist on one menu item but not another. It's recommended to access them gracefully using the [with function](/functions/with). +{{% /note %}}
\ No newline at end of file diff --git a/hugolib/menu_test.go b/hugolib/menu_test.go index 6fa31b4ee..cfb4b954b 100644 --- a/hugolib/menu_test.go +++ b/hugolib/menu_test.go @@ -267,3 +267,53 @@ menu: b.AssertFileContent("public/index.html", "A|Children:C|B|") } + +func TestMenuParams(t *testing.T) { + + b := newTestSitesBuilder(t).WithSimpleConfigFile() + + b.WithTemplatesAdded("index.html", ` +Main: {{ len .Site.Menus.main }} +{{ range .Site.Menus.main }} +* Main|{{ .Name }}: {{ .URL }}|{{ .Params }} +{{ end }} +`) + + b.WithContent("blog/page1.md", ` +--- +title: "P1" +menu: main +--- + +`) + + b.WithContent("blog/page2.md", ` +--- +title: "P2" +menu: main +--- + +`) + + b.WithContent("blog/page3.md", ` +--- +title: "P3" +menu: + main: + weight: 30 + params: + foo: "bar" + key2: "value2" +--- +`) + + b.Build(BuildCfg{}) + + b.AssertFileContent("public/index.html", + "Main: 3", + "Main|P3: /blog/page3/|map[foo:bar key2:value2]", + "Main|P1: /blog/page1/|map[]", + "Main|P2: /blog/page2/|map[]", + ) + +} diff --git a/navigation/menu.go b/navigation/menu.go index ae2e0e4ff..498078e34 100644 --- a/navigation/menu.go +++ b/navigation/menu.go @@ -39,6 +39,7 @@ type MenuEntry struct { Weight int Parent string Children Menu + Params maps.Params } func (m *MenuEntry) URL() string { @@ -127,6 +128,8 @@ func (m *MenuEntry) MarshallMap(ime map[string]interface{}) { m.Identifier = cast.ToString(v) case "parent": m.Parent = cast.ToString(v) + case "params": + m.Params = maps.ToStringMap(v) } } } |