diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2022-02-17 15:04:00 +0300 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2022-02-24 20:59:50 +0300 |
commit | 08fdca9d9365eaf1e496a12e2af5e18617bd0e66 (patch) | |
tree | 6c6942d1b74a4160d93a997860bafd52b92025f5 /tpl | |
parent | 2c20f5bc00b604e72b3b7e401fbdbf9447fe3470 (diff) |
Add Markdown diagrams and render hooks for code blocks
You can now create custom hook templates for code blocks, either one for all (`render-codeblock.html`) or for a given code language (e.g. `render-codeblock-go.html`).
We also used this new hook to add support for diagrams in Hugo:
* Goat (Go ASCII Tool) is built-in and enabled by default; just create a fenced code block with the language `goat` and start draw your Ascii diagrams.
* Another popular alternative for diagrams in Markdown, Mermaid (supported by GitHub), can also be implemented with a simple template. See the Hugo documentation for more information.
Updates #7765
Closes #9538
Fixes #9553
Fixes #8520
Fixes #6702
Fixes #9558
Diffstat (limited to 'tpl')
37 files changed, 328 insertions, 1451 deletions
diff --git a/tpl/cast/init_test.go b/tpl/cast/init_test.go deleted file mode 100644 index 5eb4a9086..000000000 --- a/tpl/cast/init_test.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2017 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 cast - -import ( - "testing" - - "github.com/gohugoio/hugo/htesting/hqt" - - qt "github.com/frankban/quicktest" - "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{}) - if ns.Name == name { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) -} diff --git a/tpl/collections/init_test.go b/tpl/collections/init_test.go deleted file mode 100644 index 570e58d93..000000000 --- a/tpl/collections/init_test.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2017 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 collections - -import ( - "testing" - - "github.com/gohugoio/hugo/htesting/hqt" - - qt "github.com/frankban/quicktest" - "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{}) - if ns.Name == name { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) -} diff --git a/tpl/compare/init.go b/tpl/compare/init.go index 9aa533f55..f423f615e 100644 --- a/tpl/compare/init.go +++ b/tpl/compare/init.go @@ -40,14 +40,14 @@ func init() { ns.AddMethodMapping(ctx.Eq, []string{"eq"}, [][2]string{ - {`{{ if eq .Section "blog" }}current{{ end }}`, `current`}, + {`{{ if eq .Section "blog" }}current-section{{ end }}`, `current-section`}, }, ) ns.AddMethodMapping(ctx.Ge, []string{"ge"}, [][2]string{ - {`{{ if ge .Hugo.Version "0.36" }}Reasonable new Hugo version!{{ end }}`, `Reasonable new Hugo version!`}, + {`{{ if ge hugo.Version "0.80" }}Reasonable new Hugo version!{{ end }}`, `Reasonable new Hugo version!`}, }, ) diff --git a/tpl/compare/init_test.go b/tpl/compare/init_test.go deleted file mode 100644 index 8698cb5e3..000000000 --- a/tpl/compare/init_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2017 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 compare - -import ( - "testing" - - qt "github.com/frankban/quicktest" - "github.com/gohugoio/hugo/deps" - "github.com/gohugoio/hugo/htesting/hqt" - "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{}) - if ns.Name == name { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) -} diff --git a/tpl/crypto/init_test.go b/tpl/crypto/init_test.go deleted file mode 100644 index 1c200d777..000000000 --- a/tpl/crypto/init_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2017 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 crypto - -import ( - "testing" - - qt "github.com/frankban/quicktest" - "github.com/gohugoio/hugo/deps" - "github.com/gohugoio/hugo/htesting/hqt" - "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{}) - if ns.Name == name { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) -} diff --git a/tpl/data/init_test.go b/tpl/data/init_test.go deleted file mode 100644 index 631a91b39..000000000 --- a/tpl/data/init_test.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2017 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 data - -import ( - "testing" - - qt "github.com/frankban/quicktest" - "github.com/gohugoio/hugo/config" - "github.com/gohugoio/hugo/htesting/hqt" - "github.com/gohugoio/hugo/langs" - "github.com/gohugoio/hugo/tpl/internal" -) - -func TestInit(t *testing.T) { - c := qt.New(t) - var found bool - var ns *internal.TemplateFuncsNamespace - - v := config.New() - v.Set("contentDir", "content") - langs.LoadLanguageSettings(v, nil) - - for _, nsf := range internal.TemplateFuncsNamespaceRegistry { - ns = nsf(newDeps(v)) - if ns.Name == name { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) -} diff --git a/tpl/debug/init_test.go b/tpl/debug/init_test.go deleted file mode 100644 index 226915b34..000000000 --- a/tpl/debug/init_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// 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) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) -} diff --git a/tpl/diagrams/diagrams.go b/tpl/diagrams/diagrams.go new file mode 100644 index 000000000..1bdbc2a02 --- /dev/null +++ b/tpl/diagrams/diagrams.go @@ -0,0 +1,73 @@ +// Copyright 2022 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 diagrams + +import ( + "bytes" + "html/template" + "io" + "strings" + + "github.com/bep/goat" + "github.com/gohugoio/hugo/deps" + "github.com/spf13/cast" +) + +type SVGDiagram interface { + Body() template.HTML + SVG() template.HTML + Width() int + Height() int +} + +type goatDiagram struct { + d goat.SVG +} + +func (d goatDiagram) Body() template.HTML { + return template.HTML(d.d.Body) +} + +func (d goatDiagram) SVG() template.HTML { + return template.HTML(d.d.String()) +} + +func (d goatDiagram) Width() int { + return d.d.Width +} + +func (d goatDiagram) Height() int { + return d.d.Height +} + +type Diagrams struct { + d *deps.Deps +} + +func (d *Diagrams) Goat(v interface{}) SVGDiagram { + var r io.Reader + + switch vv := v.(type) { + case io.Reader: + r = vv + case []byte: + r = bytes.NewReader(vv) + default: + r = strings.NewReader(cast.ToString(v)) + } + + return goatDiagram{ + d: goat.BuildSVG(r), + } +} diff --git a/tpl/os/init_test.go b/tpl/diagrams/init.go index 5d756bab2..1a5578837 100644 --- a/tpl/os/init_test.go +++ b/tpl/diagrams/init.go @@ -1,4 +1,4 @@ -// Copyright 2017 The Hugo Authors. All rights reserved. +// Copyright 2022 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. @@ -11,32 +11,28 @@ // See the License for the specific language governing permissions and // limitations under the License. -package os +package diagrams import ( - "testing" - - qt "github.com/frankban/quicktest" "github.com/gohugoio/hugo/deps" - "github.com/gohugoio/hugo/htesting/hqt" "github.com/gohugoio/hugo/tpl/internal" ) -func TestInit(t *testing.T) { - c := qt.New(t) - var found bool - var ns *internal.TemplateFuncsNamespace +const name = "diagrams" + +func init() { + f := func(d *deps.Deps) *internal.TemplateFuncsNamespace { + ctx := &Diagrams{ + d: d, + } - for _, nsf := range internal.TemplateFuncsNamespaceRegistry { - ns = nsf(&deps.Deps{}) - if ns.Name == name { - found = true - break + ns := &internal.TemplateFuncsNamespace{ + Name: name, + Context: func(args ...interface{}) (interface{}, error) { return ctx, nil }, } + + return ns } - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) + internal.AddTemplateFuncsNamespace(f) } diff --git a/tpl/encoding/init_test.go b/tpl/encoding/init_test.go deleted file mode 100644 index 666a4e549..000000000 --- a/tpl/encoding/init_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2017 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 encoding - -import ( - "testing" - - qt "github.com/frankban/quicktest" - "github.com/gohugoio/hugo/deps" - "github.com/gohugoio/hugo/htesting/hqt" - "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{}) - if ns.Name == name { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) -} diff --git a/tpl/fmt/init_test.go b/tpl/fmt/init_test.go deleted file mode 100644 index 07b740a73..000000000 --- a/tpl/fmt/init_test.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2017 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 fmt - -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.NewIgnorableLogger(loggers.NewErrorLogger())}) - if ns.Name == name { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) -} diff --git a/tpl/hugo/init_test.go b/tpl/hugo/init_test.go deleted file mode 100644 index bc806448e..000000000 --- a/tpl/hugo/init_test.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2017 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 hugo - -import ( - "testing" - - "github.com/gohugoio/hugo/config" - - "github.com/gohugoio/hugo/htesting/hqt" - - qt "github.com/frankban/quicktest" - "github.com/gohugoio/hugo/deps" - "github.com/gohugoio/hugo/resources/page" - "github.com/gohugoio/hugo/tpl/internal" -) - -func TestInit(t *testing.T) { - c := qt.New(t) - var found bool - var ns *internal.TemplateFuncsNamespace - v := config.New() - v.Set("contentDir", "content") - s := page.NewDummyHugoSite(v) - - for _, nsf := range internal.TemplateFuncsNamespaceRegistry { - ns = nsf(&deps.Deps{Site: s}) - if ns.Name == name { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, s.Hugo()) -} diff --git a/tpl/images/init_test.go b/tpl/images/init_test.go deleted file mode 100644 index d8d8d7839..000000000 --- a/tpl/images/init_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2017 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 images - -import ( - "testing" - - qt "github.com/frankban/quicktest" - "github.com/gohugoio/hugo/deps" - "github.com/gohugoio/hugo/htesting/hqt" - "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{}) - if ns.Name == name { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) -} diff --git a/tpl/inflect/init_test.go b/tpl/inflect/init_test.go deleted file mode 100644 index 38499838c..000000000 --- a/tpl/inflect/init_test.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2017 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 inflect - -import ( - "testing" - - "github.com/gohugoio/hugo/htesting/hqt" - - qt "github.com/frankban/quicktest" - "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{}) - if ns.Name == name { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) -} diff --git a/tpl/lang/init_test.go b/tpl/lang/init_test.go deleted file mode 100644 index e62db95b9..000000000 --- a/tpl/lang/init_test.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2017 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 lang - -import ( - "testing" - - "github.com/gohugoio/hugo/config" - "github.com/gohugoio/hugo/langs" - - "github.com/gohugoio/hugo/htesting/hqt" - - qt "github.com/frankban/quicktest" - "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{ - Language: langs.NewDefaultLanguage(config.New()), - }) - if ns.Name == name { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) -} diff --git a/tpl/math/init_test.go b/tpl/math/init_test.go deleted file mode 100644 index 9998eaf90..000000000 --- a/tpl/math/init_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2017 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 math - -import ( - "testing" - - qt "github.com/frankban/quicktest" - "github.com/gohugoio/hugo/deps" - "github.com/gohugoio/hugo/htesting/hqt" - "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{}) - if ns.Name == name { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) -} diff --git a/tpl/os/os.go b/tpl/os/os.go index 43c42f5e1..8b195a527 100644 --- a/tpl/os/os.go +++ b/tpl/os/os.go @@ -19,6 +19,7 @@ import ( "errors" "fmt" _os "os" + "path/filepath" "github.com/gohugoio/hugo/deps" "github.com/spf13/afero" @@ -27,17 +28,9 @@ import ( // New returns a new instance of the os-namespaced template functions. func New(d *deps.Deps) *Namespace { - var rfs afero.Fs - if d.Fs != nil { - rfs = d.Fs.WorkingDir - if d.PathSpec != nil && d.PathSpec.BaseFs != nil { - rfs = afero.NewReadOnlyFs(afero.NewCopyOnWriteFs(d.PathSpec.BaseFs.Content.Fs, d.Fs.WorkingDir)) - } - - } - return &Namespace{ - readFileFs: rfs, + readFileFs: afero.NewReadOnlyFs(afero.NewCopyOnWriteFs(d.PathSpec.BaseFs.Content.Fs, d.PathSpec.BaseFs.Work)), + workFs: d.PathSpec.BaseFs.Work, deps: d, } } @@ -45,6 +38,7 @@ func New(d *deps.Deps) *Namespace { // Namespace provides template functions for the "os" namespace. type Namespace struct { readFileFs afero.Fs + workFs afero.Fs deps *deps.Deps } @@ -66,8 +60,9 @@ func (ns *Namespace) Getenv(key interface{}) (string, error) { // readFile reads the file named by filename in the given filesystem // and returns the contents as a string. func readFile(fs afero.Fs, filename string) (string, error) { - if filename == "" { - return "", errors.New("readFile needs a filename") + filename = filepath.Clean(filename) + if filename == "" || filename == "." || filename == string(_os.PathSeparator) { + return "", errors.New("invalid filename") } b, err := afero.ReadFile(fs, filename) @@ -101,7 +96,7 @@ func (ns *Namespace) ReadDir(i interface{}) ([]_os.FileInfo, error) { return nil, err } - list, err := afero.ReadDir(ns.deps.Fs.WorkingDir, path) + list, err := afero.ReadDir(ns.workFs, path) if err != nil { return nil, fmt.Errorf("failed to read directory %q: %s", path, err) } diff --git a/tpl/os/os_test.go b/tpl/os/os_test.go index bbc0d018c..59491e97c 100644 --- a/tpl/os/os_test.go +++ b/tpl/os/os_test.go @@ -11,34 +11,26 @@ // See the License for the specific language governing permissions and // limitations under the License. -package os +package os_test import ( "path/filepath" "testing" - "github.com/gohugoio/hugo/config" + "github.com/gohugoio/hugo/hugolib" + "github.com/gohugoio/hugo/tpl/os" qt "github.com/frankban/quicktest" - "github.com/gohugoio/hugo/deps" - "github.com/gohugoio/hugo/hugofs" - "github.com/spf13/afero" ) func TestReadFile(t *testing.T) { t.Parallel() - c := qt.New(t) - - workingDir := "/home/hugo" - v := config.New() - v.Set("workingDir", workingDir) + b := newFileTestBuilder(t).Build() - // f := newTestFuncsterWithViper(v) - ns := New(&deps.Deps{Fs: hugofs.NewMem(v)}) + // helpers.PrintFs(b.H.PathSpec.BaseFs.Work, "", _os.Stdout) - afero.WriteFile(ns.deps.Fs.Source, filepath.Join(workingDir, "/f/f1.txt"), []byte("f1-content"), 0755) - afero.WriteFile(ns.deps.Fs.Source, filepath.Join("/home", "f2.txt"), []byte("f2-content"), 0755) + ns := os.New(b.H.Deps) for _, test := range []struct { filename string @@ -53,13 +45,13 @@ func TestReadFile(t *testing.T) { result, err := ns.ReadFile(test.filename) - if b, ok := test.expect.(bool); ok && !b { - c.Assert(err, qt.Not(qt.IsNil)) + if bb, ok := test.expect.(bool); ok && !bb { + b.Assert(err, qt.Not(qt.IsNil)) continue } - c.Assert(err, qt.IsNil) - c.Assert(result, qt.Equals, test.expect) + b.Assert(err, qt.IsNil) + b.Assert(result, qt.Equals, test.expect) } } @@ -67,15 +59,8 @@ func TestFileExists(t *testing.T) { t.Parallel() c := qt.New(t) - workingDir := "/home/hugo" - - v := config.New() - v.Set("workingDir", workingDir) - - ns := New(&deps.Deps{Fs: hugofs.NewMem(v)}) - - afero.WriteFile(ns.deps.Fs.Source, filepath.Join(workingDir, "/f/f1.txt"), []byte("f1-content"), 0755) - afero.WriteFile(ns.deps.Fs.Source, filepath.Join("/home", "f2.txt"), []byte("f2-content"), 0755) + b := newFileTestBuilder(t).Build() + ns := os.New(b.H.Deps) for _, test := range []struct { filename string @@ -101,15 +86,8 @@ func TestFileExists(t *testing.T) { func TestStat(t *testing.T) { t.Parallel() - c := qt.New(t) - workingDir := "/home/hugo" - - v := config.New() - v.Set("workingDir", workingDir) - - ns := New(&deps.Deps{Fs: hugofs.NewMem(v)}) - - afero.WriteFile(ns.deps.Fs.Source, filepath.Join(workingDir, "/f/f1.txt"), []byte("f1-content"), 0755) + b := newFileTestBuilder(t).Build() + ns := os.New(b.H.Deps) for _, test := range []struct { filename string @@ -123,11 +101,28 @@ func TestStat(t *testing.T) { result, err := ns.Stat(test.filename) if test.expect == nil { - c.Assert(err, qt.Not(qt.IsNil)) + b.Assert(err, qt.Not(qt.IsNil)) continue } - c.Assert(err, qt.IsNil) - c.Assert(result.Size(), qt.Equals, test.expect) + b.Assert(err, qt.IsNil) + b.Assert(result.Size(), qt.Equals, test.expect) } } + +func newFileTestBuilder(t *testing.T) *hugolib.IntegrationTestBuilder { + files := ` +-- f/f1.txt -- +f1-content +-- home/f2.txt -- +f2-content + ` + + return hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{ + T: t, + TxtarString: files, + WorkingDir: "/mywork", + }, + ) +} diff --git a/tpl/partials/init_test.go b/tpl/partials/init_test.go deleted file mode 100644 index b18ac0a00..000000000 --- a/tpl/partials/init_test.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2017 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" - - qt "github.com/frankban/quicktest" - "github.com/gohugoio/hugo/common/loggers" - "github.com/gohugoio/hugo/deps" - "github.com/gohugoio/hugo/htesting/hqt" - "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{ - BuildStartListeners: &deps.Listeners{}, - Log: loggers.NewErrorLogger(), - }) - if ns.Name == namespaceName { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) -} diff --git a/tpl/path/init_test.go b/tpl/path/init_test.go deleted file mode 100644 index 2282c3305..000000000 --- a/tpl/path/init_test.go +++ /dev/null @@ -1,43 +0,0 @@ -// 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 path - -import ( - "testing" - - "github.com/gohugoio/hugo/htesting/hqt" - - qt "github.com/frankban/quicktest" - "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{}) - if ns.Name == name { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) -} diff --git a/tpl/reflect/init_test.go b/tpl/reflect/init_test.go deleted file mode 100644 index 2ad33fc25..000000000 --- a/tpl/reflect/init_test.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2017 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 reflect - -import ( - "testing" - - qt "github.com/frankban/quicktest" - "github.com/gohugoio/hugo/common/loggers" - "github.com/gohugoio/hugo/deps" - "github.com/gohugoio/hugo/htesting/hqt" - "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) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) -} diff --git a/tpl/safe/init_test.go b/tpl/safe/init_test.go deleted file mode 100644 index 7aa1473d2..000000000 --- a/tpl/safe/init_test.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2017 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 safe - -import ( - "testing" - - qt "github.com/frankban/quicktest" - "github.com/gohugoio/hugo/deps" - "github.com/gohugoio/hugo/htesting/hqt" - "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{}) - if ns.Name == name { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) -} diff --git a/tpl/site/init_test.go b/tpl/site/init_test.go deleted file mode 100644 index 46af2ef5b..000000000 --- a/tpl/site/init_test.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2017 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 site - -import ( - "testing" - - "github.com/gohugoio/hugo/config" - - qt "github.com/frankban/quicktest" - "github.com/gohugoio/hugo/deps" - "github.com/gohugoio/hugo/htesting/hqt" - "github.com/gohugoio/hugo/resources/page" - "github.com/gohugoio/hugo/tpl/internal" -) - -func TestInit(t *testing.T) { - c := qt.New(t) - - var found bool - var ns *internal.TemplateFuncsNamespace - v := config.New() - v.Set("contentDir", "content") - s := page.NewDummyHugoSite(v) - - for _, nsf := range internal.TemplateFuncsNamespaceRegistry { - ns = nsf(&deps.Deps{Site: s}) - if ns.Name == name { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, s) -} diff --git a/tpl/strings/init_test.go b/tpl/strings/init_test.go deleted file mode 100644 index 39d928601..000000000 --- a/tpl/strings/init_test.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2017 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 strings - -import ( - "testing" - - "github.com/gohugoio/hugo/config" - - "github.com/gohugoio/hugo/htesting/hqt" - - qt "github.com/frankban/quicktest" - "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{Cfg: config.New()}) - if ns.Name == name { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) -} diff --git a/tpl/templates/init_test.go b/tpl/templates/init_test.go deleted file mode 100644 index ada53b185..000000000 --- a/tpl/templates/init_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// 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 templates - -import ( - "testing" - - qt "github.com/frankban/quicktest" - "github.com/gohugoio/hugo/deps" - "github.com/gohugoio/hugo/htesting/hqt" - "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{}) - if ns.Name == name { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) -} diff --git a/tpl/time/init_test.go b/tpl/time/init_test.go deleted file mode 100644 index d7efabfa7..000000000 --- a/tpl/time/init_test.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2017 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 time - -import ( - "testing" - - "github.com/gohugoio/hugo/config" - "github.com/gohugoio/hugo/langs" - - "github.com/gohugoio/hugo/htesting/hqt" - - qt "github.com/frankban/quicktest" - "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{ - Language: langs.NewDefaultLanguage(config.New()), - }) - if ns.Name == name { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) -} diff --git a/tpl/tplimpl/embedded/templates/_default/_markup/render-codeblock-goat.html b/tpl/tplimpl/embedded/templates/_default/_markup/render-codeblock-goat.html new file mode 100644 index 000000000..7c2b99f3f --- /dev/null +++ b/tpl/tplimpl/embedded/templates/_default/_markup/render-codeblock-goat.html @@ -0,0 +1 @@ +adf diff --git a/tpl/tplimpl/template.go b/tpl/tplimpl/template.go index 44b486404..706719278 100644 --- a/tpl/tplimpl/template.go +++ b/tpl/tplimpl/template.go @@ -281,15 +281,10 @@ func (t *templateExec) UnusedTemplates() []tpl.FileInfo { for _, ts := range t.main.templates { ti := ts.info - if strings.HasPrefix(ti.name, "_internal/") { - continue - } - if strings.HasPrefix(ti.name, "partials/inline/pagination") { - // TODO(bep) we need to fix this. These are internal partials, but - // they may also be defined in the project, which currently could - // lead to some false negatives. + if strings.HasPrefix(ti.name, "_internal/") || ti.realFilename == "" { continue } + if _, found := t.templateUsageTracker[ti.name]; !found { unused = append(unused, ti) } @@ -740,6 +735,7 @@ func (t *templateHandler) extractIdentifiers(line string) []string { } //go:embed embedded/templates/* +//go:embed embedded/templates/_default/* var embededTemplatesFs embed.FS func (t *templateHandler) loadEmbedded() error { @@ -757,9 +753,19 @@ func (t *templateHandler) loadEmbedded() error { // to write the templates to Go files. templ := string(bytes.ReplaceAll(templb, []byte("\r\n"), []byte("\n"))) name := strings.TrimPrefix(filepath.ToSlash(path), "embedded/templates/") + templateName := name - if err := t.AddTemplate(internalPathPrefix+name, templ); err != nil { - return err + // For the render hooks it does not make sense to preseve the + // double _indternal double book-keeping, + // just add it if its now provided by the user. + if !strings.Contains(path, "_default/_markup") { + templateName = internalPathPrefix + name + } + + if _, found := t.Lookup(templateName); !found { + if err := t.AddTemplate(templateName, templ); err != nil { + return err + } } if aliases, found := embeddedTemplatesAliases[name]; found { diff --git a/tpl/tplimpl/template_funcs.go b/tpl/tplimpl/template_funcs.go index 831b846d0..8692b9ee2 100644 --- a/tpl/tplimpl/template_funcs.go +++ b/tpl/tplimpl/template_funcs.go @@ -38,6 +38,7 @@ import ( _ "github.com/gohugoio/hugo/tpl/crypto" _ "github.com/gohugoio/hugo/tpl/data" _ "github.com/gohugoio/hugo/tpl/debug" + _ "github.com/gohugoio/hugo/tpl/diagrams" _ "github.com/gohugoio/hugo/tpl/encoding" _ "github.com/gohugoio/hugo/tpl/fmt" _ "github.com/gohugoio/hugo/tpl/hugo" diff --git a/tpl/tplimpl/template_funcs_test.go b/tpl/tplimpl/template_funcs_test.go index 6d2587bf7..cb1aa6feb 100644 --- a/tpl/tplimpl/template_funcs_test.go +++ b/tpl/tplimpl/template_funcs_test.go @@ -11,223 +11,74 @@ // See the License for the specific language governing permissions and // limitations under the License. -package tplimpl +package tplimpl_test import ( - "bytes" - "context" "fmt" - "path/filepath" - "reflect" + "strings" "testing" - "time" - "github.com/gohugoio/hugo/modules" + "github.com/gohugoio/hugo/hugolib" - "github.com/gohugoio/hugo/resources/page" - - qt "github.com/frankban/quicktest" - "github.com/gohugoio/hugo/common/hugo" - "github.com/gohugoio/hugo/common/loggers" - "github.com/gohugoio/hugo/config" - "github.com/gohugoio/hugo/deps" - "github.com/gohugoio/hugo/hugofs" - "github.com/gohugoio/hugo/langs" - "github.com/gohugoio/hugo/langs/i18n" - "github.com/gohugoio/hugo/tpl" "github.com/gohugoio/hugo/tpl/internal" - "github.com/gohugoio/hugo/tpl/partials" - "github.com/spf13/afero" ) -var logger = loggers.NewErrorLogger() - -func newTestConfig() config.Provider { - v := config.New() - v.Set("contentDir", "content") - v.Set("dataDir", "data") - v.Set("i18nDir", "i18n") - v.Set("layoutDir", "layouts") - v.Set("archetypeDir", "archetypes") - v.Set("assetDir", "assets") - v.Set("resourceDir", "resources") - v.Set("publishDir", "public") - - langs.LoadLanguageSettings(v, nil) - mod, err := modules.CreateProjectModule(v) - if err != nil { - panic(err) - } - v.Set("allModules", modules.Modules{mod}) - - return v -} - -func newDepsConfig(cfg config.Provider) deps.DepsCfg { - l := langs.NewLanguage("en", cfg) - return deps.DepsCfg{ - Language: l, - Site: page.NewDummyHugoSite(cfg), - Cfg: cfg, - Fs: hugofs.NewMem(l), - Logger: logger, - TemplateProvider: DefaultTemplateProvider, - TranslationProvider: i18n.NewTranslationProvider(), - } -} - func TestTemplateFuncsExamples(t *testing.T) { t.Parallel() - c := qt.New(t) - - workingDir := "/home/hugo" - - v := newTestConfig() - - v.Set("workingDir", workingDir) - v.Set("multilingual", true) - v.Set("contentDir", "content") - v.Set("assetDir", "assets") - v.Set("baseURL", "http://mysite.com/hugo/") - v.Set("CurrentContentLanguage", langs.NewLanguage("en", v)) - - fs := hugofs.NewMem(v) - afero.WriteFile(fs.Source, filepath.Join(workingDir, "files", "README.txt"), []byte("Hugo Rocks!"), 0755) - - depsCfg := newDepsConfig(v) - depsCfg.Fs = fs - d, err := deps.New(depsCfg) - defer d.Close() - c.Assert(err, qt.IsNil) - - var data struct { - Title string - Section string - Hugo map[string]interface{} - Params map[string]interface{} - } - - data.Title = "**BatMan**" - data.Section = "blog" - data.Params = map[string]interface{}{"langCode": "en"} - data.Hugo = map[string]interface{}{"Version": hugo.MustParseVersion("0.36.1").Version()} + files := ` +-- config.toml -- +disableKinds=["home", "section", "taxonomy", "term", "sitemap", "robotsTXT"] +ignoreErrors = ["my-err-id"] +[outputs] +home=["HTML"] +-- layouts/partials/header.html -- +<title>Hugo Rocks!</title> +-- files/README.txt -- +Hugo Rocks! +-- content/blog/hugo-rocks.md -- +--- +title: "**BatMan**" +--- +` + + b := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{ + T: t, + TxtarString: files, + NeedsOsFS: true, + }, + ).Build() + + d := b.H.Sites[0].Deps + + var ( + templates []string + expected []string + ) for _, nsf := range internal.TemplateFuncsNamespaceRegistry { ns := nsf(d) for _, mm := range ns.MethodMappings { - for i, example := range mm.Examples { - in, expected := example[0], example[1] - d.WithTemplate = func(templ tpl.TemplateManager) error { - c.Assert(templ.AddTemplate("test", in), qt.IsNil) - c.Assert(templ.AddTemplate("partials/header.html", "<title>Hugo Rocks!</title>"), qt.IsNil) - return nil - } - c.Assert(d.LoadResources(), qt.IsNil) - - var b bytes.Buffer - templ, _ := d.Tmpl().Lookup("test") - c.Assert(d.Tmpl().Execute(templ, &b, &data), qt.IsNil) - if b.String() != expected { - t.Fatalf("%s[%d]: got %q expected %q", ns.Name, i, b.String(), expected) + for _, example := range mm.Examples { + if strings.Contains(example[0], "errorf") { + // This will fail the build, so skip for now. + continue } + templates = append(templates, example[0]) + expected = append(expected, example[1]) } } } -} - -// TODO(bep) it would be dandy to put this one into the partials package, but -// we have some package cycle issues to solve first. -func TestPartialCached(t *testing.T) { - t.Parallel() - - c := qt.New(t) - - partial := `Now: {{ now.UnixNano }}` - name := "testing" - - var data struct{} - - v := newTestConfig() - - config := newDepsConfig(v) - - config.WithTemplate = func(templ tpl.TemplateManager) error { - err := templ.AddTemplate("partials/"+name, partial) - if err != nil { - return err - } - - return nil - } - - de, err := deps.New(config) - c.Assert(err, qt.IsNil) - defer de.Close() - c.Assert(de.LoadResources(), qt.IsNil) - - ns := partials.New(de) - res1, err := ns.IncludeCached(context.Background(), name, &data) - c.Assert(err, qt.IsNil) + files += fmt.Sprintf("-- layouts/_default/single.html --\n%s\n", strings.Join(templates, "\n")) + b = hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{ + T: t, + TxtarString: files, + NeedsOsFS: true, + }, + ).Build() - for j := 0; j < 10; j++ { - time.Sleep(2 * time.Nanosecond) - res2, err := ns.IncludeCached(context.Background(), name, &data) - c.Assert(err, qt.IsNil) - - if !reflect.DeepEqual(res1, res2) { - t.Fatalf("cache mismatch") - } - - res3, err := ns.IncludeCached(context.Background(), name, &data, fmt.Sprintf("variant%d", j)) - c.Assert(err, qt.IsNil) - - if reflect.DeepEqual(res1, res3) { - t.Fatalf("cache mismatch") - } - } -} - -func BenchmarkPartial(b *testing.B) { - doBenchmarkPartial(b, func(ns *partials.Namespace) error { - _, err := ns.Include(context.Background(), "bench1") - return err - }) -} - -func BenchmarkPartialCached(b *testing.B) { - doBenchmarkPartial(b, func(ns *partials.Namespace) error { - _, err := ns.IncludeCached(context.Background(), "bench1", nil) - return err - }) -} - -func doBenchmarkPartial(b *testing.B, f func(ns *partials.Namespace) error) { - c := qt.New(b) - config := newDepsConfig(config.New()) - config.WithTemplate = func(templ tpl.TemplateManager) error { - err := templ.AddTemplate("partials/bench1", `{{ shuffle (seq 1 10) }}`) - if err != nil { - return err - } - - return nil - } - - de, err := deps.New(config) - c.Assert(err, qt.IsNil) - defer de.Close() - c.Assert(de.LoadResources(), qt.IsNil) - - ns := partials.New(de) - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - if err := f(ns); err != nil { - b.Fatalf("error executing template: %s", err) - } - } - }) + b.AssertFileContent("public/blog/hugo-rocks/index.html", expected...) } diff --git a/tpl/tplimpl/template_info_test.go b/tpl/tplimpl/template_info_test.go deleted file mode 100644 index eaf57166a..000000000 --- a/tpl/tplimpl/template_info_test.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2019 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 tplimpl - -import ( - "testing" - - qt "github.com/frankban/quicktest" - "github.com/gohugoio/hugo/deps" - "github.com/gohugoio/hugo/hugofs" - "github.com/gohugoio/hugo/tpl" -) - -func TestTemplateInfoShortcode(t *testing.T) { - c := qt.New(t) - d := newD(c) - defer d.Close() - h := d.Tmpl().(*templateExec) - - c.Assert(h.AddTemplate("shortcodes/mytemplate.html", ` -{{ .Inner }} -`), qt.IsNil) - - c.Assert(h.postTransform(), qt.IsNil) - - tt, found, _ := d.Tmpl().LookupVariant("mytemplate", tpl.TemplateVariants{}) - - c.Assert(found, qt.Equals, true) - tti, ok := tt.(tpl.Info) - c.Assert(ok, qt.Equals, true) - c.Assert(tti.ParseInfo().IsInner, qt.Equals, true) -} - -// TODO(bep) move and use in other places -func newD(c *qt.C) *deps.Deps { - v := newTestConfig() - fs := hugofs.NewMem(v) - - depsCfg := newDepsConfig(v) - depsCfg.Fs = fs - d, err := deps.New(depsCfg) - c.Assert(err, qt.IsNil) - - provider := DefaultTemplateProvider - provider.Update(d) - - return d -} diff --git a/tpl/transform/init_test.go b/tpl/transform/init_test.go deleted file mode 100644 index ec3c35897..000000000 --- a/tpl/transform/init_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2017 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 transform - -import ( - "testing" - - qt "github.com/frankban/quicktest" - "github.com/gohugoio/hugo/deps" - "github.com/gohugoio/hugo/htesting/hqt" - "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{}) - if ns.Name == name { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) -} diff --git a/tpl/transform/remarshal_test.go b/tpl/transform/remarshal_test.go index 8e94ef6bf..22548593b 100644 --- a/tpl/transform/remarshal_test.go +++ b/tpl/transform/remarshal_test.go @@ -11,13 +11,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -package transform +package transform_test import ( "testing" - "github.com/gohugoio/hugo/config" "github.com/gohugoio/hugo/htesting" + "github.com/gohugoio/hugo/hugolib" + "github.com/gohugoio/hugo/tpl/transform" qt "github.com/frankban/quicktest" ) @@ -25,13 +26,14 @@ import ( func TestRemarshal(t *testing.T) { t.Parallel() - v := config.New() - v.Set("contentDir", "content") - ns := New(newDeps(v)) + b := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{T: t}, + ).Build() + + ns := transform.New(b.H.Deps) c := qt.New(t) c.Run("Roundtrip variants", func(c *qt.C) { - tomlExample := `title = 'Test Metadata' [[resources]] @@ -129,7 +131,6 @@ title: Test Metadata } } - }) c.Run("Comments", func(c *qt.C) { diff --git a/tpl/transform/transform.go b/tpl/transform/transform.go index 8ea91f234..dc7cc0342 100644 --- a/tpl/transform/transform.go +++ b/tpl/transform/transform.go @@ -19,6 +19,9 @@ import ( "html/template" "github.com/gohugoio/hugo/cache/namedmemcache" + "github.com/gohugoio/hugo/common/herrors" + "github.com/gohugoio/hugo/markup/converter/hooks" + "github.com/gohugoio/hugo/markup/highlight" "github.com/gohugoio/hugo/deps" "github.com/gohugoio/hugo/helpers" @@ -65,18 +68,28 @@ func (ns *Namespace) Highlight(s interface{}, lang string, opts ...interface{}) return "", err } - sopts := "" + var optsv interface{} if len(opts) > 0 { - sopts, err = cast.ToStringE(opts[0]) - if err != nil { - return "", err - } + optsv = opts[0] } - highlighted, _ := ns.deps.ContentSpec.Converters.Highlight(ss, lang, sopts) + hl := ns.deps.ContentSpec.Converters.GetHighlighter() + highlighted, _ := hl.Highlight(ss, lang, optsv) return template.HTML(highlighted), nil } +// HighlightCodeBlock highlights a code block on the form received in the codeblock render hooks. +func (ns *Namespace) HighlightCodeBlock(ctx hooks.CodeblockContext, opts ...interface{}) (highlight.HightlightResult, error) { + var optsv interface{} + if len(opts) > 0 { + optsv = opts[0] + } + + hl := ns.deps.ContentSpec.Converters.GetHighlighter() + + return hl.HighlightCodeBlock(ctx, optsv) +} + // HTMLEscape returns a copy of s with reserved HTML characters escaped. func (ns *Namespace) HTMLEscape(s interface{}) (string, error) { ss, err := cast.ToStringE(s) @@ -100,20 +113,22 @@ func (ns *Namespace) HTMLUnescape(s interface{}) (string, error) { // Markdownify renders a given input from Markdown to HTML. func (ns *Namespace) Markdownify(s interface{}) (template.HTML, error) { + defer herrors.Recover() ss, err := cast.ToStringE(s) if err != nil { return "", err } - b, err := ns.deps.ContentSpec.RenderMarkdown([]byte(ss)) - if err != nil { - return "", err + home := ns.deps.Site.Home() + if home == nil { + panic("home must not be nil") } + sss, err := home.RenderString(ss) // Strip if this is a short inline type of text. - b = ns.deps.ContentSpec.TrimShortHTML(b) + bb := ns.deps.ContentSpec.TrimShortHTML([]byte(sss)) - return helpers.BytesToHTML(b), nil + return helpers.BytesToHTML(bb), nil } // Plainify returns a copy of s with all HTML tags removed. @@ -125,3 +140,7 @@ func (ns *Namespace) Plainify(s interface{}) (string, error) { return helpers.StripHTML(ss), nil } + +func (ns *Namespace) Reset() { + ns.cache.Clear() +} diff --git a/tpl/transform/transform_test.go b/tpl/transform/transform_test.go index 260de5f83..3ccf1a270 100644 --- a/tpl/transform/transform_test.go +++ b/tpl/transform/transform_test.go @@ -11,13 +11,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -package transform +package transform_test import ( "html/template" "testing" "github.com/gohugoio/hugo/common/loggers" + "github.com/gohugoio/hugo/hugolib" + "github.com/gohugoio/hugo/tpl/transform" "github.com/spf13/afero" qt "github.com/frankban/quicktest" @@ -32,10 +34,11 @@ type tstNoStringer struct{} func TestEmojify(t *testing.T) { t.Parallel() - c := qt.New(t) + b := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{T: t}, + ).Build() - v := config.New() - ns := New(newDeps(v)) + ns := transform.New(b.H.Deps) for _, test := range []struct { s interface{} @@ -49,23 +52,23 @@ func TestEmojify(t *testing.T) { result, err := ns.Emojify(test.s) - if b, ok := test.expect.(bool); ok && !b { - c.Assert(err, qt.Not(qt.IsNil)) + if bb, ok := test.expect.(bool); ok && !bb { + b.Assert(err, qt.Not(qt.IsNil)) continue } - c.Assert(err, qt.IsNil) - c.Assert(result, qt.Equals, test.expect) + b.Assert(err, qt.IsNil) + b.Assert(result, qt.Equals, test.expect) } } func TestHighlight(t *testing.T) { t.Parallel() - c := qt.New(t) + b := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{T: t}, + ).Build() - v := config.New() - v.Set("contentDir", "content") - ns := New(newDeps(v)) + ns := transform.New(b.H.Deps) for _, test := range []struct { s interface{} @@ -82,23 +85,23 @@ func TestHighlight(t *testing.T) { result, err := ns.Highlight(test.s, test.lang, test.opts) - if b, ok := test.expect.(bool); ok && !b { - c.Assert(err, qt.Not(qt.IsNil)) + if bb, ok := test.expect.(bool); ok && !bb { + b.Assert(err, qt.Not(qt.IsNil)) continue } - c.Assert(err, qt.IsNil) - c.Assert(string(result), qt.Contains, test.expect.(string)) + b.Assert(err, qt.IsNil) + b.Assert(string(result), qt.Contains, test.expect.(string)) } } func TestHTMLEscape(t *testing.T) { t.Parallel() - c := qt.New(t) + b := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{T: t}, + ).Build() - v := config.New() - v.Set("contentDir", "content") - ns := New(newDeps(v)) + ns := transform.New(b.H.Deps) for _, test := range []struct { s interface{} @@ -112,23 +115,23 @@ func TestHTMLEscape(t *testing.T) { result, err := ns.HTMLEscape(test.s) - if b, ok := test.expect.(bool); ok && !b { - c.Assert(err, qt.Not(qt.IsNil)) + if bb, ok := test.expect.(bool); ok && !bb { + b.Assert(err, qt.Not(qt.IsNil)) continue } - c.Assert(err, qt.IsNil) - c.Assert(result, qt.Equals, test.expect) + b.Assert(err, qt.IsNil) + b.Assert(result, qt.Equals, test.expect) } } func TestHTMLUnescape(t *testing.T) { t.Parallel() - c := qt.New(t) + b := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{T: t}, + ).Build() - v := config.New() - v.Set("contentDir", "content") - ns := New(newDeps(v)) + ns := transform.New(b.H.Deps) for _, test := range []struct { s interface{} @@ -142,23 +145,23 @@ func TestHTMLUnescape(t *testing.T) { result, err := ns.HTMLUnescape(test.s) - if b, ok := test.expect.(bool); ok && !b { - c.Assert(err, qt.Not(qt.IsNil)) + if bb, ok := test.expect.(bool); ok && !bb { + b.Assert(err, qt.Not(qt.IsNil)) continue } - c.Assert(err, qt.IsNil) - c.Assert(result, qt.Equals, test.expect) + b.Assert(err, qt.IsNil) + b.Assert(result, qt.Equals, test.expect) } } func TestMarkdownify(t *testing.T) { t.Parallel() - c := qt.New(t) + b := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{T: t}, + ).Build() - v := config.New() - v.Set("contentDir", "content") - ns := New(newDeps(v)) + ns := transform.New(b.H.Deps) for _, test := range []struct { s interface{} @@ -171,23 +174,24 @@ func TestMarkdownify(t *testing.T) { result, err := ns.Markdownify(test.s) - if b, ok := test.expect.(bool); ok && !b { - c.Assert(err, qt.Not(qt.IsNil)) + if bb, ok := test.expect.(bool); ok && !bb { + b.Assert(err, qt.Not(qt.IsNil)) continue } - c.Assert(err, qt.IsNil) - c.Assert(result, qt.Equals, test.expect) + b.Assert(err, qt.IsNil) + b.Assert(result, qt.Equals, test.expect) } } // Issue #3040 func TestMarkdownifyBlocksOfText(t *testing.T) { t.Parallel() - c := qt.New(t) - v := config.New() - v.Set("contentDir", "content") - ns := New(newDeps(v)) + b := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{T: t}, + ).Build() + + ns := transform.New(b.H.Deps) text := ` #First @@ -202,17 +206,18 @@ And then some. ` result, err := ns.Markdownify(text) - c.Assert(err, qt.IsNil) - c.Assert(result, qt.Equals, template.HTML( + b.Assert(err, qt.IsNil) + b.Assert(result, qt.Equals, template.HTML( "<p>#First</p>\n<p>This is some <em>bold</em> text.</p>\n<h2 id=\"second\">Second</h2>\n<p>This is some more text.</p>\n<p>And then some.</p>\n")) } func TestPlainify(t *testing.T) { t.Parallel() - c := qt.New(t) + b := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{T: t}, + ).Build() - v := config.New() - ns := New(newDeps(v)) + ns := transform.New(b.H.Deps) for _, test := range []struct { s interface{} @@ -225,13 +230,13 @@ func TestPlainify(t *testing.T) { result, err := ns.Plainify(test.s) - if b, ok := test.expect.(bool); ok && !b { - c.Assert(err, qt.Not(qt.IsNil)) + if bb, ok := test.expect.(bool); ok && !bb { + b.Assert(err, qt.Not(qt.IsNil)) continue } - c.Assert(err, qt.IsNil) - c.Assert(result, qt.Equals, test.expect) + b.Assert(err, qt.IsNil) + b.Assert(result, qt.Equals, test.expect) } } diff --git a/tpl/transform/unmarshal_test.go b/tpl/transform/unmarshal_test.go index fb0e446c3..2b14282ec 100644 --- a/tpl/transform/unmarshal_test.go +++ b/tpl/transform/unmarshal_test.go @@ -11,7 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package transform +package transform_test import ( "fmt" @@ -19,7 +19,8 @@ import ( "strings" "testing" - "github.com/gohugoio/hugo/config" + "github.com/gohugoio/hugo/hugolib" + "github.com/gohugoio/hugo/tpl/transform" "github.com/gohugoio/hugo/common/hugio" "github.com/gohugoio/hugo/resources/resource" @@ -80,12 +81,14 @@ func (t testContentResource) Key() string { } func TestUnmarshal(t *testing.T) { - v := config.New() - ns := New(newDeps(v)) - c := qt.New(t) + b := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{T: t}, + ).Build() + + ns := transform.New(b.H.Deps) assertSlogan := func(m map[string]interface{}) { - c.Assert(m["slogan"], qt.Equals, "Hugo Rocks!") + b.Assert(m["slogan"], qt.Equals, "Hugo Rocks!") } for _, test := range []struct { @@ -116,24 +119,24 @@ func TestUnmarshal(t *testing.T) { }}, {testContentResource{key: "r1", content: `1997,Ford,E350,"ac, abs, moon",3000.00 1999,Chevy,"Venture ""Extended Edition""","",4900.00`, mime: media.CSVType}, nil, func(r [][]string) { - c.Assert(len(r), qt.Equals, 2) + b.Assert(len(r), qt.Equals, 2) first := r[0] - c.Assert(len(first), qt.Equals, 5) - c.Assert(first[1], qt.Equals, "Ford") + b.Assert(len(first), qt.Equals, 5) + b.Assert(first[1], qt.Equals, "Ford") }}, {testContentResource{key: "r1", content: `a;b;c`, mime: media.CSVType}, map[string]interface{}{"delimiter": ";"}, func(r [][]string) { - c.Assert([][]string{{"a", "b", "c"}}, qt.DeepEquals, r) + b.Assert([][]string{{"a", "b", "c"}}, qt.DeepEquals, r) }}, {"a,b,c", nil, func(r [][]string) { - c.Assert([][]string{{"a", "b", "c"}}, qt.DeepEquals, r) + b.Assert([][]string{{"a", "b", "c"}}, qt.DeepEquals, r) }}, {"a;b;c", map[string]interface{}{"delimiter": ";"}, func(r [][]string) { - c.Assert([][]string{{"a", "b", "c"}}, qt.DeepEquals, r) + b.Assert([][]string{{"a", "b", "c"}}, qt.DeepEquals, r) }}, {testContentResource{key: "r1", content: ` % This is a comment a;b;c`, mime: media.CSVType}, map[string]interface{}{"DElimiter": ";", "Comment": "%"}, func(r [][]string) { - c.Assert([][]string{{"a", "b", "c"}}, qt.DeepEquals, r) + b.Assert([][]string{{"a", "b", "c"}}, qt.DeepEquals, r) }}, // errors {"thisisnotavaliddataformat", nil, false}, @@ -144,7 +147,7 @@ a;b;c`, mime: media.CSVType}, map[string]interface{}{"DElimiter": ";", "Comment" {tstNoStringer{}, nil, false}, } { - ns.cache.Clear() + ns.Reset() var args []interface{} @@ -156,29 +159,32 @@ a;b;c`, mime: media.CSVType}, map[string]interface{}{"DElimiter": ";", "Comment" result, err := ns.Unmarshal(args...) - if b, ok := test.expect.(bool); ok && !b { - c.Assert(err, qt.Not(qt.IsNil)) + if bb, ok := test.expect.(bool); ok && !bb { + b.Assert(err, qt.Not(qt.IsNil)) } else if fn, ok := test.expect.(func(m map[string]interface{})); ok { - c.Assert(err, qt.IsNil) + b.Assert(err, qt.IsNil) m, ok := result.(map[string]interface{}) - c.Assert(ok, qt.Equals, true) + b.Assert(ok, qt.Equals, true) fn(m) } else if fn, ok := test.expect.(func(r [][]string)); ok { - c.Assert(err, qt.IsNil) + b.Assert(err, qt.IsNil) r, ok := result.([][]string) - c.Assert(ok, qt.Equals, true) + b.Assert(ok, qt.Equals, true) fn(r) } else { - c.Assert(err, qt.IsNil) - c.Assert(result, qt.Equals, test.expect) + b.Assert(err, qt.IsNil) + b.Assert(result, qt.Equals, test.expect) } } } func BenchmarkUnmarshalString(b *testing.B) { - v := config.New() - ns := New(newDeps(v)) + bb := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{T: b}, + ).Build() + + ns := transform.New(bb.H.Deps) const numJsons = 100 @@ -200,8 +206,11 @@ func BenchmarkUnmarshalString(b *testing.B) { } func BenchmarkUnmarshalResource(b *testing.B) { - v := config.New() - ns := New(newDeps(v)) + bb := hugolib.NewIntegrationTestBuilder( + hugolib.IntegrationTestConfig{T: b}, + ).Build() + + ns := transform.New(bb.H.Deps) const numJsons = 100 diff --git a/tpl/urls/init_test.go b/tpl/urls/init_test.go deleted file mode 100644 index 7e53c247a..000000000 --- a/tpl/urls/init_test.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2017 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 urls - -import ( - "testing" - - "github.com/gohugoio/hugo/config" - - qt "github.com/frankban/quicktest" - "github.com/gohugoio/hugo/deps" - "github.com/gohugoio/hugo/htesting/hqt" - "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{Cfg: config.New()}) - if ns.Name == name { - found = true - break - } - } - - c.Assert(found, qt.Equals, true) - ctx, err := ns.Context() - c.Assert(err, qt.IsNil) - c.Assert(ctx, hqt.IsSameType, &Namespace{}) - -} |