Skip to content

Commit

Permalink
tpl/transform: Make Plainify and ToMath return template.HTML
Browse files Browse the repository at this point in the history
None of these are useful as plain strings in the templates, which forces the users to do `transform.Plainify "foo" | safeHTML`.

If people have trust issues with the output of these functions, they need to just stop using them.

Closes #8732
bep committed Aug 11, 2024
1 parent 5d84f64 commit 946e6af
Showing 4 changed files with 12 additions and 11 deletions.
2 changes: 1 addition & 1 deletion docs/content/en/functions/transform/Plainify.md
Original file line number Diff line number Diff line change
@@ -6,7 +6,7 @@ keywords: []
action:
aliases: [plainify]
related: []
returnType: string
returnType: template.HTML
signatures: [transform.Plainify INPUT]
aliases: [/functions/plainify]
---
16 changes: 9 additions & 7 deletions tpl/transform/transform.go
Original file line number Diff line number Diff line change
@@ -54,7 +54,7 @@ func New(deps *deps.Deps) *Namespace {
"/tmpl/transform/unmarshal",
dynacache.OptionsPartition{Weight: 30, ClearWhen: dynacache.ClearOnChange},
),
cacheMath: dynacache.GetOrCreatePartition[string, string](
cacheMath: dynacache.GetOrCreatePartition[string, template.HTML](
deps.MemCache,
"/tmpl/transform/math",
dynacache.OptionsPartition{Weight: 30, ClearWhen: dynacache.ClearNever},
@@ -65,7 +65,7 @@ func New(deps *deps.Deps) *Namespace {
// Namespace provides template functions for the "transform" namespace.
type Namespace struct {
cacheUnmarshal *dynacache.Partition[string, *resources.StaleValue[any]]
cacheMath *dynacache.Partition[string, string]
cacheMath *dynacache.Partition[string, template.HTML]

id atomic.Uint32
deps *deps.Deps
@@ -188,18 +188,18 @@ func (ns *Namespace) Markdownify(ctx context.Context, s any) (template.HTML, err
}

// Plainify returns a copy of s with all HTML tags removed.
func (ns *Namespace) Plainify(s any) (string, error) {
func (ns *Namespace) Plainify(s any) (template.HTML, error) {
ss, err := cast.ToStringE(s)
if err != nil {
return "", err
}

return tpl.StripHTML(ss), nil
return template.HTML(tpl.StripHTML(ss)), nil
}

// ToMath converts a LaTeX string to math in the given format, default MathML.
// This uses KaTeX to render the math, see https://katex.org/.
func (ns *Namespace) ToMath(ctx context.Context, args ...any) (string, error) {
func (ns *Namespace) ToMath(ctx context.Context, args ...any) (template.HTML, error) {
if len(args) < 1 {
return "", errors.New("must provide at least one argument")
}
@@ -226,7 +226,7 @@ func (ns *Namespace) ToMath(ctx context.Context, args ...any) (string, error) {
key := "tomath/" + s[:2] + "/" + s[2:]
fileCache := ns.deps.ResourceSpec.FileCaches.MiscCache()

return ns.cacheMath.GetOrCreate(key, func(string) (string, error) {
return ns.cacheMath.GetOrCreate(key, func(string) (template.HTML, error) {
_, r, err := fileCache.GetOrCreate(key, func() (io.ReadCloser, error) {
message := warpc.Message[warpc.KatexInput]{
Header: warpc.Header{
@@ -250,7 +250,9 @@ func (ns *Namespace) ToMath(ctx context.Context, args ...any) (string, error) {
return "", err
}

return hugio.ReadString(r)
s, err := hugio.ReadString(r)

return template.HTML(s), err
})
}

3 changes: 1 addition & 2 deletions tpl/transform/transform_integration_test.go
Original file line number Diff line number Diff line change
@@ -141,8 +141,7 @@ func TestToMath(t *testing.T) {
-- hugo.toml --
disableKinds = ['page','rss','section','sitemap','taxonomy','term']
-- layouts/index.html --
{{ $result := transform.ToMath "c = \\pm\\sqrt{a^2 + b^2}" }}
{{ printf "%v" $result | safeHTML }}
{{ transform.ToMath "c = \\pm\\sqrt{a^2 + b^2}" }}
`
b := hugolib.Test(t, files)

2 changes: 1 addition & 1 deletion tpl/transform/transform_test.go
Original file line number Diff line number Diff line change
@@ -244,6 +244,6 @@ func TestPlainify(t *testing.T) {
}

b.Assert(err, qt.IsNil)
b.Assert(result, qt.Equals, test.expect)
b.Assert(result, qt.Equals, template.HTML(test.expect.(string)))
}
}

0 comments on commit 946e6af

Please sign in to comment.