URI: 
       parser: Fix handling of JSON front matter with escaped quotes - hugo - [fork] hugo port for 9front
  HTML git clone git@git.drkhsh.at/hugo.git
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
   DIR README
   DIR LICENSE
       ---
   DIR commit e10e51a00827b9fdc1bee51439fef05afc529831
   DIR parent 34c566773a1364077e1397daece85b22948dc721
  HTML Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
       Date:   Mon,  3 Jul 2017 09:00:17 +0200
       
       parser: Fix handling of JSON front matter with escaped quotes
       
       Fixes #3661
       
       Diffstat:
         M parser/page.go                      |       9 ++++++++-
         M parser/parse_frontmatter_test.go    |       7 ++++++-
       
       2 files changed, 14 insertions(+), 2 deletions(-)
       ---
   DIR diff --git a/parser/page.go b/parser/page.go
       @@ -305,6 +305,7 @@ func extractFrontMatterDelims(r *bufio.Reader, left, right []byte) (fm []byte, e
                        level     int
                        sameDelim = bytes.Equal(left, right)
                        inQuote   bool
       +                escaped   bool
                )
                // Frontmatter must start with a delimiter. To check it first,
                // pre-reads beginning delimiter length - 1 bytes from Reader
       @@ -333,7 +334,12 @@ func extractFrontMatterDelims(r *bufio.Reader, left, right []byte) (fm []byte, e
        
                        switch c {
                        case '"':
       -                        inQuote = !inQuote
       +                        if !escaped {
       +                                inQuote = !inQuote
       +                        }
       +                        escaped = false
       +                case '\\':
       +                        escaped = true
                        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') {
       @@ -396,6 +402,7 @@ func extractFrontMatterDelims(r *bufio.Reader, left, right []byte) (fm []byte, e
        
                                return buf.Bytes(), nil
                        }
       +
                }
        }
        
   DIR diff --git a/parser/parse_frontmatter_test.go b/parser/parse_frontmatter_test.go
       @@ -299,6 +299,11 @@ func TestExtractFrontMatterDelim(t *testing.T) {
                        // Issue #3511
                        {`{ "title": "{" }`, `{ "title": "{" }`, noErrExpected},
                        {`{ "title": "{}" }`, `{ "title": "{}" }`, noErrExpected},
       +                // Issue #3661
       +                {`{ "title": "\"" }`, `{ "title": "\"" }`, noErrExpected},
       +                {`{ "title": "\"{", "other": "\"{}" }`, `{ "title": "\"{", "other": "\"{}" }`, noErrExpected},
       +                {`{ "title": "\"Foo\"" }`, `{ "title": "\"Foo\"" }`, noErrExpected},
       +                {`{ "title": "\"Foo\"\"" }`, `{ "title": "\"Foo\"\"" }`, noErrExpected},
                }
        
                for i, test := range tests {
       @@ -310,7 +315,7 @@ func TestExtractFrontMatterDelim(t *testing.T) {
                        }
                        if !bytes.Equal(fm, []byte(test.extracted)) {
                                t.Logf("\n%q\n", string(test.frontmatter))
       -                        t.Errorf("[%d] Frontmatter did not match:\nexp: %q\ngot: %q", i, string(test.extracted), fm)
       +                        t.Errorf("[%d] Frontmatter did not match:\nexp: %q\ngot:  %q", i, string(test.extracted), fm)
                        }
                }
        }