resources/page: Add :contentbasename and :contentbasenameorslug permalink tokens - hugo - [fork] hugo port for 9front
HTML git clone git@git.drkhsh.at/hugo.git
DIR Log
DIR Files
DIR Refs
DIR Submodules
DIR README
DIR LICENSE
---
DIR commit cb7a4339b74519836be41e43e6bffef64606420b
DIR parent 157d3703c3ec7bd2b25270c55b0d6e6d203f76e3
HTML Author: Henrique Dias <mail@hacdias.com>
Date: Wed, 12 Feb 2025 14:13:17 +0100
resources/page: Add :contentbasename and :contentbasenameorslug permalink tokens
See #11722
Diffstat:
M docs/content/en/content-management… | 8 ++++++++
M resources/page/permalinks.go | 48 ++++++++++++++++++++++---------
M resources/page/permalinks_test.go | 2 ++
3 files changed, 45 insertions(+), 13 deletions(-)
---
DIR diff --git a/docs/content/en/content-management/urls.md b/docs/content/en/content-management/urls.md
@@ -317,6 +317,14 @@ Use these tokens when defining the URL pattern. You can also use these tokens wh
`:slugorfilename`
: The slug as defined in front matter, else the content's file name without extension, applicable to the `page` page kind.
+`:contentbasename`
+: The content base name, as defined in [`File.ContentBaseName`], applicable to pages backed by a file.
+
+`:contentbasenameorslug`
+: The content base name, else the slug as defined above.
+
+[`File.ContentBaseName`]: /methods/page/file/#contentbasename
+
For time-related values, you can also use the layout string components defined in Go's [time package]. For example:
[time package]: https://pkg.go.dev/time#pkg-constants
DIR diff --git a/resources/page/permalinks.go b/resources/page/permalinks.go
@@ -79,19 +79,21 @@ func NewPermalinkExpander(urlize func(uri string) string, patterns map[string]ma
}
p.knownPermalinkAttributes = map[string]pageToPermaAttribute{
- "year": p.pageToPermalinkDate,
- "month": p.pageToPermalinkDate,
- "monthname": p.pageToPermalinkDate,
- "day": p.pageToPermalinkDate,
- "weekday": p.pageToPermalinkDate,
- "weekdayname": p.pageToPermalinkDate,
- "yearday": p.pageToPermalinkDate,
- "section": p.pageToPermalinkSection,
- "sections": p.pageToPermalinkSections,
- "title": p.pageToPermalinkTitle,
- "slug": p.pageToPermalinkSlugElseTitle,
- "slugorfilename": p.pageToPermalinkSlugElseFilename,
- "filename": p.pageToPermalinkFilename,
+ "year": p.pageToPermalinkDate,
+ "month": p.pageToPermalinkDate,
+ "monthname": p.pageToPermalinkDate,
+ "day": p.pageToPermalinkDate,
+ "weekday": p.pageToPermalinkDate,
+ "weekdayname": p.pageToPermalinkDate,
+ "yearday": p.pageToPermalinkDate,
+ "section": p.pageToPermalinkSection,
+ "sections": p.pageToPermalinkSections,
+ "title": p.pageToPermalinkTitle,
+ "slug": p.pageToPermalinkSlugElseTitle,
+ "slugorfilename": p.pageToPermalinkSlugElseFilename,
+ "filename": p.pageToPermalinkFilename,
+ "contentbasename": p.pageToPermalinkContentBaseName,
+ "contentbasenameorslug": p.pageToPermalinkContentBaseNameOrSlug,
}
p.expanders = make(map[string]map[string]func(Page) (string, error))
@@ -307,6 +309,26 @@ func (l PermalinkExpander) pageToPermalinkSections(p Page, _ string) (string, er
return p.CurrentSection().SectionsPath(), nil
}
+// pageToPermalinkContentBaseName returns the URL-safe form of the content base name.
+func (l PermalinkExpander) pageToPermalinkContentBaseName(p Page, _ string) (string, error) {
+ if p.File() == nil {
+ return "", nil
+ }
+ return l.urlize(p.File().ContentBaseName()), nil
+}
+
+// pageToPermalinkContentBaseNameOrSlug returns the URL-safe form of the content base name, or the slug.
+func (l PermalinkExpander) pageToPermalinkContentBaseNameOrSlug(p Page, a string) (string, error) {
+ name, err := l.pageToPermalinkContentBaseName(p, a)
+ if err != nil {
+ return "", nil
+ }
+ if name != "" {
+ return name, nil
+ }
+ return l.pageToPermalinkSlugElseTitle(p, a)
+}
+
func (l PermalinkExpander) translationBaseName(p Page) string {
if p.File() == nil {
return ""
DIR diff --git a/resources/page/permalinks_test.go b/resources/page/permalinks_test.go
@@ -46,6 +46,8 @@ var testdataPermalinks = []struct {
{"/:sections[0]/:sections[last]/", true, "/a/c/"}, // Sections
{"/\\:filename", true, "/:filename"}, // Escape sequence
{"/special\\::slug/", true, "/special:the-slug/"}, // Escape sequence
+ {"/:contentbasename/", true, "/index/"}, // Content base name
+ {"/:contentbasenameorslug/", true, "/index/"}, // Content base name or slug
// Failures
{"/blog/:fred", false, ""},