Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
ae364aa
ListItem Render Hook
alexanderhansen Apr 26, 2022
acc3263
Update Tests
alexanderhansen May 2, 2022
4a659ee
Merge branch 'gohugoio:master' into listitem-render-hook
alexanderhansen May 2, 2022
106caac
ListItem Render Hook
alexanderhansen Apr 26, 2022
e751003
Update Tests
alexanderhansen May 2, 2022
b143fa6
Merge branch 'listitem-render-hook' of https://github.com/alexanderha…
alexanderhansen May 2, 2022
5e0eba9
List Render Hook
alexanderhansen May 2, 2022
5130a3d
With ordered parameter
alexanderhansen May 2, 2022
c025e3f
ListItem has no attributes
alexanderhansen May 2, 2022
156e671
Test for attributes
alexanderhansen May 2, 2022
5757d1d
First and Last sibling check for listitems
alexanderhansen May 5, 2022
1c954b9
Borrowed from Goldmark
alexanderhansen May 5, 2022
0de16a5
ListItem Render Hook
alexanderhansen Apr 26, 2022
b04f772
Update Tests
alexanderhansen May 2, 2022
595c696
List Render Hook
alexanderhansen May 2, 2022
9d3616a
With ordered parameter
alexanderhansen May 2, 2022
5e38325
ListItem has no attributes
alexanderhansen May 2, 2022
6ccad18
Test for attributes
alexanderhansen May 2, 2022
433d9cf
First and Last sibling check for listitems
alexanderhansen May 5, 2022
600e5a5
Borrowed from Goldmark
alexanderhansen May 5, 2022
4266674
Merge branch 'listitem-render-hook' of https://github.com/alexanderha…
alexanderhansen May 5, 2022
9199981
docs
alexanderhansen May 5, 2022
db2a4ca
Delete devcontainer.json
alexanderhansen May 5, 2022
3cb278b
Merge branch 'gohugoio:master' into listitem-render-hook
alexanderhansen Aug 3, 2022
c85708b
Merge branch 'gohugoio:master' into listitem-render-hook
alexanderhansen Dec 8, 2022
398be2d
Merge branch 'gohugoio:master' into listitem-render-hook
alexanderhansen Apr 6, 2023
3b2b6b1
Add Context to Renderer
alexanderhansen Apr 6, 2023
967447f
Merge branch 'gohugoio:master' into listitem-render-hook
alexanderhansen Apr 14, 2023
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
List Render Hook
  • Loading branch information
alexanderhansen committed May 5, 2022
commit 595c696f14fb51dadb2851f7daf9088a77584aa4
2 changes: 2 additions & 0 deletions hugolib/page__per_output.go
Original file line number Diff line number Diff line change
Expand Up @@ -493,6 +493,8 @@ func (p *pageContentOutput) initRenderHooks() error {
}
case hooks.ListItemRendererType:
layoutDescriptor.Kind = "render-listitem"
case hooks.ListRendererType:
layoutDescriptor.Kind = "render-listitem"
}

