diff options
author | Joe Mooring <[email protected]> | 2024-02-20 17:57:51 -0800 |
---|---|---|
committer | Bjørn Erik Pedersen <[email protected]> | 2024-02-21 09:11:34 +0100 |
commit | c9f7ebf0043c3e7a0f0236e9f5aa6513f4761923 (patch) | |
tree | 9cc2d510b9c6f15d8d674bad07e5fc1b7825eddd | |
parent | eceeb19751e78ed76f43a68fb5ce5251837e1049 (diff) | |
download | hugo-c9f7ebf0043c3e7a0f0236e9f5aa6513f4761923.tar.gz hugo-c9f7ebf0043c3e7a0f0236e9f5aa6513f4761923.zip |
tpl/tplimpl: Resolve fragments in link render hook
Fixes #12084
-rw-r--r-- | tpl/tplimpl/embedded/templates/_default/_markup/render-link.html | 4 | ||||
-rw-r--r-- | tpl/tplimpl/render_hook_integration_test.go | 129 |
2 files changed, 132 insertions, 1 deletions
diff --git a/tpl/tplimpl/embedded/templates/_default/_markup/render-link.html b/tpl/tplimpl/embedded/templates/_default/_markup/render-link.html index bd64b204b..cfc95ab3a 100644 --- a/tpl/tplimpl/embedded/templates/_default/_markup/render-link.html +++ b/tpl/tplimpl/embedded/templates/_default/_markup/render-link.html @@ -1,6 +1,8 @@ {{- $u := urls.Parse .Destination -}} {{- $href := $u.String -}} -{{- if not $u.IsAbs -}} +{{- if strings.HasPrefix $u.String "#" }} + {{- $href = printf "%s#%s" .Page.RelPermalink $u.Fragment }} +{{- else if not $u.IsAbs -}} {{- with or ($.Page.GetPage $u.Path) ($.Page.Resources.Get $u.Path) diff --git a/tpl/tplimpl/render_hook_integration_test.go b/tpl/tplimpl/render_hook_integration_test.go new file mode 100644 index 000000000..607e06059 --- /dev/null +++ b/tpl/tplimpl/render_hook_integration_test.go @@ -0,0 +1,129 @@ +// Copyright 2024 The Hugo Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tplimpl_test + +import ( + "testing" + + "github.com/gohugoio/hugo/hugolib" +) + +func TestEmbeddedLinkRenderHook(t *testing.T) { + t.Parallel() + + files := ` +-- hugo.toml -- +disableKinds = ['rss','sitemap','taxonomy','term'] +[markup.goldmark.renderHooks.link] +enableDefault = true +-- layouts/_default/list.html -- +{{ .Content }} +-- layouts/_default/single.html -- +{{ .Content }} +-- assets/a.txt -- +irrelevant +-- content/_index.md -- +--- +title: home +--- +-- content/s1/_index.md -- +--- +title: s1 +--- +-- content/s1/p1.md -- +--- +title: s1/p1 +--- +-- content/s1/p2/index.md -- +--- +title: s1/p2 +--- +[500](a.txt) // global resource +[600](b.txt) // page resource +-- content/s1/p2/b.txt -- +irrelevant +-- content/s1/p3.md -- +--- +title: s1/p3 +--- +// Remote +[10](https://a.org) + +// fragment +[100](/#foo) +[110](#foo) +[120](p1#foo) +[130](p1/#foo) + +// section page +[200](s1) +[210](/s1) +[220](../s1) +[230](s1/) +[240](/s1/) +[250](../s1/) + +// regular page +[300](p1) +[310](/s1/p1) +[320](../s1/p1) +[330](p1/) +[340](/s1/p1/) +[350](../s1/p1/) + +// leaf bundle +[400](p2) +[410](/s1/p2) +[420](../s1/p2) +[430](p2/) +[440](/s1/p2/) +[450](../s1/p2/) +` + + b := hugolib.Test(t, files) + + b.AssertFileContent("public/s1/p3/index.html", + `<a href="https://a.org">10</a>`, + `<a href="/#foo">100</a>`, + `<a href="/s1/p3/#foo">110</a>`, + `<a href="/s1/p1/#foo">120</a>`, + `<a href="/s1/p1/#foo">130</a>`, + + `<a href="/s1/">200</a>`, + `<a href="/s1/">210</a>`, + `<a href="/s1/">220</a>`, + `<a href="/s1/">230</a>`, + `<a href="/s1/">240</a>`, + `<a href="/s1/">250</a>`, + + `<a href="/s1/p1/">300</a>`, + `<a href="/s1/p1/">310</a>`, + `<a href="/s1/p1/">320</a>`, + `<a href="/s1/p1/">330</a>`, + `<a href="/s1/p1/">340</a>`, + `<a href="/s1/p1/">350</a>`, + + `<a href="/s1/p2/">400</a>`, + `<a href="/s1/p2/">410</a>`, + `<a href="/s1/p2/">420</a>`, + `<a href="/s1/p2/">430</a>`, + `<a href="/s1/p2/">440</a>`, + `<a href="/s1/p2/">450</a>`, + ) + + b.AssertFileContent("public/s1/p2/index.html", + `<a href="/a.txt">500</a>`, + `<a href="/s1/p2/b.txt">600</a>`, + ) +} |