Skip to content

Commit

Permalink
resources/page: Add :contentbasename and :contentbasenameorslug perma…
Browse files Browse the repository at this point in the history
…link tokens

See #11722
  • Loading branch information
hacdias authored and bep committed Feb 12, 2025
1 parent fd8b0fb commit 7afd74d
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 13 deletions.
8 changes: 8 additions & 0 deletions docs/content/en/content-management/urls.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
48 changes: 35 additions & 13 deletions resources/page/permalinks.go
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down Expand Up @@ -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 ""
Expand Down
2 changes: 2 additions & 0 deletions resources/page/permalinks_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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, ""},
Expand Down

0 comments on commit 7afd74d

Please sign in to comment.