testmark-go

Merge pull request #3 from mvdan/crlf

commit d583ad61f3ab768fe29764a71c3a9bc709222734 · parent 53baa42029 · parent b3427823eb · browse this tree
Eric Myhre, 2021-09-08 12:00:37 UTC

add support for parsing CRLF line endings
diff --git a/read.go b/read.go
index 3e84482..b20244c 100644
--- a/read.go
+++ b/read.go
@@ -27,9 +27,10 @@ func ReadFile(name string) (*Document, error) {
 }
 
 var (
-	sigilLineBreak = []byte{'\n'}
-	sigilCodeBlock = []byte("```")
-	sigilTestmark  = []byte("[testmark]:# ")
+	sigilLineBreak      = []byte{'\n'}
+	sigilCarriageReturn = []byte{'\r'}
+	sigilCodeBlock      = []byte("```")
+	sigilTestmark       = []byte("[testmark]:# ")
 )
 
 func Parse(data []byte) (*Document, error) {
@@ -51,6 +52,9 @@ func Parse(data []byte) (*Document, error) {
 	var codeBlockOffset int
 	hunkInProgress := DocHunk{LineStart: -1}
 	for i, line := range doc.Lines {
+		// Support CRLF line endings, for Windows.
+		line = bytes.TrimSuffix(line, sigilCarriageReturn)
+
 		// Check for transition in or out of codeblock.
 		if bytes.HasPrefix(line, sigilCodeBlock) {
 			switch inCodeBlock {
diff --git a/read_test.go b/read_test.go
index 961b611..f8c862e 100644
--- a/read_test.go
+++ b/read_test.go
@@ -1,7 +1,8 @@
 package testmark
 
 import (
-	"fmt"
+	"bytes"
+	"io/ioutil"
 	"path/filepath"
 	"testing"
 )
@@ -9,11 +10,28 @@ import (
 func TestRead(t *testing.T) {
 	testdata, err := filepath.Abs("testdata")
 	if err != nil {
-		panic(err)
+		t.Fatal(err)
 	}
 	doc, err := ReadFile(filepath.Join(testdata, "example.md"))
-	fmt.Printf("err: %v\n", err)
+	if err != nil {
+		t.Fatal(err)
+	}
+	for _, hunk := range doc.DataHunks {
+		t.Logf("hunk %q is on lines %d:%d, has body %q\n", hunk.Name, hunk.LineStart+1, hunk.LineEnd+1, string(hunk.Body))
+	}
+}
+
+func TestParseCRLF(t *testing.T) {
+	input, err := ioutil.ReadFile(filepath.Join("testdata", "example.md"))
+	if err != nil {
+		t.Fatal(err)
+	}
+	input = bytes.ReplaceAll(input, []byte("\n"), []byte("\r\n"))
+	doc, err := Parse(input)
+	if err != nil {
+		t.Fatal(err)
+	}
 	for _, hunk := range doc.DataHunks {
-		fmt.Printf("hunk %q is on lines %d:%d, has body %q\n", hunk.Name, hunk.LineStart+1, hunk.LineEnd+1, string(hunk.Body))
+		t.Logf("hunk %q is on lines %d:%d, has body %q\n", hunk.Name, hunk.LineStart+1, hunk.LineEnd+1, string(hunk.Body))
 	}
 }