diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2018-11-01 10:39:44 +0100 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2018-11-01 21:06:35 +0100 |
commit | 33a7b36fd42ee31dd79115ec6639bed24247332f (patch) | |
tree | 95488b5d51a2a2f9375f812cd807df0e04034a84 /hugolib/page_content.go | |
parent | 6180c85fb8f95e01446b74c50cab3f0480305fe4 (diff) |
hugolib: Add .Position to shortcode
To allow for better error logging in shortcodes. Note that this may be expensive to calculate, so this is primarily for error situations.
See #5371
Diffstat (limited to 'hugolib/page_content.go')
-rw-r--r-- | hugolib/page_content.go | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/hugolib/page_content.go b/hugolib/page_content.go index 5a8258279..b3e8668ef 100644 --- a/hugolib/page_content.go +++ b/hugolib/page_content.go @@ -17,6 +17,8 @@ import ( "bytes" "io" + "github.com/gohugoio/hugo/source" + errors "github.com/pkg/errors" bp "github.com/gohugoio/hugo/bufferpool" @@ -68,7 +70,7 @@ func (p *Page) mapContent() error { iter := p.source.parsed.Iterator() fail := func(err error, i pageparser.Item) error { - return parseError(err, iter.Input(), i.Pos) + return p.parseError(err, iter.Input(), i.Pos) } // the parser is guaranteed to return items in proper order or fail, so … @@ -194,15 +196,30 @@ func (p *Page) parse(reader io.Reader) error { return nil } -func parseError(err error, input []byte, pos int) error { +func (p *Page) parseError(err error, input []byte, offset int) error { if herrors.UnwrapFileError(err) != nil { // Use the most specific location. return err } + pos := p.posFromInput(input, offset) + return herrors.NewFileError("md", -1, pos.LineNumber, pos.ColumnNumber, err) + +} + +func (p *Page) posFromInput(input []byte, offset int) source.Position { lf := []byte("\n") - input = input[:pos] + input = input[:offset] lineNumber := bytes.Count(input, lf) + 1 endOfLastLine := bytes.LastIndex(input, lf) - return herrors.NewFileError("md", -1, lineNumber, pos-endOfLastLine, err) + return source.Position{ + Filename: p.pathOrTitle(), + LineNumber: lineNumber, + ColumnNumber: offset - endOfLastLine, + Offset: offset, + } +} + +func (p *Page) posFromPage(offset int) source.Position { + return p.posFromInput(p.source.parsed.Input(), offset) } |