summaryrefslogtreecommitdiffstats
path: root/hugolib/shortcode.go
diff options
context:
space:
mode:
Diffstat (limited to 'hugolib/shortcode.go')
-rw-r--r--hugolib/shortcode.go22
1 files changed, 19 insertions, 3 deletions
diff --git a/hugolib/shortcode.go b/hugolib/shortcode.go
index 024a919ed..41d8d76c4 100644
--- a/hugolib/shortcode.go
+++ b/hugolib/shortcode.go
@@ -19,6 +19,8 @@ import (
"fmt"
"html/template"
+ "github.com/gohugoio/hugo/source"
+
"reflect"
"regexp"
@@ -53,9 +55,23 @@ type ShortcodeWithPage struct {
// this ordinal will represent the position of this shortcode in the page content.
Ordinal int
+ // pos is the position in bytes in the source file. Used for error logging.
+ posInit sync.Once
+ posOffset int
+ pos source.Position
+
scratch *maps.Scratch
}
+// Position returns this shortcode's detailed position. Note that this information
+// may be expensive to calculate, so only use this in error situations.
+func (scp *ShortcodeWithPage) Position() source.Position {
+ scp.posInit.Do(func() {
+ scp.pos = scp.Page.posFromPage(scp.posOffset)
+ })
+ return scp.pos
+}
+
// Site returns information about the current site.
func (scp *ShortcodeWithPage) Site() *SiteInfo {
return scp.Page.Site
@@ -313,7 +329,7 @@ func renderShortcode(
return "", nil
}
- data := &ShortcodeWithPage{Ordinal: sc.ordinal, Params: sc.params, Page: p, Parent: parent}
+ data := &ShortcodeWithPage{Ordinal: sc.ordinal, posOffset: sc.pos, Params: sc.params, Page: p, Parent: parent}
if sc.params != nil {
data.IsNamedParams = reflect.TypeOf(sc.params).Kind() == reflect.Map
}
@@ -463,7 +479,7 @@ func (s *shortcodeHandler) executeShortcodesForDelta(p *PageWithoutContent) erro
if err != nil {
sc := s.shortcodes.getShortcode(k.(scKey).ShortcodePlaceholder)
if sc != nil {
- err = p.errWithFileContext(parseError(_errors.Wrapf(err, "failed to render shortcode %q", sc.name), p.source.parsed.Input(), sc.pos))
+ err = p.errWithFileContext(p.parseError(_errors.Wrapf(err, "failed to render shortcode %q", sc.name), p.source.parsed.Input(), sc.pos))
}
p.s.SendError(err)
@@ -505,7 +521,7 @@ func (s *shortcodeHandler) extractShortcode(ordinal int, pt *pageparser.Iterator
var nestedOrdinal = 0
fail := func(err error, i pageparser.Item) error {
- return parseError(err, pt.Input(), i.Pos)
+ return p.parseError(err, pt.Input(), i.Pos)
}
Loop: