shithub: hugo

Download patch

ref: 784077da4dcc3476f61bbf99c5f873b71694dd64
parent: 311e10222301d47422f970c460383879ad78f681
author: Noah Campbell <[email protected]>
date: Wed Sep 18 11:48:36 EDT 2013

Fix fragments being AbsUrlified in final html

Found that fragments were getting the BaseURL applied creating a proper
anchor url and redirecting off the page.

--- a/hugolib/site_test.go
+++ b/hugolib/site_test.go
@@ -248,10 +248,14 @@
 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 @@
 		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))
 	}
+}
 }
--- a/transform/post.go
+++ b/transform/post.go
@@ -39,6 +39,9 @@
 		if inURL, err = url.Parse(in); err != nil {
 			return in + "?"
 		}
+		if fragmentOnly(inURL) {
+			return in
+		}
 		return baseURL.ResolveReference(inURL).String()
 	}
 
@@ -49,4 +52,8 @@
 	}
 
 	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 == ""
 }