init.go (4915B)
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 "github.com/gohugoio/hugo/deps" 18 "github.com/gohugoio/hugo/tpl/internal" 19 ) 20 21 const name = "collections" 22 23 func init() { 24 f := func(d *deps.Deps) *internal.TemplateFuncsNamespace { 25 ctx := New(d) 26 27 ns := &internal.TemplateFuncsNamespace{ 28 Name: name, 29 Context: func(args ...any) (any, error) { return ctx, nil }, 30 } 31 32 ns.AddMethodMapping(ctx.After, 33 []string{"after"}, 34 [][2]string{}, 35 ) 36 37 ns.AddMethodMapping(ctx.Apply, 38 []string{"apply"}, 39 [][2]string{}, 40 ) 41 42 ns.AddMethodMapping(ctx.Complement, 43 []string{"complement"}, 44 [][2]string{ 45 {`{{ slice "a" "b" "c" "d" "e" "f" | complement (slice "b" "c") (slice "d" "e") }}`, `[a f]`}, 46 }, 47 ) 48 49 ns.AddMethodMapping(ctx.SymDiff, 50 []string{"symdiff"}, 51 [][2]string{ 52 {`{{ slice 1 2 3 | symdiff (slice 3 4) }}`, `[1 2 4]`}, 53 }, 54 ) 55 56 ns.AddMethodMapping(ctx.Delimit, 57 []string{"delimit"}, 58 [][2]string{ 59 {`{{ delimit (slice "A" "B" "C") ", " " and " }}`, `A, B and C`}, 60 }, 61 ) 62 63 ns.AddMethodMapping(ctx.Dictionary, 64 []string{"dict"}, 65 [][2]string{}, 66 ) 67 68 ns.AddMethodMapping(ctx.EchoParam, 69 []string{"echoParam"}, 70 [][2]string{ 71 {`{{ echoParam .Params "langCode" }}`, `en`}, 72 }, 73 ) 74 75 ns.AddMethodMapping(ctx.First, 76 []string{"first"}, 77 [][2]string{}, 78 ) 79 80 ns.AddMethodMapping(ctx.KeyVals, 81 []string{"keyVals"}, 82 [][2]string{ 83 {`{{ keyVals "key" "a" "b" }}`, `key: [a b]`}, 84 }, 85 ) 86 87 ns.AddMethodMapping(ctx.In, 88 []string{"in"}, 89 [][2]string{ 90 {`{{ if in "this string contains a substring" "substring" }}Substring found!{{ end }}`, `Substring found!`}, 91 }, 92 ) 93 94 ns.AddMethodMapping(ctx.Index, 95 []string{"index"}, 96 [][2]string{}, 97 ) 98 99 ns.AddMethodMapping(ctx.Intersect, 100 []string{"intersect"}, 101 [][2]string{}, 102 ) 103 104 ns.AddMethodMapping(ctx.IsSet, 105 []string{"isSet", "isset"}, 106 [][2]string{}, 107 ) 108 109 ns.AddMethodMapping(ctx.Last, 110 []string{"last"}, 111 [][2]string{}, 112 ) 113 114 ns.AddMethodMapping(ctx.Querify, 115 []string{"querify"}, 116 [][2]string{ 117 { 118 `{{ (querify "foo" 1 "bar" 2 "baz" "with spaces" "qux" "this&that=those") | safeHTML }}`, 119 `bar=2&baz=with+spaces&foo=1&qux=this%26that%3Dthose`, 120 }, 121 { 122 `<a href="https://www.google.com?{{ (querify "q" "test" "page" 3) | safeURL }}">Search</a>`, 123 `<a href="https://www.google.com?page=3&q=test">Search</a>`, 124 }, 125 { 126 `{{ slice "foo" 1 "bar" 2 | querify | safeHTML }}`, 127 `bar=2&foo=1`, 128 }, 129 }, 130 ) 131 132 ns.AddMethodMapping(ctx.Shuffle, 133 []string{"shuffle"}, 134 [][2]string{}, 135 ) 136 137 ns.AddMethodMapping(ctx.Slice, 138 []string{"slice"}, 139 [][2]string{ 140 {`{{ slice "B" "C" "A" | sort }}`, `[A B C]`}, 141 }, 142 ) 143 144 ns.AddMethodMapping(ctx.Sort, 145 []string{"sort"}, 146 [][2]string{}, 147 ) 148 149 ns.AddMethodMapping(ctx.Union, 150 []string{"union"}, 151 [][2]string{ 152 {`{{ union (slice 1 2 3) (slice 3 4 5) }}`, `[1 2 3 4 5]`}, 153 }, 154 ) 155 156 ns.AddMethodMapping(ctx.Where, 157 []string{"where"}, 158 [][2]string{}, 159 ) 160 161 ns.AddMethodMapping(ctx.Append, 162 []string{"append"}, 163 [][2]string{}, 164 ) 165 166 ns.AddMethodMapping(ctx.Group, 167 []string{"group"}, 168 [][2]string{}, 169 ) 170 171 ns.AddMethodMapping(ctx.Seq, 172 []string{"seq"}, 173 [][2]string{ 174 {`{{ seq 3 }}`, `[1 2 3]`}, 175 }, 176 ) 177 178 ns.AddMethodMapping(ctx.NewScratch, 179 []string{"newScratch"}, 180 [][2]string{ 181 {`{{ $scratch := newScratch }}{{ $scratch.Add "b" 2 }}{{ $scratch.Add "b" 2 }}{{ $scratch.Get "b" }}`, `4`}, 182 }, 183 ) 184 185 ns.AddMethodMapping(ctx.Uniq, 186 []string{"uniq"}, 187 [][2]string{ 188 {`{{ slice 1 2 3 2 | uniq }}`, `[1 2 3]`}, 189 }, 190 ) 191 192 ns.AddMethodMapping(ctx.Merge, 193 []string{"merge"}, 194 [][2]string{ 195 { 196 `{{ dict "title" "Hugo Rocks!" | collections.Merge (dict "title" "Default Title" "description" "Yes, Hugo Rocks!") | sort }}`, 197 `[Yes, Hugo Rocks! Hugo Rocks!]`, 198 }, 199 { 200 `{{ merge (dict "title" "Default Title" "description" "Yes, Hugo Rocks!") (dict "title" "Hugo Rocks!") | sort }}`, 201 `[Yes, Hugo Rocks! Hugo Rocks!]`, 202 }, 203 { 204 `{{ merge (dict "title" "Default Title" "description" "Yes, Hugo Rocks!") (dict "title" "Hugo Rocks!") (dict "extra" "For reals!") | sort }}`, 205 `[Yes, Hugo Rocks! For reals! Hugo Rocks!]`, 206 }, 207 }, 208 ) 209 210 return ns 211 } 212 213 internal.AddTemplateFuncsNamespace(f) 214 }