commit 5a9ecb82a39886a7241ec656fc980f20c1b8dd1c
parent cbc35c48d252a1b44e4c30e26cfba2ff462a1f96
Author: Dawid Potocki <dawid@dawidpotocki.com>
Date: Tue, 14 Jun 2022 00:22:58 +1200
resources/page: Add :slugorfilename attribute
Fixes #4739, #385
Diffstat:
3 files changed, 39 insertions(+), 14 deletions(-)
diff --git a/docs/content/en/content-management/urls.md b/docs/content/en/content-management/urls.md
@@ -91,6 +91,9 @@ The following is a list of values that can be used in a `permalink` definition i
`:slug`
: the content's slug (or title if no slug is provided in the front matter)
+`:slugorfilename`
+: the content's slug (or filename if no slug is provided in the front matter)
+
`:filename`
: the content's filename (without extension)
diff --git a/resources/page/permalinks.go b/resources/page/permalinks.go
@@ -72,18 +72,19 @@ func NewPermalinkExpander(ps *helpers.PathSpec) (PermalinkExpander, error) {
p := PermalinkExpander{ps: ps}
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,
- "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,
}
patterns := ps.Cfg.GetStringMapString("permalinks")
@@ -266,6 +267,14 @@ func (l PermalinkExpander) pageToPermalinkSlugElseTitle(p Page, a string) (strin
return l.pageToPermalinkTitle(p, a)
}
+// if the page has a slug, return the slug, else return the filename
+func (l PermalinkExpander) pageToPermalinkSlugElseFilename(p Page, a string) (string, error) {
+ if p.Slug() != "" {
+ return l.ps.URLize(p.Slug()), nil
+ }
+ return l.pageToPermalinkFilename(p, a)
+}
+
func (l PermalinkExpander) pageToPermalinkSection(p Page, _ string) (string, error) {
return p.Section(), nil
}
diff --git a/resources/page/permalinks_test.go b/resources/page/permalinks_test.go
@@ -36,6 +36,7 @@ var testdataPermalinks = []struct {
{"/:section/", true, "/blue/"}, // Section
{"/:title/", true, "/spf13-vim-3.0-release-and-new-website/"}, // Title
{"/:slug/", true, "/the-slug/"}, // Slug
+ {"/:slugorfilename/", true, "/the-slug/"}, // Slug or filename
{"/:filename/", true, "/test-page/"}, // Filename
{"/:06-:1-:2-:Monday", true, "/12-4-6-Friday"}, // Dates with Go formatting
{"/:2006_01_02_15_04_05.000", true, "/2012_04_06_03_01_59.000"}, // Complicated custom date format
@@ -102,9 +103,13 @@ func TestPermalinkExpansionMultiSection(t *testing.T) {
page.section = "blue"
page.slug = "The Slug"
+ page_slug_fallback := newTestPageWithFile("/page-filename/index.md")
+ page_slug_fallback.title = "Page Title"
+
permalinksConfig := map[string]string{
- "posts": "/:slug",
- "blog": "/:section/:year",
+ "posts": "/:slug",
+ "blog": "/:section/:year",
+ "recipes": "/:slugorfilename",
}
ps := newTestPathSpec()
@@ -120,6 +125,14 @@ func TestPermalinkExpansionMultiSection(t *testing.T) {
expanded, err = expander.Expand("blog", page)
c.Assert(err, qt.IsNil)
c.Assert(expanded, qt.Equals, "/blue/2012")
+
+ expanded, err = expander.Expand("posts", page_slug_fallback)
+ c.Assert(err, qt.IsNil)
+ c.Assert(expanded, qt.Equals, "/page-title")
+
+ expanded, err = expander.Expand("recipes", page_slug_fallback)
+ c.Assert(err, qt.IsNil)
+ c.Assert(expanded, qt.Equals, "/page-filename")
}
func TestPermalinkExpansionConcurrent(t *testing.T) {