ref: 27f8d8f9631a94c090dfdadcf3e38d2c5e389a4d
parent: 3c100cc32c49c80a2b45020b4305360782bf2a4c
author: Bjørn Erik Pedersen <[email protected]>
date: Sat Mar 5 15:18:17 EST 2016
Allow URL with extension in frontmatter Fixes #1923
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -45,6 +45,7 @@
"github.com/spf13/nitro"
"github.com/spf13/viper"
"gopkg.in/fsnotify.v1"
+ "path"
)
var _ = transform.AbsURL
@@ -90,9 +91,10 @@
}
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 @@
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 @@
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 @@
}
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 @@
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 @@
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 @@
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) {
--- a/hugolib/site_test.go
+++ b/hugolib/site_test.go
@@ -419,14 +419,15 @@
}
// 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 @@
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 @@
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 {