summaryrefslogtreecommitdiffstats
path: root/parser
diff options
context:
space:
mode:
authorSven Dowideit <SvenDowideit@home.org.au>2015-09-23 14:43:17 +1000
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2015-09-25 18:32:32 +0200
commita1e32439fbab314cab6f5c3ecb962b8ac7bd9069 (patch)
tree658e49a985c94360731e211ed0309697c09703fc /parser
parenta43b037651328a94092bc054cbb5d0211dee7b1c (diff)
Allow for any (short) line begining or ending with html comment
Fixes #1428
Diffstat (limited to 'parser')
-rw-r--r--parser/page.go95
1 files changed, 81 insertions, 14 deletions
diff --git a/parser/page.go b/parser/page.go
index c3d34a7f0..302ef488f 100644
--- a/parser/page.go
+++ b/parser/page.go
@@ -6,20 +6,23 @@ import (
"fmt"
"io"
"regexp"
+ "strings"
"unicode"
)
const (
- HTML_LEAD = "<"
- YAML_LEAD = "-"
- YAML_DELIM_UNIX = "---\n"
- YAML_DELIM_DOS = "---\r\n"
- YAML_DELIM = "---"
- TOML_LEAD = "+"
- TOML_DELIM_UNIX = "+++\n"
- TOML_DELIM_DOS = "+++\r\n"
- TOML_DELIM = "+++"
- JSON_LEAD = "{"
+ HTML_LEAD = "<"
+ YAML_LEAD = "-"
+ YAML_DELIM_UNIX = "---\n"
+ YAML_DELIM_DOS = "---\r\n"
+ YAML_DELIM = "---"
+ TOML_LEAD = "+"
+ TOML_DELIM_UNIX = "+++\n"
+ TOML_DELIM_DOS = "+++\r\n"
+ TOML_DELIM = "+++"
+ JSON_LEAD = "{"
+ HTML_COMMENT_START = "<!--"
+ HTML_COMMENT_END = "-->"
)
var (
@@ -79,6 +82,9 @@ func ReadFrom(r io.Reader) (p Page, err error) {
if err = chompWhitespace(reader); err != nil && err != io.EOF {
return
}
+ if err = chompFrontmatterStartComment(reader); err != nil && err != io.EOF {
+ return
+ }
firstLine, err := peekLine(reader)
if err != nil && err != io.EOF {
@@ -120,6 +126,65 @@ func chompWhitespace(r io.RuneScanner) (err error) {
}
}
+func chompFrontmatterStartComment(r *bufio.Reader) (err error) {
+ candidate, err := r.Peek(32)
+ if err != nil {
+ return err
+ }
+
+ str := string(candidate)
+ if strings.HasPrefix(str, HTML_COMMENT_START) {
+ lineEnd := strings.IndexAny(str, "\n")
+ if lineEnd == -1 {
+ //TODO: if we can't find it, Peek more?
+ return nil
+ }
+ testStr := strings.TrimSuffix(str[0:lineEnd], "\r")
+ if strings.Index(testStr, HTML_COMMENT_END) != -1 {
+ return nil
+ }
+ buf := make([]byte, lineEnd)
+ if _, err = r.Read(buf); err != nil {
+ return
+ }
+ if err = chompWhitespace(r); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
+func chompFrontmatterEndComment(r *bufio.Reader) (err error) {
+ candidate, err := r.Peek(32)
+ if err != nil {
+ return err
+ }
+
+ str := string(candidate)
+ lineEnd := strings.IndexAny(str, "\n")
+ if lineEnd == -1 {
+ return nil
+ }
+ testStr := strings.TrimSuffix(str[0:lineEnd], "\r")
+ if strings.Index(testStr, HTML_COMMENT_START) != -1 {
+ return nil
+ }
+
+ //TODO: if we can't find it, Peek more?
+ if strings.HasSuffix(testStr, HTML_COMMENT_END) {
+ buf := make([]byte, lineEnd)
+ if _, err = r.Read(buf); err != nil {
+ return
+ }
+ if err = chompWhitespace(r); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
+
func peekLine(r *bufio.Reader) (line []byte, err error) {
firstFive, err := r.Peek(5)
if err != nil {
@@ -254,11 +319,13 @@ func extractFrontMatterDelims(r *bufio.Reader, left, right []byte) (fm FrontMatt
if level == 0 {
// Consumes white spaces immediately behind frontmatter
- if err = chompWhitespace(r); err != nil {
- if err != io.EOF {
- return nil, err
- }
+ if err = chompWhitespace(r); err != nil && err != io.EOF {
+ return nil, err
}
+ if err = chompFrontmatterEndComment(r); err != nil && err != io.EOF {
+ return nil, err
+ }
+
return buf.Bytes(), nil
}
}