Make all renderhook Text methods return template.HTML

This commit is contained in:
Bjørn Erik Pedersen 2024-08-31 17:25:15 +02:00
parent f738669a4d
commit 6d97ee711e
13 changed files with 50 additions and 36 deletions

View file

@ -13,8 +13,22 @@
package hstring package hstring
type RenderedString string import (
"html/template"
func (s RenderedString) String() string { "github.com/gohugoio/hugo/common/types"
)
var _ types.PrintableValueProvider = RenderedHTML("")
// RenderedHTML is a string that represents rendered HTML.
// When printed in templates it will be rendered as template.HTML and considered safe.
type RenderedHTML string
func (s RenderedHTML) String() string {
return string(s) return string(s)
} }
func (s RenderedHTML) PrintableValue() any {
return template.HTML(s)
}

View file

@ -25,6 +25,6 @@ func TestRenderedString(t *testing.T) {
c := qt.New(t) c := qt.New(t)
// Validate that it will behave like a string in Hugo settings. // Validate that it will behave like a string in Hugo settings.
c.Assert(cast.ToString(RenderedString("Hugo")), qt.Equals, "Hugo") c.Assert(cast.ToString(RenderedHTML("Hugo")), qt.Equals, "Hugo")
c.Assert(template.HTML(RenderedString("Hugo")), qt.Equals, template.HTML("Hugo")) c.Assert(template.HTML(RenderedHTML("Hugo")), qt.Equals, template.HTML("Hugo"))
} }

View file

