diff --git a/tpl/debug/debug.go b/tpl/debug/debug.go new file mode 100644 index 000000000..693b97adc --- /dev/null +++ b/tpl/debug/debug.go @@ -0,0 +1,40 @@ +// Copyright 2020 The Hugo Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package debug provides template functions to help debugging templates. +package debug + +import ( + "github.com/sanity-io/litter" + + "github.com/gohugoio/hugo/deps" +) + +// New returns a new instance of the debug-namespaced template functions. +func New(d *deps.Deps) *Namespace { + return &Namespace{} +} + +// Namespace provides template functions for the "debug" namespace. +type Namespace struct { +} + +// Dump returns a object dump of val as a string. +// Note that not every value passed to Dump will print so nicely, but +// we'll improve on that. We recommend using the "go" Chroma lexer to format the output +// nicely. +// Also note that the output from Dump may change from Hugo version to the next, +// so don't depend on a specific output. +func (ns *Namespace) Dump(val interface{}) string { + return litter.Sdump(val) +} diff --git a/tpl/debug/init.go b/tpl/debug/init.go new file mode 100644 index 000000000..e478fb46d --- /dev/null +++ b/tpl/debug/init.go @@ -0,0 +1,45 @@ +// Copyright 2020 The Hugo Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package debug + +import ( + "github.com/gohugoio/hugo/deps" + "github.com/gohugoio/hugo/tpl/internal" +) + +const name = "debug" + +func init() { + f := func(d *deps.Deps) *internal.TemplateFuncsNamespace { + ctx := New(d) + + ns := &internal.TemplateFuncsNamespace{ + Name: name, + Context: func(args ...interface{}) interface{} { return ctx }, + } + + ns.AddMethodMapping(ctx.Dump, + nil, + [][2]string{ + {`{{- $m := newScratch -}} +{{- $m.Set "Hugo" "Rocks!" -}} +{{- $m.Values | debug.Dump | safeHTML -}}`, "map[string]interface {}{\n \"Hugo\": \"Rocks!\",\n}"}, + }, + ) + + return ns + } + + internal.AddTemplateFuncsNamespace(f) +} diff --git a/tpl/debug/init_test.go b/tpl/debug/init_test.go new file mode 100644 index 000000000..35c6a193e --- /dev/null +++ b/tpl/debug/init_test.go @@ -0,0 +1,42 @@ +// Copyright 2020 The Hugo Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package debug + +import ( + "testing" + + "github.com/gohugoio/hugo/htesting/hqt" + + qt "github.com/frankban/quicktest" + "github.com/gohugoio/hugo/common/loggers" + "github.com/gohugoio/hugo/deps" + "github.com/gohugoio/hugo/tpl/internal" +) + +func TestInit(t *testing.T) { + c := qt.New(t) + var found bool + var ns *internal.TemplateFuncsNamespace + + for _, nsf := range internal.TemplateFuncsNamespaceRegistry { + ns = nsf(&deps.Deps{Log: loggers.NewErrorLogger()}) + if ns.Name == name { + found = true + break + } + } + + c.Assert(found, qt.Equals, true) + c.Assert(ns.Context(), hqt.IsSameType, &Namespace{}) +} diff --git a/tpl/tplimpl/template_funcs.go b/tpl/tplimpl/template_funcs.go index 88869940d..ccf33d8ba 100644 --- a/tpl/tplimpl/template_funcs.go +++ b/tpl/tplimpl/template_funcs.go @@ -36,6 +36,7 @@ import ( _ "github.com/gohugoio/hugo/tpl/compare" _ "github.com/gohugoio/hugo/tpl/crypto" _ "github.com/gohugoio/hugo/tpl/data" + _ "github.com/gohugoio/hugo/tpl/debug" _ "github.com/gohugoio/hugo/tpl/encoding" _ "github.com/gohugoio/hugo/tpl/fmt" _ "github.com/gohugoio/hugo/tpl/hugo"