diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2022-02-26 12:52:06 +0100 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2022-02-26 21:54:36 +0100 |
commit | 928a89696273b1a5defa0e85115c9bd0e167cbf0 (patch) | |
tree | 3c9eb330385a01e230036dc018817cb50e65cbef /hugolib | |
parent | 2e54c009331dc8c6260d16a55d4a13cfff55054d (diff) |
markup/goldmark: Add Position to CodeblockContext
But note that this is not particulary fast and the recommendad usage is error logging only.
Updates #9574
Diffstat (limited to 'hugolib')
-rw-r--r-- | hugolib/page__per_output.go | 21 | ||||
-rw-r--r-- | hugolib/site.go | 7 |
2 files changed, 27 insertions, 1 deletions
diff --git a/hugolib/page__per_output.go b/hugolib/page__per_output.go index 29beb672e..4067e827f 100644 --- a/hugolib/page__per_output.go +++ b/hugolib/page__per_output.go @@ -23,6 +23,7 @@ import ( "sync" "unicode/utf8" + "github.com/gohugoio/hugo/common/text" "github.com/gohugoio/hugo/identity" "github.com/mitchellh/mapstructure" "github.com/pkg/errors" @@ -430,6 +431,25 @@ func (p *pageContentOutput) initRenderHooks() error { renderCache := make(map[cacheKey]interface{}) var renderCacheMu sync.Mutex + resolvePosition := func(ctx interface{}) text.Position { + var offset int + + switch v := ctx.(type) { + case hooks.CodeblockContext: + offset = bytes.Index(p.p.source.parsed.Input(), []byte(v.Code())) + } + + pos := p.p.posFromInput(p.p.source.parsed.Input(), offset) + + if pos.LineNumber > 0 { + // Move up to the code fence delimiter. + // This is in line with how we report on shortcodes. + pos.LineNumber = pos.LineNumber - 1 + } + + return pos + } + p.renderHooks.getRenderer = func(tp hooks.RendererType, id interface{}) interface{} { renderCacheMu.Lock() defer renderCacheMu.Unlock() @@ -510,6 +530,7 @@ func (p *pageContentOutput) initRenderHooks() error { templateHandler: p.p.s.Tmpl(), SearchProvider: templ.(identity.SearchProvider), templ: templ, + resolvePosition: resolvePosition, } renderCache[key] = r return r diff --git a/hugolib/site.go b/hugolib/site.go index d78a4e10c..ebda29f46 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -1778,7 +1778,8 @@ var infoOnMissingLayout = map[string]bool{ type hookRendererTemplate struct { templateHandler tpl.TemplateHandler identity.SearchProvider - templ tpl.Template + templ tpl.Template + resolvePosition func(ctx interface{}) text.Position } func (hr hookRendererTemplate) RenderLink(w io.Writer, ctx hooks.LinkContext) error { @@ -1793,6 +1794,10 @@ func (hr hookRendererTemplate) RenderCodeblock(w hugio.FlexiWriter, ctx hooks.Co return hr.templateHandler.Execute(hr.templ, w, ctx) } +func (hr hookRendererTemplate) ResolvePosition(ctx interface{}) text.Position { + return hr.resolvePosition(ctx) +} + func (s *Site) renderForTemplate(name, outputFormat string, d interface{}, w io.Writer, templ tpl.Template) (err error) { if templ == nil { s.logMissingLayout(name, "", "", outputFormat) |