summaryrefslogtreecommitdiffstats
path: root/parser
diff options
context:
space:
mode:
authorJeff Hodges <jeff@somethingsimilar.com>2015-08-01 22:24:22 -0700
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2015-08-02 14:46:46 +0200
commit8d28686edcf19b5dd067482b72fdc1b93c99ef7f (patch)
treec562bf7e2f7e7ea1e440263376a19a0c5888a79d /parser
parent211b757fee6d587a365104652ef3b1d335b702fa (diff)
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.
Diffstat (limited to 'parser')
-rw-r--r--parser/page.go23
-rw-r--r--parser/parse_frontmatter_test.go5
2 files changed, 14 insertions, 14 deletions
diff --git a/parser/page.go b/parser/page.go
index 77d40a602..21014888f 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 deb885f12..9ed2d8e5f 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},
}