diff --git a/lexer/lexer_test.go b/lexer/lexer_test.go index 03b741f..0d8f648 100644 --- a/lexer/lexer_test.go +++ b/lexer/lexer_test.go @@ -543,6 +543,49 @@ c: true`, }, }, }, + { + name: "issue326", + src: `a: | + Text +b: 1`, + expect: []testToken{ + { + line: 1, + column: 1, + value: "a", + }, + { + line: 1, + column: 2, + value: ":", + }, + { + line: 1, + column: 4, + value: "|", + }, + { + line: 2, + column: 3, + value: "Text\n", + }, + { + line: 3, + column: 1, + value: "b", + }, + { + line: 3, + column: 2, + value: ":", + }, + { + line: 3, + column: 4, + value: "1", + }, + }, + }, } for _, tc := range tests { diff --git a/scanner/scanner.go b/scanner/scanner.go index cf58bfb..066b795 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -61,13 +61,25 @@ func (s *Scanner) bufferedToken(ctx *Context) *token.Token { s.savedPos = nil return tk } - size := len(ctx.buf) + line := s.line + column := s.column - len(ctx.buf) + level := s.indentLevel + if ctx.isSaveIndentMode() { + line -= s.newLineCount(ctx.buf) + column = strings.Index(string(ctx.obuf), string(ctx.buf)) + 1 + // Since we are in a literal, folded or raw folded + // we can use the indent level from the last token. + last := ctx.lastToken() + if last != nil { // The last token should never be nil here. + level = last.Position.IndentLevel + 1 + } + } return ctx.bufferedToken(&token.Position{ - Line: s.line, - Column: s.column - size, - Offset: s.offset - size, + Line: line, + Column: column, + Offset: s.offset - len(ctx.buf), IndentNum: s.indentNum, - IndentLevel: s.indentLevel, + IndentLevel: level, }) }