From 8d28686edcf19b5dd067482b72fdc1b93c99ef7f Mon Sep 17 00:00:00 2001 From: Jeff Hodges Date: Sat, 1 Aug 2015 22:24:22 -0700 Subject: [PATCH] Trim trailing spaces from YAML and TOML delimiters When someone hits space after typing "---" (or "+++") but before they hit return, hugo silently failed to parse the file. This corrects that. --- parser/page.go | 23 +++++++++-------------- parser/parse_frontmatter_test.go | 5 +++++ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/parser/page.go b/parser/page.go index 77d40a60..21014888 100644 --- a/parser/page.go +++ b/parser/page.go @@ -5,6 +5,7 @@ import ( "bytes" "fmt" "io" + "regexp" "unicode" ) @@ -22,13 +23,9 @@ const ( ) var ( - delims = [][]byte{ - []byte(YAML_DELIM_UNIX), - []byte(YAML_DELIM_DOS), - []byte(TOML_DELIM_UNIX), - []byte(TOML_DELIM_DOS), - []byte(JSON_LEAD), - } + delims = regexp.MustCompile( + "^(" + regexp.QuoteMeta(YAML_DELIM) + `\s*\n|` + regexp.QuoteMeta(TOML_DELIM) + `\s*\n|` + regexp.QuoteMeta(JSON_LEAD) + ")", + ) UnixEnding = []byte("\n") DosEnding = []byte("\r\n") @@ -148,13 +145,7 @@ func shouldRender(lead []byte) (frontmatter bool) { } func isFrontMatterDelim(data []byte) bool { - for _, d := range delims { - if bytes.HasPrefix(data, d) { - return true - } - } - - return false + return delims.Match(data) } func determineDelims(firstLine []byte) (left, right []byte) { @@ -217,6 +208,7 @@ func extractFrontMatterDelims(r *bufio.Reader, left, right []byte) (fm FrontMatt case left[len(left)-1]: if sameDelim { // YAML, TOML case if bytes.HasSuffix(buf.Bytes(), left) { + nextByte: c, err = r.ReadByte() if err != nil { // It is ok that the end delimiter ends with EOF @@ -227,6 +219,9 @@ func extractFrontMatterDelims(r *bufio.Reader, left, right []byte) (fm FrontMatt switch c { case '\n': // ok + case ' ': + // Consume this byte and try to match again + goto nextByte case '\r': if err = buf.WriteByte(c); err != nil { return nil, err diff --git a/parser/parse_frontmatter_test.go b/parser/parse_frontmatter_test.go index deb885f1..9ed2d8e5 100644 --- a/parser/parse_frontmatter_test.go +++ b/parser/parse_frontmatter_test.go @@ -200,6 +200,8 @@ func TestPageHasFrontMatter(t *testing.T) { {[]byte("---"), false}, {[]byte("---\n"), true}, {[]byte("---\n"), true}, + {[]byte("--- \n"), true}, + {[]byte("--- \n"), true}, {[]byte{'a'}, false}, {[]byte{'{'}, true}, {[]byte("{\n "), true}, @@ -230,7 +232,10 @@ func TestExtractFrontMatter(t *testing.T) { {"---\nblar\n-\n", nil, false}, {"---\nralb\n---\n", []byte("---\nralb\n---\n"), true}, {"---\neof\n---", []byte("---\neof\n---"), true}, + {"--- \neof\n---", []byte("---\neof\n---"), true}, {"---\nminc\n---\ncontent", []byte("---\nminc\n---\n"), true}, + {"---\nminc\n--- \ncontent", []byte("---\nminc\n---\n"), true}, + {"--- \nminc\n--- \ncontent", []byte("---\nminc\n---\n"), true}, {"---\ncnim\n---\ncontent\n", []byte("---\ncnim\n---\n"), true}, {"---\ntitle: slug doc 2\nslug: slug-doc-2\n---\ncontent\n", []byte("---\ntitle: slug doc 2\nslug: slug-doc-2\n---\n"), true}, } -- 2.30.2