init.go (4931B)
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 strings
15
16 import (
17 "github.com/gohugoio/hugo/deps"
18 "github.com/gohugoio/hugo/tpl/internal"
19 )
20
21 const name = "strings"
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.Chomp,
33 []string{"chomp"},
34 [][2]string{
35 {`{{chomp "<p>Blockhead</p>\n" | safeHTML }}`, `<p>Blockhead</p>`},
36 },
37 )
38
39 ns.AddMethodMapping(ctx.CountRunes,
40 []string{"countrunes"},
41 [][2]string{},
42 )
43
44 ns.AddMethodMapping(ctx.RuneCount,
45 nil,
46 [][2]string{},
47 )
48
49 ns.AddMethodMapping(ctx.CountWords,
50 []string{"countwords"},
51 [][2]string{},
52 )
53
54 ns.AddMethodMapping(ctx.Count,
55 nil,
56 [][2]string{
57 {`{{"aabab" | strings.Count "a" }}`, `3`},
58 },
59 )
60
61 ns.AddMethodMapping(ctx.Contains,
62 nil,
63 [][2]string{
64 {`{{ strings.Contains "abc" "b" }}`, `true`},
65 {`{{ strings.Contains "abc" "d" }}`, `false`},
66 },
67 )
68
69 ns.AddMethodMapping(ctx.ContainsAny,
70 nil,
71 [][2]string{
72 {`{{ strings.ContainsAny "abc" "bcd" }}`, `true`},
73 {`{{ strings.ContainsAny "abc" "def" }}`, `false`},
74 },
75 )
76
77 ns.AddMethodMapping(ctx.FindRE,
78 []string{"findRE"},
79 [][2]string{
80 {
81 `{{ findRE "[G|g]o" "Hugo is a static side generator written in Go." "1" }}`,
82 `[go]`,
83 },
84 },
85 )
86
87 ns.AddMethodMapping(ctx.HasPrefix,
88 []string{"hasPrefix"},
89 [][2]string{
90 {`{{ hasPrefix "Hugo" "Hu" }}`, `true`},
91 {`{{ hasPrefix "Hugo" "Fu" }}`, `false`},
92 },
93 )
94
95 ns.AddMethodMapping(ctx.ToLower,
96 []string{"lower"},
97 [][2]string{
98 {`{{lower "BatMan"}}`, `batman`},
99 },
100 )
101
102 ns.AddMethodMapping(ctx.Replace,
103 []string{"replace"},
104 [][2]string{
105 {
106 `{{ replace "Batman and Robin" "Robin" "Catwoman" }}`,
107 `Batman and Catwoman`,
108 },
109 {
110 `{{ replace "aabbaabb" "a" "z" 2 }}`,
111 `zzbbaabb`,
112 },
113 },
114 )
115
116 ns.AddMethodMapping(ctx.ReplaceRE,
117 []string{"replaceRE"},
118 [][2]string{
119 {
120 `{{ replaceRE "a+b" "X" "aabbaabbab" }}`,
121 `XbXbX`,
122 },
123 {
124 `{{ replaceRE "a+b" "X" "aabbaabbab" 1 }}`,
125 `Xbaabbab`,
126 },
127 },
128 )
129
130 ns.AddMethodMapping(ctx.SliceString,
131 []string{"slicestr"},
132 [][2]string{
133 {`{{slicestr "BatMan" 0 3}}`, `Bat`},
134 {`{{slicestr "BatMan" 3}}`, `Man`},
135 },
136 )
137
138 ns.AddMethodMapping(ctx.Split,
139 []string{"split"},
140 [][2]string{},
141 )
142
143 ns.AddMethodMapping(ctx.Substr,
144 []string{"substr"},
145 [][2]string{
146 {`{{substr "BatMan" 0 -3}}`, `Bat`},
147 {`{{substr "BatMan" 3 3}}`, `Man`},
148 },
149 )
150
151 ns.AddMethodMapping(ctx.Trim,
152 []string{"trim"},
153 [][2]string{
154 {`{{ trim "++Batman--" "+-" }}`, `Batman`},
155 },
156 )
157
158 ns.AddMethodMapping(ctx.TrimLeft,
159 nil,
160 [][2]string{
161 {`{{ "aabbaa" | strings.TrimLeft "a" }}`, `bbaa`},
162 },
163 )
164
165 ns.AddMethodMapping(ctx.TrimPrefix,
166 nil,
167 [][2]string{
168 {`{{ "aabbaa" | strings.TrimPrefix "a" }}`, `abbaa`},
169 {`{{ "aabbaa" | strings.TrimPrefix "aa" }}`, `bbaa`},
170 },
171 )
172
173 ns.AddMethodMapping(ctx.TrimRight,
174 nil,
175 [][2]string{
176 {`{{ "aabbaa" | strings.TrimRight "a" }}`, `aabb`},
177 },
178 )
179
180 ns.AddMethodMapping(ctx.TrimSuffix,
181 nil,
182 [][2]string{
183 {`{{ "aabbaa" | strings.TrimSuffix "a" }}`, `aabba`},
184 {`{{ "aabbaa" | strings.TrimSuffix "aa" }}`, `aabb`},
185 },
186 )
187
188 ns.AddMethodMapping(ctx.Title,
189 []string{"title"},
190 [][2]string{
191 {`{{title "Bat man"}}`, `Bat Man`},
192 {`{{title "somewhere over the rainbow"}}`, `Somewhere Over the Rainbow`},
193 },
194 )
195
196 ns.AddMethodMapping(ctx.FirstUpper,
197 nil,
198 [][2]string{
199 {`{{ "hugo rocks!" | strings.FirstUpper }}`, `Hugo rocks!`},
200 },
201 )
202
203 ns.AddMethodMapping(ctx.Truncate,
204 []string{"truncate"},
205 [][2]string{
206 {`{{ "this is a very long text" | truncate 10 " ..." }}`, `this is a ...`},
207 {`{{ "With [Markdown](/markdown) inside." | markdownify | truncate 14 }}`, `With <a href="/markdown">Markdown …</a>`},
208 },
209 )
210
211 ns.AddMethodMapping(ctx.Repeat,
212 nil,
213 [][2]string{
214 {`{{ "yo" | strings.Repeat 4 }}`, `yoyoyoyo`},
215 },
216 )
217
218 ns.AddMethodMapping(ctx.ToUpper,
219 []string{"upper"},
220 [][2]string{
221 {`{{upper "BatMan"}}`, `BATMAN`},
222 },
223 )
224
225 return ns
226 }
227
228 internal.AddTemplateFuncsNamespace(f)
229 }