@bookshop/hugo-engine 3.3.2 → 3.4.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.nyc_output/{396c364e-fec4-4f27-9ff2-8b236061ef8f.json → 0f70a16f-6a79-48c7-8b16-3b4665e247b2.json} +0 -0
- package/.nyc_output/{4ef43740-059b-4329-96cd-0643fd8fe8d8.json → 6285d5fa-be3d-49e4-8f2f-82157d95dcd8.json} +0 -0
- package/.nyc_output/{656275f4-66d6-4d27-bfab-c2f7a3087670.json → 8b5e1314-6e86-4197-a3ae-3c40e4c2f39e.json} +0 -0
- package/.nyc_output/{6aec5420-0b83-4260-b300-4d595dfd0660.json → c5490eb0-70c0-468f-a43f-e58c75dd34c8.json} +0 -0
- package/.nyc_output/{874bd79b-45da-4726-9afc-1f6cab44be1f.json → ee1a9bec-d318-4aea-af93-7269debcf6df.json} +0 -0
- package/.nyc_output/processinfo/{396c364e-fec4-4f27-9ff2-8b236061ef8f.json → 0f70a16f-6a79-48c7-8b16-3b4665e247b2.json} +1 -1
- package/.nyc_output/processinfo/6285d5fa-be3d-49e4-8f2f-82157d95dcd8.json +1 -0
- package/.nyc_output/processinfo/{4ef43740-059b-4329-96cd-0643fd8fe8d8.json → 8b5e1314-6e86-4197-a3ae-3c40e4c2f39e.json} +1 -1
- package/.nyc_output/processinfo/{656275f4-66d6-4d27-bfab-c2f7a3087670.json → c5490eb0-70c0-468f-a43f-e58c75dd34c8.json} +1 -1
- package/.nyc_output/processinfo/{874bd79b-45da-4726-9afc-1f6cab44be1f.json → ee1a9bec-d318-4aea-af93-7269debcf6df.json} +1 -1
- package/.nyc_output/processinfo/index.json +1 -1
- package/bookshop-hugo-templates/bookshop.html +56 -0
- package/bookshop-hugo-templates/bookshop_bindings.html +29 -0
- package/bookshop-hugo-templates/bookshop_component_browser.html +30 -0
- package/bookshop-hugo-templates/bookshop_partial.html +42 -0
- package/bookshop-hugo-templates/bookshop_scss.html +9 -0
- package/bookshop-hugo-templates/errors/bad_bookshop_tag.html +39 -0
- package/bookshop-hugo-templates/errors/err.html +6 -0
- package/bookshop-hugo-templates/helpers/component.html +25 -0
- package/bookshop-hugo-templates/helpers/component_key.html +11 -0
- package/bookshop-hugo-templates/helpers/partial.html +25 -0
- package/bookshop-hugo-templates/helpers/partial_key.html +9 -0
- package/full-hugo-renderer/build.sh +34 -0
- package/full-hugo-renderer/go.mod +87 -0
- package/{hugo-renderer → full-hugo-renderer}/go.sum +204 -12
- package/full-hugo-renderer/hugo_renderer.wasm +0 -0
- package/full-hugo-renderer/hugo_renderer.wasm.gz +0 -0
- package/full-hugo-renderer/main.go +215 -0
- package/{hugo-renderer → full-hugo-renderer}/wasm_exec.js +6 -2
- package/lib/builder.js +2 -2
- package/lib/engine.js +109 -42
- package/lib/hugoIdentifierParser.js +5 -0
- package/lib/translateTextTemplate.js +3 -0
- package/lib/translateTextTemplate.test.js +22 -16
- package/package.json +4 -4
- package/.nyc_output/processinfo/6aec5420-0b83-4260-b300-4d595dfd0660.json +0 -1
- package/hugo-renderer/build.sh +0 -66
- package/hugo-renderer/deps/bookshop_modified_deps.go +0 -6
- package/hugo-renderer/go.mod +0 -19
- package/hugo-renderer/helpers/bookshop_modified_content.go +0 -98
- package/hugo-renderer/helpers/bookshop_modified_general.go +0 -33
- package/hugo-renderer/helpers/emoji.go +0 -96
- package/hugo-renderer/hugo_renderer.wasm +0 -0
- package/hugo-renderer/hugo_renderer.wasm.gz +0 -0
- package/hugo-renderer/main.go +0 -42
- package/hugo-renderer/tpl/bookshop_engine/bookshop_func_importer.go +0 -35
- package/hugo-renderer/tpl/bookshop_engine/bookshop_render.go +0 -64
- package/hugo-renderer/tpl/bookshop_library/bookshop_components.go +0 -129
- package/hugo-renderer/tpl/bookshop_library/bookshop_data.go +0 -53
- package/hugo-renderer/tpl/cast/cast.go +0 -63
- package/hugo-renderer/tpl/cast/init.go +0 -57
- package/hugo-renderer/tpl/collections/append.go +0 -37
- package/hugo-renderer/tpl/collections/apply.go +0 -131
- package/hugo-renderer/tpl/collections/collections.go +0 -768
- package/hugo-renderer/tpl/collections/complement.go +0 -55
- package/hugo-renderer/tpl/collections/index.go +0 -133
- package/hugo-renderer/tpl/collections/init.go +0 -214
- package/hugo-renderer/tpl/collections/merge.go +0 -126
- package/hugo-renderer/tpl/collections/reflect_helpers.go +0 -216
- package/hugo-renderer/tpl/collections/sort.go +0 -183
- package/hugo-renderer/tpl/collections/symdiff.go +0 -68
- package/hugo-renderer/tpl/collections/where.go +0 -517
- package/hugo-renderer/tpl/compare/compare.go +0 -324
- package/hugo-renderer/tpl/compare/init.go +0 -85
- package/hugo-renderer/tpl/crypto/crypto.go +0 -109
- package/hugo-renderer/tpl/crypto/init.go +0 -65
- package/hugo-renderer/tpl/debug/debug.go +0 -40
- package/hugo-renderer/tpl/debug/init.go +0 -45
- package/hugo-renderer/tpl/encoding/encoding.go +0 -90
- package/hugo-renderer/tpl/encoding/init.go +0 -59
- package/hugo-renderer/tpl/fmt/fmt.go +0 -66
- package/hugo-renderer/tpl/fmt/init.go +0 -77
- package/hugo-renderer/tpl/inflect/inflect.go +0 -79
- package/hugo-renderer/tpl/inflect/init.go +0 -60
- package/hugo-renderer/tpl/internal/bookshop_modified_templatefuncsRegistry.go +0 -88
- package/hugo-renderer/tpl/math/init.go +0 -134
- package/hugo-renderer/tpl/math/math.go +0 -164
- package/hugo-renderer/tpl/math/round.go +0 -61
- package/hugo-renderer/tpl/partials/init.go +0 -55
- package/hugo-renderer/tpl/partials/partials.go +0 -88
- package/hugo-renderer/tpl/path/init.go +0 -60
- package/hugo-renderer/tpl/path/path.go +0 -159
- package/hugo-renderer/tpl/reflect/init.go +0 -51
- package/hugo-renderer/tpl/reflect/reflect.go +0 -36
- package/hugo-renderer/tpl/safe/init.go +0 -80
- package/hugo-renderer/tpl/safe/safe.go +0 -72
- package/hugo-renderer/tpl/site/bookshop_site.go +0 -67
- package/hugo-renderer/tpl/site/init.go +0 -41
- package/hugo-renderer/tpl/strings/init.go +0 -229
- package/hugo-renderer/tpl/strings/regexp.go +0 -125
- package/hugo-renderer/tpl/strings/strings.go +0 -500
- package/hugo-renderer/tpl/strings/truncate.go +0 -157
- package/hugo-renderer/tpl/transform/bookshop_unmarshal.go +0 -39
- package/hugo-renderer/tpl/transform/init.go +0 -113
- package/hugo-renderer/tpl/transform/transform.go +0 -116
- package/hugo-renderer/update-from-hugo.sh +0 -19
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
// Copyright 2017 The Hugo Authors. All rights reserved.
|
|
2
|
-
//
|
|
3
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
// you may not use this file except in compliance with the License.
|
|
5
|
-
// You may obtain a copy of the License at
|
|
6
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
-
//
|
|
8
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
9
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
10
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
-
// See the License for the specific language governing permissions and
|
|
12
|
-
// limitations under the License.
|
|
13
|
-
|
|
14
|
-
package collections
|
|
15
|
-
|
|
16
|
-
import (
|
|
17
|
-
"fmt"
|
|
18
|
-
"reflect"
|
|
19
|
-
"time"
|
|
20
|
-
|
|
21
|
-
"github.com/mitchellh/hashstructure"
|
|
22
|
-
"github.com/pkg/errors"
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
var (
|
|
26
|
-
zero reflect.Value
|
|
27
|
-
errorType = reflect.TypeOf((*error)(nil)).Elem()
|
|
28
|
-
timeType = reflect.TypeOf((*time.Time)(nil)).Elem()
|
|
29
|
-
)
|
|
30
|
-
|
|
31
|
-
func numberToFloat(v reflect.Value) (float64, error) {
|
|
32
|
-
switch kind := v.Kind(); {
|
|
33
|
-
case isFloat(kind):
|
|
34
|
-
return v.Float(), nil
|
|
35
|
-
case isInt(kind):
|
|
36
|
-
return float64(v.Int()), nil
|
|
37
|
-
case isUint(kind):
|
|
38
|
-
return float64(v.Uint()), nil
|
|
39
|
-
case kind == reflect.Interface:
|
|
40
|
-
return numberToFloat(v.Elem())
|
|
41
|
-
default:
|
|
42
|
-
return 0, fmt.Errorf("invalid kind %s in numberToFloat", kind)
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
// normalizes different numeric types if isNumber
|
|
47
|
-
// or get the hash values if not Comparable (such as map or struct)
|
|
48
|
-
// to make them comparable
|
|
49
|
-
func normalize(v reflect.Value) interface{} {
|
|
50
|
-
k := v.Kind()
|
|
51
|
-
|
|
52
|
-
switch {
|
|
53
|
-
case !v.Type().Comparable():
|
|
54
|
-
h, err := hashstructure.Hash(v.Interface(), nil)
|
|
55
|
-
if err != nil {
|
|
56
|
-
panic(err)
|
|
57
|
-
}
|
|
58
|
-
return h
|
|
59
|
-
case isNumber(k):
|
|
60
|
-
f, err := numberToFloat(v)
|
|
61
|
-
if err == nil {
|
|
62
|
-
return f
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return v.Interface()
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// collects identities from the slices in seqs into a set. Numeric values are normalized,
|
|
69
|
-
// pointers unwrapped.
|
|
70
|
-
func collectIdentities(seqs ...interface{}) (map[interface{}]bool, error) {
|
|
71
|
-
seen := make(map[interface{}]bool)
|
|
72
|
-
for _, seq := range seqs {
|
|
73
|
-
v := reflect.ValueOf(seq)
|
|
74
|
-
switch v.Kind() {
|
|
75
|
-
case reflect.Array, reflect.Slice:
|
|
76
|
-
for i := 0; i < v.Len(); i++ {
|
|
77
|
-
ev, _ := indirectInterface(v.Index(i))
|
|
78
|
-
|
|
79
|
-
if !ev.Type().Comparable() {
|
|
80
|
-
return nil, errors.New("elements must be comparable")
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
seen[normalize(ev)] = true
|
|
84
|
-
}
|
|
85
|
-
default:
|
|
86
|
-
return nil, fmt.Errorf("arguments must be slices or arrays")
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return seen, nil
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// We have some different numeric and string types that we try to behave like
|
|
94
|
-
// they were the same.
|
|
95
|
-
func convertValue(v reflect.Value, to reflect.Type) (reflect.Value, error) {
|
|
96
|
-
if v.Type().AssignableTo(to) {
|
|
97
|
-
return v, nil
|
|
98
|
-
}
|
|
99
|
-
switch kind := to.Kind(); {
|
|
100
|
-
case kind == reflect.String:
|
|
101
|
-
s, err := toString(v)
|
|
102
|
-
return reflect.ValueOf(s), err
|
|
103
|
-
case isNumber(kind):
|
|
104
|
-
return convertNumber(v, kind)
|
|
105
|
-
default:
|
|
106
|
-
return reflect.Value{}, errors.Errorf("%s is not assignable to %s", v.Type(), to)
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
// There are potential overflows in this function, but the downconversion of
|
|
111
|
-
// int64 etc. into int8 etc. is coming from the synthetic unit tests for Union etc.
|
|
112
|
-
// TODO(bep) We should consider normalizing the slices to int64 etc.
|
|
113
|
-
func convertNumber(v reflect.Value, to reflect.Kind) (reflect.Value, error) {
|
|
114
|
-
var n reflect.Value
|
|
115
|
-
if isFloat(to) {
|
|
116
|
-
f, err := toFloat(v)
|
|
117
|
-
if err != nil {
|
|
118
|
-
return n, err
|
|
119
|
-
}
|
|
120
|
-
switch to {
|
|
121
|
-
case reflect.Float32:
|
|
122
|
-
n = reflect.ValueOf(float32(f))
|
|
123
|
-
default:
|
|
124
|
-
n = reflect.ValueOf(float64(f))
|
|
125
|
-
}
|
|
126
|
-
} else if isInt(to) {
|
|
127
|
-
i, err := toInt(v)
|
|
128
|
-
if err != nil {
|
|
129
|
-
return n, err
|
|
130
|
-
}
|
|
131
|
-
switch to {
|
|
132
|
-
case reflect.Int:
|
|
133
|
-
n = reflect.ValueOf(int(i))
|
|
134
|
-
case reflect.Int8:
|
|
135
|
-
n = reflect.ValueOf(int8(i))
|
|
136
|
-
case reflect.Int16:
|
|
137
|
-
n = reflect.ValueOf(int16(i))
|
|
138
|
-
case reflect.Int32:
|
|
139
|
-
n = reflect.ValueOf(int32(i))
|
|
140
|
-
case reflect.Int64:
|
|
141
|
-
n = reflect.ValueOf(int64(i))
|
|
142
|
-
}
|
|
143
|
-
} else if isUint(to) {
|
|
144
|
-
i, err := toUint(v)
|
|
145
|
-
if err != nil {
|
|
146
|
-
return n, err
|
|
147
|
-
}
|
|
148
|
-
switch to {
|
|
149
|
-
case reflect.Uint:
|
|
150
|
-
n = reflect.ValueOf(uint(i))
|
|
151
|
-
case reflect.Uint8:
|
|
152
|
-
n = reflect.ValueOf(uint8(i))
|
|
153
|
-
case reflect.Uint16:
|
|
154
|
-
n = reflect.ValueOf(uint16(i))
|
|
155
|
-
case reflect.Uint32:
|
|
156
|
-
n = reflect.ValueOf(uint32(i))
|
|
157
|
-
case reflect.Uint64:
|
|
158
|
-
n = reflect.ValueOf(uint64(i))
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
if !n.IsValid() {
|
|
164
|
-
return n, errors.New("invalid values")
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return n, nil
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
func newSliceElement(items interface{}) interface{} {
|
|
171
|
-
tp := reflect.TypeOf(items)
|
|
172
|
-
if tp == nil {
|
|
173
|
-
return nil
|
|
174
|
-
}
|
|
175
|
-
switch tp.Kind() {
|
|
176
|
-
case reflect.Array, reflect.Slice:
|
|
177
|
-
tp = tp.Elem()
|
|
178
|
-
if tp.Kind() == reflect.Ptr {
|
|
179
|
-
tp = tp.Elem()
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
return reflect.New(tp).Interface()
|
|
183
|
-
}
|
|
184
|
-
return nil
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
func isNumber(kind reflect.Kind) bool {
|
|
188
|
-
return isInt(kind) || isUint(kind) || isFloat(kind)
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
func isInt(kind reflect.Kind) bool {
|
|
192
|
-
switch kind {
|
|
193
|
-
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
194
|
-
return true
|
|
195
|
-
default:
|
|
196
|
-
return false
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
func isUint(kind reflect.Kind) bool {
|
|
201
|
-
switch kind {
|
|
202
|
-
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
|
|
203
|
-
return true
|
|
204
|
-
default:
|
|
205
|
-
return false
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
func isFloat(kind reflect.Kind) bool {
|
|
210
|
-
switch kind {
|
|
211
|
-
case reflect.Float32, reflect.Float64:
|
|
212
|
-
return true
|
|
213
|
-
default:
|
|
214
|
-
return false
|
|
215
|
-
}
|
|
216
|
-
}
|
|
@@ -1,183 +0,0 @@
|
|
|
1
|
-
// Copyright 2017 The Hugo Authors. All rights reserved.
|
|
2
|
-
//
|
|
3
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
// you may not use this file except in compliance with the License.
|
|
5
|
-
// You may obtain a copy of the License at
|
|
6
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
-
//
|
|
8
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
9
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
10
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
-
// See the License for the specific language governing permissions and
|
|
12
|
-
// limitations under the License.
|
|
13
|
-
|
|
14
|
-
package collections
|
|
15
|
-
|
|
16
|
-
import (
|
|
17
|
-
"errors"
|
|
18
|
-
"reflect"
|
|
19
|
-
"sort"
|
|
20
|
-
"strings"
|
|
21
|
-
|
|
22
|
-
"hugo-renderer/tpl/compare"
|
|
23
|
-
|
|
24
|
-
"github.com/gohugoio/hugo/common/maps"
|
|
25
|
-
"github.com/spf13/cast"
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
var sortComp = compare.New(true)
|
|
29
|
-
|
|
30
|
-
// Sort returns a sorted sequence.
|
|
31
|
-
func (ns *Namespace) Sort(seq interface{}, args ...interface{}) (interface{}, error) {
|
|
32
|
-
if seq == nil {
|
|
33
|
-
return nil, errors.New("sequence must be provided")
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
seqv, isNil := indirect(reflect.ValueOf(seq))
|
|
37
|
-
if isNil {
|
|
38
|
-
return nil, errors.New("can't iterate over a nil value")
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
var sliceType reflect.Type
|
|
42
|
-
switch seqv.Kind() {
|
|
43
|
-
case reflect.Array, reflect.Slice:
|
|
44
|
-
sliceType = seqv.Type()
|
|
45
|
-
case reflect.Map:
|
|
46
|
-
sliceType = reflect.SliceOf(seqv.Type().Elem())
|
|
47
|
-
default:
|
|
48
|
-
return nil, errors.New("can't sort " + reflect.ValueOf(seq).Type().String())
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Create a list of pairs that will be used to do the sort
|
|
52
|
-
p := pairList{SortAsc: true, SliceType: sliceType}
|
|
53
|
-
p.Pairs = make([]pair, seqv.Len())
|
|
54
|
-
|
|
55
|
-
var sortByField string
|
|
56
|
-
for i, l := range args {
|
|
57
|
-
dStr, err := cast.ToStringE(l)
|
|
58
|
-
switch {
|
|
59
|
-
case i == 0 && err != nil:
|
|
60
|
-
sortByField = ""
|
|
61
|
-
case i == 0 && err == nil:
|
|
62
|
-
sortByField = dStr
|
|
63
|
-
case i == 1 && err == nil && dStr == "desc":
|
|
64
|
-
p.SortAsc = false
|
|
65
|
-
case i == 1:
|
|
66
|
-
p.SortAsc = true
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
path := strings.Split(strings.Trim(sortByField, "."), ".")
|
|
70
|
-
|
|
71
|
-
switch seqv.Kind() {
|
|
72
|
-
case reflect.Array, reflect.Slice:
|
|
73
|
-
for i := 0; i < seqv.Len(); i++ {
|
|
74
|
-
p.Pairs[i].Value = seqv.Index(i)
|
|
75
|
-
if sortByField == "" || sortByField == "value" {
|
|
76
|
-
p.Pairs[i].Key = p.Pairs[i].Value
|
|
77
|
-
} else {
|
|
78
|
-
v := p.Pairs[i].Value
|
|
79
|
-
var err error
|
|
80
|
-
for i, elemName := range path {
|
|
81
|
-
v, err = evaluateSubElem(v, elemName)
|
|
82
|
-
if err != nil {
|
|
83
|
-
return nil, err
|
|
84
|
-
}
|
|
85
|
-
if !v.IsValid() {
|
|
86
|
-
continue
|
|
87
|
-
}
|
|
88
|
-
// Special handling of lower cased maps.
|
|
89
|
-
if params, ok := v.Interface().(maps.Params); ok {
|
|
90
|
-
v = reflect.ValueOf(params.Get(path[i+1:]...))
|
|
91
|
-
break
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
p.Pairs[i].Key = v
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
case reflect.Map:
|
|
99
|
-
keys := seqv.MapKeys()
|
|
100
|
-
for i := 0; i < seqv.Len(); i++ {
|
|
101
|
-
p.Pairs[i].Value = seqv.MapIndex(keys[i])
|
|
102
|
-
|
|
103
|
-
if sortByField == "" {
|
|
104
|
-
p.Pairs[i].Key = keys[i]
|
|
105
|
-
} else if sortByField == "value" {
|
|
106
|
-
p.Pairs[i].Key = p.Pairs[i].Value
|
|
107
|
-
} else {
|
|
108
|
-
v := p.Pairs[i].Value
|
|
109
|
-
var err error
|
|
110
|
-
for i, elemName := range path {
|
|
111
|
-
v, err = evaluateSubElem(v, elemName)
|
|
112
|
-
if err != nil {
|
|
113
|
-
return nil, err
|
|
114
|
-
}
|
|
115
|
-
if !v.IsValid() {
|
|
116
|
-
continue
|
|
117
|
-
}
|
|
118
|
-
// Special handling of lower cased maps.
|
|
119
|
-
if params, ok := v.Interface().(maps.Params); ok {
|
|
120
|
-
v = reflect.ValueOf(params.Get(path[i+1:]...))
|
|
121
|
-
break
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
p.Pairs[i].Key = v
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
return p.sort(), nil
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// Credit for pair sorting method goes to Andrew Gerrand
|
|
132
|
-
// https://groups.google.com/forum/#!topic/golang-nuts/FT7cjmcL7gw
|
|
133
|
-
// A data structure to hold a key/value pair.
|
|
134
|
-
type pair struct {
|
|
135
|
-
Key reflect.Value
|
|
136
|
-
Value reflect.Value
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
// A slice of pairs that implements sort.Interface to sort by Value.
|
|
140
|
-
type pairList struct {
|
|
141
|
-
Pairs []pair
|
|
142
|
-
SortAsc bool
|
|
143
|
-
SliceType reflect.Type
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
func (p pairList) Swap(i, j int) { p.Pairs[i], p.Pairs[j] = p.Pairs[j], p.Pairs[i] }
|
|
147
|
-
func (p pairList) Len() int { return len(p.Pairs) }
|
|
148
|
-
func (p pairList) Less(i, j int) bool {
|
|
149
|
-
iv := p.Pairs[i].Key
|
|
150
|
-
jv := p.Pairs[j].Key
|
|
151
|
-
|
|
152
|
-
if iv.IsValid() {
|
|
153
|
-
if jv.IsValid() {
|
|
154
|
-
// can only call Interface() on valid reflect Values
|
|
155
|
-
return sortComp.Lt(iv.Interface(), jv.Interface())
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// if j is invalid, test i against i's zero value
|
|
159
|
-
return sortComp.Lt(iv.Interface(), reflect.Zero(iv.Type()))
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
if jv.IsValid() {
|
|
163
|
-
// if i is invalid, test j against j's zero value
|
|
164
|
-
return sortComp.Lt(reflect.Zero(jv.Type()), jv.Interface())
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return false
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// sorts a pairList and returns a slice of sorted values
|
|
171
|
-
func (p pairList) sort() interface{} {
|
|
172
|
-
if p.SortAsc {
|
|
173
|
-
sort.Sort(p)
|
|
174
|
-
} else {
|
|
175
|
-
sort.Sort(sort.Reverse(p))
|
|
176
|
-
}
|
|
177
|
-
sorted := reflect.MakeSlice(p.SliceType, len(p.Pairs), len(p.Pairs))
|
|
178
|
-
for i, v := range p.Pairs {
|
|
179
|
-
sorted.Index(i).Set(v.Value)
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
return sorted.Interface()
|
|
183
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
// Copyright 2018 The Hugo Authors. All rights reserved.
|
|
2
|
-
//
|
|
3
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
// you may not use this file except in compliance with the License.
|
|
5
|
-
// You may obtain a copy of the License at
|
|
6
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
-
//
|
|
8
|
-
// Unless required by applicable law or agreed to in writing, software
|
|
9
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
10
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
11
|
-
// See the License for the specific language governing permissions and
|
|
12
|
-
// limitations under the License.
|
|
13
|
-
|
|
14
|
-
package collections
|
|
15
|
-
|
|
16
|
-
import (
|
|
17
|
-
"fmt"
|
|
18
|
-
"reflect"
|
|
19
|
-
|
|
20
|
-
"github.com/pkg/errors"
|
|
21
|
-
)
|
|
22
|
-
|
|
23
|
-
// SymDiff returns the symmetric difference of s1 and s2.
|
|
24
|
-
// Arguments must be either a slice or an array of comparable types.
|
|
25
|
-
func (ns *Namespace) SymDiff(s2, s1 interface{}) (interface{}, error) {
|
|
26
|
-
ids1, err := collectIdentities(s1)
|
|
27
|
-
if err != nil {
|
|
28
|
-
return nil, err
|
|
29
|
-
}
|
|
30
|
-
ids2, err := collectIdentities(s2)
|
|
31
|
-
if err != nil {
|
|
32
|
-
return nil, err
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
var slice reflect.Value
|
|
36
|
-
var sliceElemType reflect.Type
|
|
37
|
-
|
|
38
|
-
for i, s := range []interface{}{s1, s2} {
|
|
39
|
-
v := reflect.ValueOf(s)
|
|
40
|
-
|
|
41
|
-
switch v.Kind() {
|
|
42
|
-
case reflect.Array, reflect.Slice:
|
|
43
|
-
if i == 0 {
|
|
44
|
-
sliceType := v.Type()
|
|
45
|
-
sliceElemType = sliceType.Elem()
|
|
46
|
-
slice = reflect.MakeSlice(sliceType, 0, 0)
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
for i := 0; i < v.Len(); i++ {
|
|
50
|
-
ev, _ := indirectInterface(v.Index(i))
|
|
51
|
-
key := normalize(ev)
|
|
52
|
-
|
|
53
|
-
// Append if the key is not in their intersection.
|
|
54
|
-
if ids1[key] != ids2[key] {
|
|
55
|
-
v, err := convertValue(ev, sliceElemType)
|
|
56
|
-
if err != nil {
|
|
57
|
-
return nil, errors.WithMessage(err, "symdiff: failed to convert value")
|
|
58
|
-
}
|
|
59
|
-
slice = reflect.Append(slice, v)
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
default:
|
|
63
|
-
return nil, fmt.Errorf("arguments to symdiff must be slices or arrays")
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
return slice.Interface(), nil
|
|
68
|
-
}
|