diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2017-07-08 10:56:56 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2017-07-08 10:56:56 +0200 |
commit | 84db6c74a084d2b52117b999d4ec343cd3389a68 (patch) | |
tree | 17dc4ece4433e9a58d2af7657fbf07f1ce9db889 /parser | |
parent | e0cf2e05bbdcb8b4a3f875df84a878f4ca80e904 (diff) |
parser: Fix issue with escaped JSON front matter
Fixes #3682
Diffstat (limited to 'parser')
-rw-r--r-- | parser/page.go | 18 | ||||
-rw-r--r-- | parser/parse_frontmatter_test.go | 1 |
2 files changed, 10 insertions, 9 deletions
diff --git a/parser/page.go b/parser/page.go index 9d633e29d..f17ba1767 100644 --- a/parser/page.go +++ b/parser/page.go @@ -300,12 +300,12 @@ func determineDelims(firstLine []byte) (left, right []byte) { // function. func extractFrontMatterDelims(r *bufio.Reader, left, right []byte) (fm []byte, err error) { var ( - c byte - buf bytes.Buffer - level int - sameDelim = bytes.Equal(left, right) - inQuote bool - escaped bool + c byte + buf bytes.Buffer + level int + sameDelim = bytes.Equal(left, right) + inQuote bool + escapeState int ) // Frontmatter must start with a delimiter. To check it first, // pre-reads beginning delimiter length - 1 bytes from Reader @@ -334,12 +334,12 @@ func extractFrontMatterDelims(r *bufio.Reader, left, right []byte) (fm []byte, e switch c { case '"': - if !escaped { + if escapeState != 1 { inQuote = !inQuote } - escaped = false + escapeState = 0 case '\\': - escaped = true + escapeState++ case left[len(left)-1]: if sameDelim { // YAML, TOML case if bytes.HasSuffix(buf.Bytes(), left) && (buf.Len() == len(left) || buf.Bytes()[buf.Len()-len(left)-1] == '\n') { diff --git a/parser/parse_frontmatter_test.go b/parser/parse_frontmatter_test.go index e2722f788..b7764ca2d 100644 --- a/parser/parse_frontmatter_test.go +++ b/parser/parse_frontmatter_test.go @@ -304,6 +304,7 @@ func TestExtractFrontMatterDelim(t *testing.T) { {`{ "title": "\"{", "other": "\"{}" }`, `{ "title": "\"{", "other": "\"{}" }`, noErrExpected}, {`{ "title": "\"Foo\"" }`, `{ "title": "\"Foo\"" }`, noErrExpected}, {`{ "title": "\"Foo\"\"" }`, `{ "title": "\"Foo\"\"" }`, noErrExpected}, + {`{ "url": "http:\/\/example.com\/play\/url?id=1" }`, `{ "url": "http:\/\/example.com\/play\/url?id=1" }`, noErrExpected}, } for i, test := range tests { |