// 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_test import ( "context" "html/template" "strings" "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" "github.com/gohugoio/hugo/config" "github.com/gohugoio/hugo/deps" "github.com/gohugoio/hugo/helpers" "github.com/gohugoio/hugo/hugofs" "github.com/gohugoio/hugo/langs" ) type tstNoStringer struct{} func TestEmojify(t *testing.T) { t.Parallel() b := hugolib.NewIntegrationTestBuilder( hugolib.IntegrationTestConfig{T: t}, ).Build() ns := transform.New(b.H.Deps) for _, test := range []struct { s any expect any }{ {":notamoji:", template.HTML(":notamoji:")}, {"I :heart: Hugo", template.HTML("I ❤️ Hugo")}, // errors {tstNoStringer{}, false}, } { result, err := ns.Emojify(test.s) if bb, ok := test.expect.(bool); ok && !bb { b.Assert(err, qt.Not(qt.IsNil)) continue } b.Assert(err, qt.IsNil) b.Assert(result, qt.Equals, test.expect) } } func TestHighlight(t *testing.T) { t.Parallel() b := hugolib.NewIntegrationTestBuilder( hugolib.IntegrationTestConfig{T: t}, ).Build() ns := transform.New(b.H.Deps) for _, test := range []struct { s any lang string opts any expect any }{ {"func boo() {}", "go", "", "boo"}, {"func boo() {}", "go", nil, "boo"}, // Issue #4179 {``, "xml", "", `&lt;`}, {tstNoStringer{}, "go", "", false}, // Issue #9591 {strings.Repeat("AAA \n", 10), "bash", template.HTML("linenos=true,noClasses=false"), "line"}, } { result, err := ns.Highlight(test.s, test.lang, test.opts) if bb, ok := test.expect.(bool); ok && !bb { b.Assert(err, qt.Not(qt.IsNil)) continue } b.Assert(err, qt.IsNil) b.Assert(string(result), qt.Contains, test.expect.(string)) } } func TestCanHighlight(t *testing.T) { t.Parallel() c := qt.New(t) ns := &transform.Namespace{} c.Assert(ns.CanHighlight("go"), qt.Equals, true) c.Assert(ns.CanHighlight("foo"), qt.Equals, false) } func TestHTMLEscape(t *testing.T) { t.Parallel() b := hugolib.NewIntegrationTestBuilder( hugolib.IntegrationTestConfig{T: t}, ).Build() ns := transform.New(b.H.Deps) for _, test := range []struct { s any expect any }{ {`"Foo & Bar's Diner" `, `"Foo & Bar's Diner" <y@z>`}, {"Hugo & Caddy > Wordpress & Apache", "Hugo & Caddy > Wordpress & Apache"}, // errors {tstNoStringer{}, false}, } { result, err := ns.HTMLEscape(test.s) if bb, ok := test.expect.(bool); ok && !bb { b.Assert(err, qt.Not(qt.IsNil)) continue } b.Assert(err, qt.IsNil) b.Assert(result, qt.Equals, test.expect) } } func TestHTMLUnescape(t *testing.T) { t.Parallel() b := hugolib.NewIntegrationTestBuilder( hugolib.IntegrationTestConfig{T: t}, ).Build() ns := transform.New(b.H.Deps) for _, test := range []struct { s any expect any }{ {`"Foo & Bar's Diner" <y@z>`, `"Foo & Bar's Diner" `}, {"Hugo & Caddy > Wordpress & Apache", "Hugo & Caddy > Wordpress & Apache"}, // errors {tstNoStringer{}, false}, } { result, err := ns.HTMLUnescape(test.s) if bb, ok := test.expect.(bool); ok && !bb { b.Assert(err, qt.Not(qt.IsNil)) continue } b.Assert(err, qt.IsNil) b.Assert(result, qt.Equals, test.expect) } } func TestMarkdownify(t *testing.T) { t.Parallel() b := hugolib.NewIntegrationTestBuilder( hugolib.IntegrationTestConfig{T: t}, ).Build() ns := transform.New(b.H.Deps) for _, test := range []struct { s any expect any }{ {"Hello **World!**", template.HTML("Hello World!")}, {[]byte("Hello Bytes **World!**"), template.HTML("Hello Bytes World!")}, {tstNoStringer{}, false}, } { result, err := ns.Markdownify(context.Background(), test.s) if bb, ok := test.expect.(bool); ok && !bb { b.Assert(err, qt.Not(qt.IsNil)) continue } b.Assert(err, qt.IsNil) b.Assert(result, qt.Equals, test.expect) } } // Issue #3040 func TestMarkdownifyBlocksOfText(t *testing.T) { t.Parallel() b := hugolib.NewIntegrationTestBuilder( hugolib.IntegrationTestConfig{T: t}, ).Build() ns := transform.New(b.H.Deps) text := ` #First This is some *bold* text. ## Second This is some more text. And then some. ` result, err := ns.Markdownify(context.Background(), text) b.Assert(err, qt.IsNil) b.Assert(result, qt.Equals, template.HTML( "

#First

\n

This is some bold text.

\n

Second

\n

This is some more text.

\n

And then some.

\n")) } func TestPlainify(t *testing.T) { t.Parallel() b := hugolib.NewIntegrationTestBuilder( hugolib.IntegrationTestConfig{T: t}, ).Build() ns := transform.New(b.H.Deps) for _, test := range []struct { s any expect any }{ {"Note: blah blah", "Note: blah blah"}, {"
qwe
", "qwe"}, // errors {tstNoStringer{}, false}, } { result, err := ns.Plainify(test.s) if bb, ok := test.expect.(bool); ok && !bb { b.Assert(err, qt.Not(qt.IsNil)) continue } b.Assert(err, qt.IsNil) b.Assert(result, qt.Equals, test.expect) } } func newDeps(cfg config.Provider) *deps.Deps { cfg.Set("contentDir", "content") cfg.Set("i18nDir", "i18n") l := langs.NewLanguage("en", cfg) cs, err := helpers.NewContentSpec(l, loggers.NewErrorLogger(), afero.NewMemMapFs(), nil) if err != nil { panic(err) } return &deps.Deps{ Cfg: cfg, Fs: hugofs.NewMem(l), ContentSpec: cs, } }