diff --git a/decode_test.go b/decode_test.go index 530c8271..1e0f2466 100644 --- a/decode_test.go +++ b/decode_test.go @@ -2048,3 +2048,20 @@ func TestDecoder_LiteralWithNewLine(t *testing.T) { } } } + +func TestDecoder_TabCharacterAtRight(t *testing.T) { + yml := ` +- a: [2 , 2] + b: [2 , 2] + c: [2 , 2]` + var v []map[string][]int + if err := yaml.Unmarshal([]byte(yml), &v); err != nil { + t.Fatal(err) + } + if len(v) != 1 { + t.Fatalf("failed to unmarshal %+v", v) + } + if len(v[0]) != 3 { + t.Fatalf("failed to unmarshal %+v", v) + } +} diff --git a/scanner/context.go b/scanner/context.go index 32fceb9a..e629a5c2 100644 --- a/scanner/context.go +++ b/scanner/context.go @@ -88,14 +88,14 @@ func (c *Context) addBuf(r rune) { return } c.buf = append(c.buf, r) - if r != ' ' { + if r != ' ' && r != '\t' { c.notSpaceCharPos = len(c.buf) } } func (c *Context) addOriginBuf(r rune) { c.obuf = append(c.obuf, r) - if r != ' ' { + if r != ' ' && r != '\t' { c.notSpaceOrgCharPos = len(c.obuf) } } diff --git a/scanner/scanner.go b/scanner/scanner.go index d92c23c7..2ab89803 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -360,7 +360,7 @@ func (s *Scanner) scanLiteral(ctx *Context, c rune) { func (s *Scanner) scanLiteralHeader(ctx *Context) (pos int, err error) { header := ctx.currentChar() ctx.addOriginBuf(header) - ctx.progress(1) // skip '|' or '<' character + ctx.progress(1) // skip '|' or '>' character for idx, c := range ctx.src[ctx.idx:] { pos = idx ctx.addOriginBuf(c)