diff options
author | Bjørn Erik Pedersen <[email protected]> | 2018-01-10 10:20:08 +0100 |
---|---|---|
committer | Bjørn Erik Pedersen <[email protected]> | 2018-01-10 18:23:41 +0100 |
commit | f0eecc6a4f541838e9930c98bc982546f65c7a4f (patch) | |
tree | c5d1b91d9a6201857bb20a6226a85aac09596db2 /resource | |
parent | 768ec5df9fa8f91610ee80a9e6194f94a7dbe117 (diff) | |
download | hugo-f0eecc6a4f541838e9930c98bc982546f65c7a4f.tar.gz hugo-f0eecc6a4f541838e9930c98bc982546f65c7a4f.zip |
Fix non-ASCII path handling for Page resources
Fixes #4241
Diffstat (limited to 'resource')
-rw-r--r-- | resource/image.go | 8 | ||||
-rw-r--r-- | resource/resource.go | 41 |
2 files changed, 27 insertions, 22 deletions
diff --git a/resource/image.go b/resource/image.go index 678a78ad7..191aaf84c 100644 --- a/resource/image.go +++ b/resource/image.go @@ -185,7 +185,7 @@ type imageConfig struct { } func (i *Image) isJPEG() bool { - name := strings.ToLower(i.rel) + name := strings.ToLower(i.relTargetPath) return strings.HasSuffix(name, ".jpg") || strings.HasSuffix(name, ".jpeg") } @@ -206,7 +206,7 @@ func (i *Image) doWithImageConfig(action, spec string, f func(src image.Image, c conf.Filter = imageFilters[conf.FilterStr] } - key := i.relPermalinkForRel(i.filenameFromConfig(conf), false) + key := i.relTargetPathForRel(i.filenameFromConfig(conf), false) return i.spec.imageCache.getOrCreate(i.spec, key, func(resourceCacheFilename string) (*Image, error) { ci := i.clone() @@ -521,11 +521,11 @@ func (i *Image) clone() *Image { } func (i *Image) setBasePath(conf imageConfig) { - i.rel = i.filenameFromConfig(conf) + i.relTargetPath = i.filenameFromConfig(conf) } func (i *Image) filenameFromConfig(conf imageConfig) string { - p1, p2 := helpers.FileAndExt(i.rel) + p1, p2 := helpers.FileAndExt(i.relTargetPath) idStr := fmt.Sprintf("_hu%s_%d", i.hash, i.osFileInfo.Size()) // Do not change for no good reason. diff --git a/resource/resource.go b/resource/resource.go index 3c4007d81..6bb02c0b1 100644 --- a/resource/resource.go +++ b/resource/resource.go @@ -112,15 +112,16 @@ func NewSpec(s *helpers.PathSpec, mimeTypes media.Types) (*Spec, error) { } func (r *Spec) NewResourceFromFile( - linker func(base string) string, + targetPathBuilder func(base string) string, absPublishDir string, file source.File, relTargetFilename string) (Resource, error) { - return r.newResource(linker, absPublishDir, file.Filename(), file.FileInfo(), relTargetFilename) + return r.newResource(targetPathBuilder, absPublishDir, file.Filename(), file.FileInfo(), relTargetFilename) } +// p.s.PathSpec.URLizeFilename func (r *Spec) NewResourceFromFilename( - linker func(base string) string, + targetPathBuilder func(base string) string, absPublishDir, absSourceFilename, relTargetFilename string) (Resource, error) { @@ -128,11 +129,11 @@ func (r *Spec) NewResourceFromFilename( if err != nil { return nil, err } - return r.newResource(linker, absPublishDir, absSourceFilename, fi, relTargetFilename) + return r.newResource(targetPathBuilder, absPublishDir, absSourceFilename, fi, relTargetFilename) } func (r *Spec) newResource( - linker func(base string) string, + targetPathBuilder func(base string) string, absPublishDir, absSourceFilename string, fi os.FileInfo, relTargetFilename string) (Resource, error) { @@ -150,7 +151,7 @@ func (r *Spec) newResource( } } - gr := r.newGenericResource(linker, fi, absPublishDir, absSourceFilename, filepath.ToSlash(relTargetFilename), mimeType) + gr := r.newGenericResource(targetPathBuilder, fi, absPublishDir, absSourceFilename, filepath.ToSlash(relTargetFilename), mimeType) if mimeType == "image" { f, err := r.Fs.Source.Open(absSourceFilename) @@ -203,7 +204,7 @@ func (r *Spec) CacheStats() string { // genericResource represents a generic linkable resource. type genericResource struct { // The relative path to this resource. - rel string + relTargetPath string // Base is set when the output format's path has a offset, e.g. for AMP. base string @@ -214,16 +215,16 @@ type genericResource struct { resourceType string osFileInfo os.FileInfo - spec *Spec - link func(rel string) string + spec *Spec + targetPathBuilder func(rel string) string } func (l *genericResource) Permalink() string { - return l.spec.PermalinkForBaseURL(l.relPermalinkForRel(l.rel, false), l.spec.BaseURL.String()) + return l.spec.PermalinkForBaseURL(l.relPermalinkForRel(l.relTargetPath, false), l.spec.BaseURL.String()) } func (l *genericResource) RelPermalink() string { - return l.relPermalinkForRel(l.rel, true) + return l.relPermalinkForRel(l.relTargetPath, true) } // Implement the Cloner interface. @@ -233,8 +234,12 @@ func (l genericResource) WithNewBase(base string) Resource { } func (l *genericResource) relPermalinkForRel(rel string, addBasePath bool) string { - if l.link != nil { - rel = l.link(rel) + return l.spec.PathSpec.URLizeFilename(l.relTargetPathForRel(rel, addBasePath)) +} + +func (l *genericResource) relTargetPathForRel(rel string, addBasePath bool) string { + if l.targetPathBuilder != nil { + rel = l.targetPathBuilder(rel) } if l.base != "" { @@ -249,7 +254,7 @@ func (l *genericResource) relPermalinkForRel(rel string, addBasePath bool) strin rel = "/" + rel } - return l.spec.PathSpec.URLizeFilename(rel) + return rel } func (l *genericResource) ResourceType() string { @@ -273,7 +278,7 @@ func (l *genericResource) Publish() error { } func (l *genericResource) target() string { - target := l.relPermalinkForRel(l.rel, false) + target := l.relTargetPathForRel(l.relTargetPath, false) if l.spec.PathSpec.Languages.IsMultihost() { target = path.Join(l.spec.PathSpec.Language.Lang, target) } @@ -281,7 +286,7 @@ func (l *genericResource) target() string { } func (r *Spec) newGenericResource( - linker func(base string) string, + targetPathBuilder func(base string) string, osFileInfo os.FileInfo, absPublishDir, absSourceFilename, @@ -289,11 +294,11 @@ func (r *Spec) newGenericResource( resourceType string) *genericResource { return &genericResource{ - link: linker, + targetPathBuilder: targetPathBuilder, osFileInfo: osFileInfo, absPublishDir: absPublishDir, absSourceFilename: absSourceFilename, - rel: baseFilename, + relTargetPath: baseFilename, resourceType: resourceType, spec: r, } |