summaryrefslogtreecommitdiffstats
path: root/hugolib
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2022-02-26 12:52:06 +0100
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2022-02-26 21:54:36 +0100
commit928a89696273b1a5defa0e85115c9bd0e167cbf0 (patch)
tree3c9eb330385a01e230036dc018817cb50e65cbef /hugolib
parent2e54c009331dc8c6260d16a55d4a13cfff55054d (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.go21
-rw-r--r--hugolib/site.go7
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)