@ -98,8 +98,8 @@ baseURL="https://example.org"
P1: {{ $p.Content }} P1: {{ $p.Content }}
`, `,
"_default/_markup/render-link.html", `html-link: {{ .Destination | safeURL }}|Text: {{ .Text | safeHTML }}|Plain: {{ .PlainText | safeHTML }}`, "_default/_markup/render-link.html", `html-link: {{ .Destination | safeURL }}|Text: {{ .Text }}|Plain: {{ .PlainText | safeHTML }}`,
"_default/_markup/render-image.html", `html-image: {{ .Destination | safeURL }}|Text: {{ .Text | safeHTML }}|Plain: {{ .PlainText | safeHTML }}`, "_default/_markup/render-image.html", `html-image: {{ .Destination | safeURL }}|Text: {{ .Text }}|Plain: {{ .PlainText | safeHTML }}`,
) )
b.WithContent("p1.md", `--- b.WithContent("p1.md", `---

View file

@ -928,7 +928,7 @@ func (c *cachedContentScope) RenderString(ctx context.Context, args ...any) (tem
contentToRenderv := args[sidx] contentToRenderv := args[sidx]
if _, ok := contentToRenderv.(hstring.RenderedString); ok { if _, ok := contentToRenderv.(hstring.RenderedHTML); ok {
// This content is already rendered, this is potentially // This content is already rendered, this is potentially
// a infinite recursion. // a infinite recursion.
return "", errors.New("text is already rendered, repeating it may cause infinite recursion") return "", errors.New("text is already rendered, repeating it may cause infinite recursion")

View file

@ -41,7 +41,7 @@ type LinkContext interface {
Title() string Title() string
// The rendered (HTML) text. // The rendered (HTML) text.
Text() hstring.RenderedString Text() hstring.RenderedHTML
// The plain variant of Text. // The plain variant of Text.
PlainText() string PlainText() string
@ -100,7 +100,7 @@ type BlockquoteContext interface {
// The blockquote text. // The blockquote text.
// If type is "alert", this will be the alert text. // If type is "alert", this will be the alert text.
Text() hstring.RenderedString Text() hstring.RenderedHTML
/// Returns the blockquote type, one of "regular" and "alert". /// Returns the blockquote type, one of "regular" and "alert".
// Type "alert" indicates that this is a GitHub type alert. // Type "alert" indicates that this is a GitHub type alert.
@ -166,7 +166,7 @@ type HeadingContext interface {
// Anchor is the HTML id assigned to the heading. // Anchor is the HTML id assigned to the heading.
Anchor() string Anchor() string
// Text is the rendered (HTML) heading text, excluding the heading marker. // Text is the rendered (HTML) heading text, excluding the heading marker.
Text() hstring.RenderedString Text() hstring.RenderedHTML
// PlainText is the unrendered version of Text. // PlainText is the unrendered version of Text.
PlainText() string PlainText() string
@ -213,7 +213,7 @@ const (
type GetRendererFunc func(t RendererType, id any) any type GetRendererFunc func(t RendererType, id any) any
type TableCell struct { type TableCell struct {
Text hstring.RenderedString Text hstring.RenderedHTML
Alignment string // left, center, or right Alignment string // left, center, or right
} }

View file

@ -95,7 +95,7 @@ func (r *htmlRenderer) renderBlockquote(w util.BufWriter, src []byte, node ast.N
BaseContext: render.NewBaseContext(ctx, renderer, n, src, nil, ordinal), BaseContext: render.NewBaseContext(ctx, renderer, n, src, nil, ordinal),
typ: typ, typ: typ,
alertType: alertType, alertType: alertType,
text: hstring.RenderedString(text), text: hstring.RenderedHTML(text),
AttributesHolder: attributes.New(n.Attributes(), attributes.AttributesOwnerGeneral), AttributesHolder: attributes.New(n.Attributes(), attributes.AttributesOwnerGeneral),
} }
@ -134,7 +134,7 @@ func (r *htmlRenderer) renderBlockquoteDefault(
type blockquoteContext struct { type blockquoteContext struct {
hooks.BaseContext hooks.BaseContext
text hstring.RenderedString text hstring.RenderedHTML
alertType string alertType string
typ string typ string
@ -149,7 +149,7 @@ func (c *blockquoteContext) AlertType() string {
return c.alertType return c.alertType
} }
func (c *blockquoteContext) Text() hstring.RenderedString { func (c *blockquoteContext) Text() hstring.RenderedHTML {
return c.text return c.text
} }

View file

@ -32,9 +32,9 @@ func TestBlockquoteHook(t *testing.T) {
block = true block = true
title = true title = true
-- layouts/_default/_markup/render-blockquote.html -- -- layouts/_default/_markup/render-blockquote.html --
Blockquote: |{{ .Text | safeHTML }}|{{ .Type }}| Blockquote: |{{ .Text }}|{{ .Type }}|
-- layouts/_default/_markup/render-blockquote-alert.html -- -- layouts/_default/_markup/render-blockquote-alert.html --
{{ $text := .Text | safeHTML }} {{ $text := .Text }}
Blockquote Alert: |{{ $text }}|{{ .Type }}| Blockquote Alert: |{{ $text }}|{{ .Type }}|
Blockquote Alert Attributes: |{{ $text }}|{{ .Attributes }}| Blockquote Alert Attributes: |{{ $text }}|{{ .Attributes }}|
Blockquote Alert Page: |{{ $text }}|{{ .Page.Title }}|{{ .PageInner.Title }}| Blockquote Alert Page: |{{ $text }}|{{ .Page.Title }}|{{ .PageInner.Title }}|

View file

@ -76,7 +76,7 @@ title: "p1"
{{- range $k, $v := .Attributes -}} {{- range $k, $v := .Attributes -}}
{{- printf " %s=%q" $k $v | safeHTMLAttr -}} {{- printf " %s=%q" $k $v | safeHTMLAttr -}}
{{- end -}} {{- end -}}
>{{ .Text | safeHTML }}</h{{ .Level }}> >{{ .Text }}</h{{ .Level }}>
` `
b := hugolib.Test(t, files) b := hugolib.Test(t, files)
@ -146,11 +146,11 @@ title: "p1"
{{ .Content }} {{ .Content }}
-- layouts/_default/_markup/render-heading.html -- -- layouts/_default/_markup/render-heading.html --
<h{{ .Level }} id="{{ .Anchor | safeURL }}"> <h{{ .Level }} id="{{ .Anchor | safeURL }}">
{{ .Text | safeHTML }} {{ .Text }}
<a class="anchor" href="#{{ .Anchor | safeURL }}">#</a> <a class="anchor" href="#{{ .Anchor | safeURL }}">#</a>
</h{{ .Level }}> </h{{ .Level }}>
-- layouts/_default/_markup/render-link.html -- -- layouts/_default/_markup/render-link.html --
<a href="{{ .Destination | safeURL }}"{{ with .Title}} title="{{ . }}"{{ end }}>{{ .Text | safeHTML }}</a> <a href="{{ .Destination | safeURL }}"{{ with .Title}} title="{{ . }}"{{ end }}>{{ .Text }}</a>
` `
@ -236,11 +236,11 @@ func BenchmarkRenderHooks(b *testing.B) {
-- config.toml -- -- config.toml --
-- layouts/_default/_markup/render-heading.html -- -- layouts/_default/_markup/render-heading.html --
<h{{ .Level }} id="{{ .Anchor | safeURL }}"> <h{{ .Level }} id="{{ .Anchor | safeURL }}">
{{ .Text | safeHTML }} {{ .Text }}
<a class="anchor" href="#{{ .Anchor | safeURL }}">#</a> <a class="anchor" href="#{{ .Anchor | safeURL }}">#</a>
</h{{ .Level }}> </h{{ .Level }}>
-- layouts/_default/_markup/render-link.html -- -- layouts/_default/_markup/render-link.html --
<a href="{{ .Destination | safeURL }}"{{ with .Title}} title="{{ . }}"{{ end }}>{{ .Text | safeHTML }}</a> <a href="{{ .Destination | safeURL }}"{{ with .Title}} title="{{ . }}"{{ end }}>{{ .Text }}</a>
-- layouts/_default/single.html -- -- layouts/_default/single.html --
{{ .Content }} {{ .Content }}
` `
@ -452,7 +452,7 @@ Link https procol: https://www.example.org
if withHook { if withHook {
files += `-- layouts/_default/_markup/render-link.html -- files += `-- layouts/_default/_markup/render-link.html --
<a href="{{ .Destination | safeURL }}">{{ .Text | safeHTML }}</a>` <a href="{{ .Destination | safeURL }}">{{ .Text }}</a>`
} }
return hugolib.NewIntegrationTestBuilder( return hugolib.NewIntegrationTestBuilder(

View file

@ -52,7 +52,7 @@ type linkContext struct {
pageInner any pageInner any
destination string destination string
title string title string
text hstring.RenderedString text hstring.RenderedHTML
plainText string plainText string
*attributes.AttributesHolder *attributes.AttributesHolder
} }
@ -69,7 +69,7 @@ func (ctx linkContext) PageInner() any {
return ctx.pageInner return ctx.pageInner
} }
func (ctx linkContext) Text() hstring.RenderedString { func (ctx linkContext) Text() hstring.RenderedHTML {
return ctx.text return ctx.text
} }
@ -100,7 +100,7 @@ type headingContext struct {
pageInner any pageInner any
level int level int
anchor string anchor string
text hstring.RenderedString text hstring.RenderedHTML
plainText string plainText string
*attributes.AttributesHolder *attributes.AttributesHolder
} }
@ -121,7 +121,7 @@ func (ctx headingContext) Anchor() string {
return ctx.anchor return ctx.anchor
} }
func (ctx headingContext) Text() hstring.RenderedString { func (ctx headingContext) Text() hstring.RenderedHTML {
return ctx.text return ctx.text
} }
@ -199,7 +199,7 @@ func (r *hookedRenderer) renderImage(w util.BufWriter, source []byte, node ast.N
pageInner: pageInner, pageInner: pageInner,
destination: string(n.Destination), destination: string(n.Destination),
title: string(n.Title), title: string(n.Title),
text: hstring.RenderedString(text), text: hstring.RenderedHTML(text),
plainText: string(n.Text(source)), plainText: string(n.Text(source)),
AttributesHolder: attributes.New(attrs, attributes.AttributesOwnerGeneral), AttributesHolder: attributes.New(attrs, attributes.AttributesOwnerGeneral),
}, },
@ -288,7 +288,7 @@ func (r *hookedRenderer) renderLink(w util.BufWriter, source []byte, node ast.No
pageInner: pageInner, pageInner: pageInner,
destination: string(n.Destination), destination: string(n.Destination),
title: string(n.Title), title: string(n.Title),
text: hstring.RenderedString(text), text: hstring.RenderedHTML(text),
plainText: string(n.Text(source)), plainText: string(n.Text(source)),
AttributesHolder: attributes.Empty, AttributesHolder: attributes.Empty,
}, },
@ -355,7 +355,7 @@ func (r *hookedRenderer) renderAutoLink(w util.BufWriter, source []byte, node as
page: page, page: page,
pageInner: pageInner, pageInner: pageInner,
destination: url, destination: url,
text: hstring.RenderedString(label), text: hstring.RenderedHTML(label),
plainText: label, plainText: label,
AttributesHolder: attributes.Empty, AttributesHolder: attributes.Empty,
}, },
@ -442,7 +442,7 @@ func (r *hookedRenderer) renderHeading(w util.BufWriter, source []byte, node ast
pageInner: pageInner, pageInner: pageInner,
level: n.Level, level: n.Level,
anchor: string(anchor), anchor: string(anchor),
text: hstring.RenderedString(text), text: hstring.RenderedHTML(text),
plainText: string(n.Text(source)), plainText: string(n.Text(source)),
AttributesHolder: attributes.New(n.Attributes(), attributes.AttributesOwnerGeneral), AttributesHolder: attributes.New(n.Attributes(), attributes.AttributesOwnerGeneral),
}, },

View file

@ -132,7 +132,7 @@ func (r *htmlRenderer) renderCell(w util.BufWriter, source []byte, node ast.Node
alignment = "left" alignment = "left"
} }
cell := hooks.TableCell{Text: hstring.RenderedString(text), Alignment: alignment} cell := hooks.TableCell{Text: hstring.RenderedHTML(text), Alignment: alignment}
if node.Parent().Kind() == gast.KindTableHeader { if node.Parent().Kind() == gast.KindTableHeader {
table.THead[len(table.THead)-1] = append(table.THead[len(table.THead)-1], cell) table.THead[len(table.THead)-1] = append(table.THead[len(table.THead)-1], cell)

View file

@ -32,7 +32,7 @@ title = true
| Item | In Stock | Price | | Item | In Stock | Price |
| :---------------- | :------: | ----: | | :---------------- | :------: | ----: |
| Python Hat | True | 23.99 | | Python Hat | True | 23.99 |
| SQL Hat | True | 23.99 | | SQL **Hat** | True | 23.99 |
| Codecademy Tee | False | 19.99 | | Codecademy Tee | False | 19.99 |
| Codecademy Hoodie | False | 42.99 | | Codecademy Hoodie | False | 42.99 |
{.foo foo="bar"} {.foo foo="bar"}
@ -61,7 +61,7 @@ Attributes: {{ .Attributes }}|
b.AssertFileContent("public/p1/index.html", b.AssertFileContent("public/p1/index.html",
"Attributes: map[class:foo foo:bar]|", "Attributes: map[class:foo foo:bar]|",
"table-0-thead: 0: 0: left: Item| 1: center: In Stock| 2: right: Price|$", "table-0-thead: 0: 0: left: Item| 1: center: In Stock| 2: right: Price|$",
"table-0-tbody: 0: 0: left: Python Hat| 1: center: True| 2: right: 23.99| 1: 0: left: SQL Hat| 1: center: True| 2: right: 23.99| 2: 0: left: Codecademy Tee| 1: center: False| 2: right: 19.99| 3: 0: left: Codecademy Hoodie| 1: center: False| 2: right: 42.99|$", "table-0-tbody: 0: 0: left: Python Hat| 1: center: True| 2: right: 23.99| 1: 0: left: SQL <strong>Hat</strong>| 1: center: True| 2: right: 23.99| 2: 0: left: Codecademy Tee| 1: center: False| 2: right: 19.99| 3: 0: left: Codecademy Hoodie| 1: center: False| 2: right: 42.99|$",
) )
b.AssertFileContent("public/p1/index.html", b.AssertFileContent("public/p1/index.html",

View file

@ -25,5 +25,5 @@
{{- printf " %s=%q" $k $v | safeHTMLAttr -}} {{- printf " %s=%q" $k $v | safeHTMLAttr -}}
{{- end -}} {{- end -}}
{{- end -}} {{- end -}}
>{{ .Text | safeHTML }}</a> >{{ .Text }}</a>
{{- /**/ -}} {{- /**/ -}}

View file

@ -9,7 +9,7 @@
<tr> <tr>
{{- range . }} {{- range . }}
<th {{ printf "style=%q" (printf "text-align: %s" .Alignment) | safeHTMLAttr }}> <th {{ printf "style=%q" (printf "text-align: %s" .Alignment) | safeHTMLAttr }}>
{{- .Text | safeHTML -}} {{- .Text -}}
</th> </th>
{{- end }} {{- end }}
</tr> </tr>
@ -20,7 +20,7 @@
<tr> <tr>
{{- range . }} {{- range . }}
<td {{ printf "style=%q" (printf "text-align: %s" .Alignment) | safeHTMLAttr }}> <td {{ printf "style=%q" (printf "text-align: %s" .Alignment) | safeHTMLAttr }}>
{{- .Text | safeHTML -}} {{- .Text -}}
</td> </td>
{{- end }} {{- end }}
</tr> </tr>