From 0ba19c57f180c33b41c64335ea1d1c89335d34c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Tue, 31 Jul 2018 11:35:38 +0200 Subject: [PATCH] tpl/partials: Add templates.Exists Fixes #5010 --- tpl/templates/init.go | 44 +++++++++++++++++++++++++++++++++++ tpl/templates/init_test.go | 38 ++++++++++++++++++++++++++++++ tpl/templates/templates.go | 39 +++++++++++++++++++++++++++++++ tpl/tplimpl/template_funcs.go | 1 + 4 files changed, 122 insertions(+) create mode 100644 tpl/templates/init.go create mode 100644 tpl/templates/init_test.go create mode 100644 tpl/templates/templates.go diff --git a/tpl/templates/init.go b/tpl/templates/init.go new file mode 100644 index 000000000..a68809e65 --- /dev/null +++ b/tpl/templates/init.go @@ -0,0 +1,44 @@ +// Copyright 2018 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 partials + +import ( + "github.com/gohugoio/hugo/deps" + "github.com/gohugoio/hugo/tpl/internal" +) + +const name = "templates" + +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.Exists, + nil, + [][2]string{{`{{ if (templates.Exists "partials/header.html") }}Yes!{{ end }}`, `Yes!`}, + {`{{ if not (templates.Exists "partials/doesnotexist.html") }}No!{{ end }}`, `No!`}, + }, + ) + + return ns + + } + + internal.AddTemplateFuncsNamespace(f) +} diff --git a/tpl/templates/init_test.go b/tpl/templates/init_test.go new file mode 100644 index 000000000..d833cddc1 --- /dev/null +++ b/tpl/templates/init_test.go @@ -0,0 +1,38 @@ +// Copyright 2018 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 partials + +import ( + "testing" + + "github.com/gohugoio/hugo/deps" + "github.com/gohugoio/hugo/tpl/internal" + "github.com/stretchr/testify/require" +) + +func TestInit(t *testing.T) { + var found bool + var ns *internal.TemplateFuncsNamespace + + for _, nsf := range internal.TemplateFuncsNamespaceRegistry { + ns = nsf(&deps.Deps{}) + if ns.Name == name { + found = true + break + } + } + + require.True(t, found) + require.IsType(t, &Namespace{}, ns.Context()) +} diff --git a/tpl/templates/templates.go b/tpl/templates/templates.go new file mode 100644 index 000000000..7a69e28a6 --- /dev/null +++ b/tpl/templates/templates.go @@ -0,0 +1,39 @@ +// Copyright 2018 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 partials + +import ( + "github.com/gohugoio/hugo/deps" +) + +// New returns a new instance of the templates-namespaced template functions. +func New(deps *deps.Deps) *Namespace { + return &Namespace{ + deps: deps, + } +} + +// Namespace provides template functions for the "templates" namespace. +type Namespace struct { + deps *deps.Deps +} + +// Exists returns whether the template with the given name exists. +// Note that this is the Unix-styled relative path including filename suffix, +// e.g. partials/header.html +func (ns *Namespace) Exists(name string) bool { + _, found := ns.deps.Tmpl.Lookup(name) + return found + +} diff --git a/tpl/tplimpl/template_funcs.go b/tpl/tplimpl/template_funcs.go index f1ed7f36f..27ffcd97a 100644 --- a/tpl/tplimpl/template_funcs.go +++ b/tpl/tplimpl/template_funcs.go @@ -40,6 +40,7 @@ import ( _ "github.com/gohugoio/hugo/tpl/resources" _ "github.com/gohugoio/hugo/tpl/safe" _ "github.com/gohugoio/hugo/tpl/strings" + _ "github.com/gohugoio/hugo/tpl/templates" _ "github.com/gohugoio/hugo/tpl/time" _ "github.com/gohugoio/hugo/tpl/transform" _ "github.com/gohugoio/hugo/tpl/urls"