Fix fragments being AbsUrlified in final html
authorNoah Campbell <noahcampbell@gmail.com>
Wed, 18 Sep 2013 22:48:36 +0000 (15:48 -0700)
committerNoah Campbell <noahcampbell@gmail.com>
Wed, 18 Sep 2013 22:48:36 +0000 (15:48 -0700)
Found that fragments were getting the BaseURL applied creating a proper
anchor url and redirecting off the page.

hugolib/site_test.go
transform/post.go

index 5d74c911e477ff2edc08e236bc30f262b9f4938d..a096b3cbf2c0c7829b0d3b590e9dde45befb635c 100644 (file)
@@ -248,10 +248,14 @@ func TestSkipRender(t *testing.T) {
 func TestAbsUrlify(t *testing.T) {
        files := make(map[string][]byte)
        target := &InMemoryTarget{files: files}
+       sources := []byteSource{
+               {"sect/doc1.html", []byte("<!doctype html><html><head></head><body><a href=\"#frag1\">link</a></body></html>")},
+               {"content/blue/doc2.html", []byte("---\nf: t\n---\n<!doctype html><html><body>more content</body></html>")},
+       }
        s := &Site{
                Target: target,
                Config: Config{BaseUrl: "http://auth/bub/"},
-               Source: &inMemorySource{urlFakeSource},
+               Source: &inMemorySource{sources},
        }
        s.initializeSiteInfo()
        s.prepTemplates()
@@ -269,13 +273,22 @@ func TestAbsUrlify(t *testing.T) {
                t.Fatalf("Unable to render pages. %s", err)
        }
 
-       content, ok := target.files["content/blue/slug-doc-1.html"]
+       tests := []struct {
+               file, expected string
+       }{
+               {"content/blue/doc2.html", "<html><head></head><body><a href=\"http://auth/bub/foobar.jpg\">Going</a></body></html>"},
+               {"sect/doc1.html", "<!DOCTYPE html><html><head></head><body><a href=\"#frag1\">link</a></body></html>"},
+       }
+
+       for _, test := range tests {
+       content, ok := target.files[test.file]
        if !ok {
-               t.Fatalf("Unable to locate rendered content")
+               t.Fatalf("Unable to locate rendered content: %s", test.file)
        }
 
-       expected := "<html><head></head><body><a href=\"http://auth/bub/foobar.jpg\">Going</a></body></html>"
+       expected := test.expected
        if string(content) != expected {
                t.Errorf("AbsUrlify content expected:\n%q\ngot\n%q", expected, string(content))
        }
 }
+}
index 369b2d6cac86cbe9bcb970bcfa10311b37692870..be383700d118b331151bb5c968f67f6e498ea0af 100644 (file)
@@ -39,6 +39,9 @@ func (t *Transformer) absUrlify(tr *htmltran.Transformer, selectors ...elattr) (
                if inURL, err = url.Parse(in); err != nil {
                        return in + "?"
                }
+               if fragmentOnly(inURL) {
+                       return in
+               }
                return baseURL.ResolveReference(inURL).String()
        }
 
@@ -50,3 +53,7 @@ func (t *Transformer) absUrlify(tr *htmltran.Transformer, selectors ...elattr) (
 
        return
 }
+
+func fragmentOnly(u *url.URL) bool {
+       return u.Fragment != "" && u.Scheme == "" && u.Opaque == "" && u.User == nil && u.Host == "" && u.Path == "" && u.Path == "" && u.RawQuery == ""
+}