getHookTemplate := func(f output.Format) (tpl.Template, bool) {
Expand Down
4 changes: 4 additions & 0 deletions hugolib/site.go
Original file line number Diff line number Diff line change
Expand Up @@ -1808,6 +1808,10 @@ func (hr hookRendererTemplate) RenderListItem(w io.Writer, ctx hooks.ListItemCon
return hr.templateHandler.Execute(hr.templ, w, ctx)
}

func (hr hookRendererTemplate) RenderList(w io.Writer, ctx hooks.ListContext) error {
return hr.templateHandler.Execute(hr.templ, w, ctx)
}

func (hr hookRendererTemplate) ResolvePosition(ctx any) text.Position {
return hr.resolvePosition(ctx)
}
Expand Down
16 changes: 16 additions & 0 deletions markup/converter/hooks/hooks.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,21 @@ type ListItemRenderer interface {
identity.Provider
}

type ListContext interface {
Page() interface{}
Text() hstring.RenderedString
PlainText() string

Parent() interface{}

AttributesProvider
}

type ListRenderer interface {
RenderList(w io.Writer, ctx ListContext) error
identity.Provider
}

// ElementPositionResolver provides a way to resolve the start Position
// of a markdown element in the original source document.
// This may be both slow and approximate, so should only be
Expand All @@ -123,6 +138,7 @@ const (
HeadingRendererType
CodeBlockRendererType
ListItemRendererType
ListRendererType
)

type GetRendererFunc func(t RendererType, id any) any
95 changes: 95 additions & 0 deletions markup/goldmark/render_hooks.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ package goldmark

import (
"bytes"
"fmt"
"strings"

"github.com/gohugoio/hugo/common/types/hstring"
Expand Down Expand Up @@ -141,6 +142,30 @@ func (ctx listItemContext) Parent() interface{} {
return ctx.parent
}

type listContext struct {
page interface{}
text hstring.RenderedString
plainText string
parent interface{}
*attributes.AttributesHolder
}

func (ctx listContext) Page() interface{} {
return ctx.page
}

func (ctx listContext) Text() hstring.RenderedString {
return ctx.text
}

func (ctx listContext) PlainText() string {
return ctx.plainText
}

func (ctx listContext) Parent() interface{} {
return ctx.parent
}

type hookedRenderer struct {
linkifyProtocol []byte
html.Config
Expand All @@ -157,6 +182,7 @@ func (r *hookedRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer)
reg.Register(ast.KindImage, r.renderImage)
reg.Register(ast.KindHeading, r.renderHeading)
reg.Register(ast.KindListItem, r.renderListItem)
reg.Register(ast.KindList, r.renderList)
}

func (r *hookedRenderer) renderImage(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
Expand Down Expand Up @@ -506,6 +532,75 @@ func (r *hookedRenderer) renderListItemDefault(w util.BufWriter, source []byte,
return ast.WalkContinue, nil
}

func (r *hookedRenderer) renderListDefault(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
n := node.(*ast.List)
tag := "ul"
if n.IsOrdered() {
tag = "ol"
}
if entering {
_ = w.WriteByte('<')
_, _ = w.WriteString(tag)
if n.IsOrdered() && n.Start != 1 {
fmt.Fprintf(w, " start=\"%d\"", n.Start)
}
if n.Attributes() != nil {
html.RenderAttributes(w, n, html.ListAttributeFilter)
}
_, _ = w.WriteString(">\n")
} else {
_, _ = w.WriteString("</")
_, _ = w.WriteString(tag)
_, _ = w.WriteString(">\n")
}
return ast.WalkContinue, nil
}

func (r *hookedRenderer) renderList(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
n := node.(*ast.List)
n.FirstChild()
var hli hooks.ListRenderer

ctx, ok := w.(*render.Context)
if ok {
h := ctx.RenderContext().GetRenderer(hooks.ListItemRendererType, nil)
ok = h != nil
if ok {
hli = h.(hooks.ListRenderer)
}
}

if !ok {
return r.renderListDefault(w, source, node, entering)
}

if entering {
// Store the current pos so we can capture the rendered text.
ctx.PushPos(ctx.Buffer.Len())
return ast.WalkContinue, nil
}

pos := ctx.PopPos()
text := ctx.Buffer.Bytes()[pos:]
ctx.Buffer.Truncate(pos)

err := hli.RenderList(
w,
listItemContext{
page: ctx.DocumentContext().Document,
text: hstring.RenderedString(text),
plainText: string(n.Text(source)),
parent: n.Parent(),
AttributesHolder: attributes.New(n.Attributes(), attributes.AttributesOwnerGeneral),
},
)

ctx.AddIdentity(hli)

return ast.WalkContinue, err
//return r.renderListDefault(w, source, node, entering)
}

type links struct {
cfg goldmark_config.Config
}
Expand Down