Allow URL with extension in frontmatter
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sat, 5 Mar 2016 19:18:17 +0000 (20:18 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Sat, 5 Mar 2016 19:50:53 +0000 (20:50 +0100)
Fixes #1923

hugolib/site.go
hugolib/site_test.go

index 1d5f0c498fc353f7c3189fefa03722388c8754a1..326f25f8cc82da2c287ee74c6597bcfc82627207 100644 (file)
@@ -45,6 +45,7 @@ import (
        "github.com/spf13/nitro"
        "github.com/spf13/viper"
        "gopkg.in/fsnotify.v1"
+       "path"
 )
 
 var _ = transform.AbsURL
@@ -90,9 +91,10 @@ type Site struct {
 }
 
 type targetList struct {
-       Page  target.Output
-       File  target.Output
-       Alias target.AliasPublisher
+       Page     target.Output
+       PageUgly target.Output
+       File     target.Output
+       Alias    target.AliasPublisher
 }
 
 type SiteInfo struct {
@@ -1937,6 +1939,16 @@ func (s *Site) renderAndWritePage(name string, dest string, d interface{}, layou
        outBuffer := bp.GetBuffer()
        defer bp.PutBuffer(outBuffer)
 
+       var pageTarget target.Output
+
+       if p, ok := d.(*Page); ok && path.Ext(p.URL) != "" {
+               // user has explicitly set a URL with extension for this page
+               // make sure it sticks even if "ugly URLs" are turned off.
+               pageTarget = s.PageUglyTarget()
+       } else {
+               pageTarget = s.PageTarget()
+       }
+
        transformLinks := transform.NewEmptyTransforms()
 
        if viper.GetBool("RelativeURLs") || viper.GetBool("CanonifyURLs") {
@@ -1950,7 +1962,7 @@ func (s *Site) renderAndWritePage(name string, dest string, d interface{}, layou
        var path []byte
 
        if viper.GetBool("RelativeURLs") {
-               translated, err := s.PageTarget().(target.OptionalTranslator).TranslateRelative(dest)
+               translated, err := pageTarget.(target.OptionalTranslator).TranslateRelative(dest)
                if err != nil {
                        return err
                }
@@ -1981,7 +1993,7 @@ func (s *Site) renderAndWritePage(name string, dest string, d interface{}, layou
        }
 
        if err == nil {
-               if err = s.WriteDestPage(dest, outBuffer); err != nil {
+               if err = s.WriteDestPage(dest, pageTarget, outBuffer); err != nil {
                        return err
                }
        }
@@ -2033,6 +2045,11 @@ func (s *Site) PageTarget() target.Output {
        return s.Targets.Page
 }
 
+func (s *Site) PageUglyTarget() target.Output {
+       s.initTargetList()
+       return s.Targets.PageUgly
+}
+
 func (s *Site) FileTarget() target.Output {
        s.initTargetList()
        return s.Targets.File
@@ -2051,6 +2068,12 @@ func (s *Site) initTargetList() {
                                UglyURLs:   viper.GetBool("UglyURLs"),
                        }
                }
+               if s.Targets.PageUgly == nil {
+                       s.Targets.PageUgly = &target.PagePub{
+                               PublishDir: s.absPublishDir(),
+                               UglyURLs:   true,
+                       }
+               }
                if s.Targets.File == nil {
                        s.Targets.File = &target.Filesystem{
                                PublishDir: s.absPublishDir(),
@@ -2069,9 +2092,9 @@ func (s *Site) WriteDestFile(path string, reader io.Reader) (err error) {
        return s.FileTarget().Publish(path, reader)
 }
 
-func (s *Site) WriteDestPage(path string, reader io.Reader) (err error) {
+func (s *Site) WriteDestPage(path string, target target.Output, reader io.Reader) (err error) {
        jww.DEBUG.Println("creating page:", path)
-       return s.PageTarget().Publish(path, reader)
+       return target.Publish(path, reader)
 }
 
 func (s *Site) WriteDestAlias(path string, permalink string) (err error) {
index 482e2f791cbbd65e4698be0fc1a387e70d14c129..66b58aa3309530f23c5d7c42cfd0406f20ba2e11 100644 (file)
@@ -419,14 +419,15 @@ THE END.`, refShortcode))},
 }
 
 // Issue #939
-func Test404ShouldAlwaysHaveUglyURLs(t *testing.T) {
+// Issue #1923
+func TestShouldAlwaysHaveUglyURLs(t *testing.T) {
        hugofs.DestinationFS = new(afero.MemMapFs)
        for _, uglyURLs := range []bool{true, false} {
-               doTest404ShouldAlwaysHaveUglyURLs(t, uglyURLs)
+               doTestShouldAlwaysHaveUglyURLs(t, uglyURLs)
        }
 }
 
-func doTest404ShouldAlwaysHaveUglyURLs(t *testing.T, uglyURLs bool) {
+func doTestShouldAlwaysHaveUglyURLs(t *testing.T, uglyURLs bool) {
        viper.Reset()
        defer viper.Reset()
 
@@ -436,11 +437,15 @@ func doTest404ShouldAlwaysHaveUglyURLs(t *testing.T, uglyURLs bool) {
        viper.Set("DisableSitemap", false)
        viper.Set("DisableRSS", false)
        viper.Set("RSSUri", "index.xml")
+       viper.Set("blackfriday",
+               map[string]interface{}{
+                       "plainIDAnchors": true})
 
        viper.Set("UglyURLs", uglyURLs)
 
        sources := []source.ByteSource{
-               {filepath.FromSlash("sect/doc1.html"), []byte("---\nmarkup: markdown\n---\n# title\nsome *content*")},
+               {filepath.FromSlash("sect/doc1.md"), []byte("---\nmarkup: markdown\n---\n# title\nsome *content*")},
+               {filepath.FromSlash("sect/doc2.md"), []byte("---\nurl: /ugly.html\nmarkup: markdown\n---\n# title\ndoc2 *content*")},
        }
 
        s := &Site{
@@ -475,10 +480,12 @@ func doTest404ShouldAlwaysHaveUglyURLs(t *testing.T, uglyURLs bool) {
                expected string
        }{
                {filepath.FromSlash("index.html"), "Home Sweet Home. IsHome=true"},
-               {filepath.FromSlash(expectedPagePath), "\n\n<h1 id=\"title:5d74edbb89ef198cd37882b687940cda\">title</h1>\n\n<p>some <em>content</em></p>\n IsHome=false"},
+               {filepath.FromSlash(expectedPagePath), "\n\n<h1 id=\"title\">title</h1>\n\n<p>some <em>content</em></p>\n IsHome=false"},
                {filepath.FromSlash("404.html"), "Page Not Found. IsHome=false"},
                {filepath.FromSlash("index.xml"), "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>\n<root>RSS</root>"},
                {filepath.FromSlash("sitemap.xml"), "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>\n<root>SITEMAP</root>"},
+               // Issue #1923
+               {filepath.FromSlash("ugly.html"), "\n\n<h1 id=\"title\">title</h1>\n\n<p>doc2 <em>content</em></p>\n IsHome=false"},
        }
 
        for _, p := range s.Pages {