init.go (2399B)
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 time 15 16 import ( 17 "errors" 18 19 "github.com/gohugoio/hugo/deps" 20 "github.com/gohugoio/hugo/langs" 21 "github.com/gohugoio/hugo/tpl/internal" 22 ) 23 24 const name = "time" 25 26 func init() { 27 f := func(d *deps.Deps) *internal.TemplateFuncsNamespace { 28 if d.Language == nil { 29 panic("Language must be set") 30 } 31 ctx := New(langs.GetTimeFormatter(d.Language), langs.GetLocation(d.Language)) 32 33 ns := &internal.TemplateFuncsNamespace{ 34 Name: name, 35 Context: func(args ...any) (any, error) { 36 // Handle overlapping "time" namespace and func. 37 // 38 // If no args are passed to `time`, assume namespace usage and 39 // return namespace context. 40 // 41 // If args are passed, call AsTime(). 42 43 switch len(args) { 44 case 0: 45 return ctx, nil 46 case 1: 47 return ctx.AsTime(args[0]) 48 case 2: 49 return ctx.AsTime(args[0], args[1]) 50 51 // 3 or more arguments. Currently not supported. 52 default: 53 return nil, errors.New("Invalid arguments supplied to `time`. Refer to time documentation: https://gohugo.io/functions/time/") 54 } 55 }, 56 } 57 58 ns.AddMethodMapping(ctx.Format, 59 []string{"dateFormat"}, 60 [][2]string{ 61 {`dateFormat: {{ dateFormat "Monday, Jan 2, 2006" "2015-01-21" }}`, `dateFormat: Wednesday, Jan 21, 2015`}, 62 }, 63 ) 64 65 ns.AddMethodMapping(ctx.Now, 66 []string{"now"}, 67 [][2]string{}, 68 ) 69 70 ns.AddMethodMapping(ctx.AsTime, 71 nil, 72 [][2]string{ 73 {`{{ (time "2015-01-21").Year }}`, `2015`}, 74 }, 75 ) 76 77 ns.AddMethodMapping(ctx.Duration, 78 []string{"duration"}, 79 [][2]string{ 80 {`{{ mul 60 60 | duration "second" }}`, `1h0m0s`}, 81 }, 82 ) 83 84 ns.AddMethodMapping(ctx.ParseDuration, 85 nil, 86 [][2]string{ 87 {`{{ "1h12m10s" | time.ParseDuration }}`, `1h12m10s`}, 88 }, 89 ) 90 91 return ns 92 } 93 94 internal.AddTemplateFuncsNamespace(f) 95 }