Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/gohugoio/hugo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2018-04-19 10:02:18 +0300
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2018-04-19 17:23:00 +0300
commit47c05c47e0b663632a649ee5d256acc1a32fe9e4 (patch)
treec4cc45e6f7f950bf6e4f779e544a76db68aab9c7 /resource
parente590cc26eb1363a4b84603f051b20bd43fd1f7bd (diff)
Add language merge support for Pages in resource.Resources
Fixes #4644
Diffstat (limited to 'resource')
-rw-r--r--resource/resource.go49
1 files changed, 45 insertions, 4 deletions
diff --git a/resource/resource.go b/resource/resource.go
index 12e1160cf..e92706803 100644
--- a/resource/resource.go
+++ b/resource/resource.go
@@ -34,10 +34,11 @@ import (
)
var (
- _ Resource = (*genericResource)(nil)
- _ metaAssigner = (*genericResource)(nil)
- _ Source = (*genericResource)(nil)
- _ Cloner = (*genericResource)(nil)
+ _ Resource = (*genericResource)(nil)
+ _ metaAssigner = (*genericResource)(nil)
+ _ Source = (*genericResource)(nil)
+ _ Cloner = (*genericResource)(nil)
+ _ ResourcesLanguageMerger = (*Resources)(nil)
)
const DefaultResourceType = "unknown"
@@ -97,6 +98,16 @@ type Resource interface {
Content() (interface{}, error)
}
+type ResourcesLanguageMerger interface {
+ MergeByLanguage(other Resources) Resources
+ // Needed for integration with the tpl package.
+ MergeByLanguageInterface(other interface{}) (interface{}, error)
+}
+
+type translatedResource interface {
+ TranslationKey() string
+}
+
// Resources represents a slice of resources, which can be a mix of different types.
// I.e. both pages and images etc.
type Resources []Resource
@@ -222,6 +233,36 @@ func getGlob(pattern string) (glob.Glob, error) {
}
+// MergeByLanguage adds missing translations in r1 from r2.
+func (r1 Resources) MergeByLanguage(r2 Resources) Resources {
+ result := append(Resources(nil), r1...)
+ m := make(map[string]bool)
+ for _, r := range r1 {
+ if translated, ok := r.(translatedResource); ok {
+ m[translated.TranslationKey()] = true
+ }
+ }
+
+ for _, r := range r2 {
+ if translated, ok := r.(translatedResource); ok {
+ if _, found := m[translated.TranslationKey()]; !found {
+ result = append(result, r)
+ }
+ }
+ }
+ return result
+}
+
+// MergeByLanguageInterface is the generic version of MergeByLanguage. It
+// is here just so it can be called from the tpl package.
+func (r1 Resources) MergeByLanguageInterface(in interface{}) (interface{}, error) {
+ r2, ok := in.(Resources)
+ if !ok {
+ return nil, fmt.Errorf("%T cannot be merged by language", in)
+ }
+ return r1.MergeByLanguage(r2), nil
+}
+
type Spec struct {
*helpers.PathSpec