hugolib: Fix ref/relref anhcor handling
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 6 Nov 2019 08:20:59 +0000 (09:20 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Wed, 6 Nov 2019 08:29:38 +0000 (09:29 +0100)
Fixes #6481

hugolib/shortcode_test.go
hugolib/site.go

index 36f0042534a371e57111cb940fad6d8ff6af6f91..614b8f0604935f95af173c7bac82c8487bf9f4f7 100644 (file)
@@ -16,9 +16,10 @@ package hugolib
 import (
        "fmt"
        "path/filepath"
-
        "reflect"
 
+       "github.com/spf13/viper"
+
        "github.com/gohugoio/hugo/parser/pageparser"
        "github.com/gohugoio/hugo/resources/page"
 
@@ -1195,3 +1196,65 @@ Get: {{ printf "%v (%T)" $b1 $b1 | safeHTML }}
                "types string: - 0: true (string) - 1: trues (string) - 2: 33 (string) - 3: 3.14 (string) ",
        )
 }
+
+func TestShortcodeRef(t *testing.T) {
+       for _, plainIDAnchors := range []bool{false, true} {
+               plainIDAnchors := plainIDAnchors
+               t.Run(fmt.Sprintf("plainIDAnchors=%t", plainIDAnchors), func(t *testing.T) {
+                       t.Parallel()
+
+                       v := viper.New()
+                       v.Set("baseURL", "https://example.org")
+                       v.Set("blackfriday", map[string]interface{}{
+                               "plainIDAnchors": plainIDAnchors,
+                       })
+
+                       builder := newTestSitesBuilder(t).WithViper(v)
+
+                       for i := 1; i <= 2; i++ {
+                               builder.WithContent(fmt.Sprintf("page%d.md", i), `---
+title: "Hugo Rocks!"
+---
+
+
+
+[Page 1]({{< ref "page1.md" >}})
+[Page 1 with anchor]({{< relref "page1.md#doc" >}})
+[Page 2]({{< ref "page2.md" >}})
+[Page 2 with anchor]({{< relref "page2.md#doc" >}})
+
+
+## Doc
+
+
+`)
+                       }
+
+                       builder.Build(BuildCfg{})
+
+                       if plainIDAnchors {
+                               builder.AssertFileContent("public/page2/index.html",
+                                       `
+<a href="/page1/#doc">Page 1 with anchor</a>
+<a href="https://example.org/page2/">Page 2</a>
+<a href="/page2/#doc">Page 2 with anchor</a></p>
+
+<h2 id="doc">Doc</h2>
+`,
+                               )
+                       } else {
+                               builder.AssertFileContent("public/page2/index.html",
+                                       `
+<p><a href="https://example.org/page1/">Page 1</a>
+<a href="/page1/#doc:45ca767ba77bc1445a0acab74f80812f">Page 1 with anchor</a>
+<a href="https://example.org/page2/">Page 2</a>
+<a href="/page2/#doc:8e3cdf52fa21e33270c99433820e46bd">Page 2 with anchor</a></p>
+<h2 id="doc:8e3cdf52fa21e33270c99433820e46bd">Doc</h2>
+`,
+                               )
+                       }
+
+               })
+       }
+
+}
index fb5dee46b8540b997fb4ab42bbe8334da03499c5..b9ec6422408a28943befa4b1048db520554f3f0c 100644 (file)
@@ -719,12 +719,12 @@ func (s *siteRefLinker) refLink(ref string, source interface{}, relative bool, o
        var link string
 
        if refURL.Path != "" {
-               target, err := s.s.getPageNew(p, refURL.Path)
+               var err error
+               target, err = s.s.getPageNew(p, refURL.Path)
                var pos text.Position
                if err != nil || target == nil {
                        if p, ok := source.(text.Positioner); ok {
                                pos = p.Position()
-
                        }
                }
 
@@ -758,8 +758,8 @@ func (s *siteRefLinker) refLink(ref string, source interface{}, relative bool, o
        }
 
        if refURL.Fragment != "" {
-               _ = target
                link = link + "#" + refURL.Fragment
+
                if pctx, ok := target.(pageContext); ok && !target.File().IsZero() && !pctx.getRenderingConfig().PlainIDAnchors {
                        if refURL.Path != "" {
                                link = link + ":" + target.File().UniqueID()