diff --git a/internal/format/diff_test.go b/internal/format/diff_test.go
index a22f75c..934f22d 100644
--- a/internal/format/diff_test.go
+++ b/internal/format/diff_test.go
@@ -4,9 +4,9 @@ import "testing"
func TestDiff(t *testing.T) {
tests := []struct {
- name string
- text string
- want string
+ name string
+ text string
+ want string
}{
{"zero", "--- old\r\n+++ new\r\n", ""},
{"plus", "--- old\r\n+++ new\r\n+test\r\n", "+test
\n"},
diff --git a/internal/format/nomark/apply.go b/internal/format/nomark/apply.go
index da1048b..c652531 100644
--- a/internal/format/nomark/apply.go
+++ b/internal/format/nomark/apply.go
@@ -127,48 +127,28 @@ func nextLine(s *state) {
func closeBlock(s *state, nextBlock blockMode) {
if s.block == blockNone {
- if nextBlock == blockRaw || nextBlock == blockCode {
- s.text.WriteString("\n")
- }
+ // do nothing
} else if s.block == blockParagraph {
- s.html.WriteString("\n
\n") } else if nextBlock == blockRaw { s.html.WriteString("
")
} else if nextBlock == blockCode {
- s.text.WriteString("\n")
- s.plain.WriteString("\n")
s.html.WriteString("")
} else if nextBlock == blockMath {
- s.text.WriteString("\n%%%\n")
+ s.text.WriteString("%%%\n")
s.html.WriteString("\n")
s.html.WriteString("%%%\n")
s.html.WriteString("\\[")
@@ -649,8 +625,16 @@ func nomarkLine(fc formatConfig, s *state) {
// open raw block
if s.block != blockRaw && s.block != blockCode && s.block != blockMath && s.prevLine == "" && strings.HasPrefix(line, " ") {
ensureBlock(s, blockRaw)
+
s.text.WriteString(line)
+ s.text.WriteString("\n")
+
+ s.plain.WriteString(line)
+ s.plain.WriteString("\n")
+
s.html.WriteString(template.HTMLEscapeString(line))
+ s.html.WriteString("\n")
+
nextLine(s)
return
}
@@ -680,10 +664,10 @@ func nomarkLine(fc formatConfig, s *state) {
// close code block
if s.block == blockCode && s.prevLine == "" && line == "}}}" {
- closeBlock(s, blockParagraph)
ensureBlock(s, blockParagraph)
- s.text.WriteString("}}}")
- s.html.WriteString("}}}")
+ s.text.WriteString("}}}\n\n")
+ s.plain.WriteString("\n")
+ s.html.WriteString("}}}\n")
nextLine(s)
return
}
@@ -704,13 +688,17 @@ func nomarkLine(fc formatConfig, s *state) {
// headings
if level, title, ok := parseHeading(s, line); ok {
- s.text.WriteString("\n")
- s.text.WriteString(line)
- s.text.WriteString("\n")
+ if !isBlank(s.prevLine) {
+ s.text.WriteString("\n")
+ s.plain.WriteString("\n")
+ }
+
+ s.text.WriteString(line)
+ s.text.WriteString("\n\n")
- s.plain.WriteString("\n")
s.plain.WriteString(title)
- s.plain.WriteString("\n")
+ s.plain.WriteString("\n\n")
+
if level == 1 && s.title == "" {
s.title = title
nextLine(s)
@@ -742,11 +730,14 @@ func nomarkLine(fc formatConfig, s *state) {
// in raw block
if s.block == blockRaw && strings.HasPrefix(line, " ") {
- s.text.WriteString("\n")
s.text.WriteString(line)
+ s.text.WriteString("\n")
+
+ s.plain.WriteString(line)
+ s.plain.WriteString("\n")
- s.html.WriteString("\n")
s.html.WriteString(template.HTMLEscapeString(line))
+ s.html.WriteString("\n")
nextLine(s)
return
@@ -755,13 +746,20 @@ func nomarkLine(fc formatConfig, s *state) {
// in code block
if s.block == blockCode {
if s.firstCode {
- s.firstCode = false
- } else {
s.text.WriteString("\n")
s.html.WriteString("\n")
+ s.firstCode = false
}
+
s.text.WriteString(line)
+ s.text.WriteString("\n")
+
+ s.plain.WriteString(line)
+ s.plain.WriteString("\n")
+
s.html.WriteString(template.HTMLEscapeString(line))
+ s.html.WriteString("\n")
+
nextLine(s)
return
}
@@ -771,16 +769,16 @@ func nomarkLine(fc formatConfig, s *state) {
s.text.WriteString(line)
s.text.WriteString("\n")
- s.html.WriteString("\n")
s.html.WriteString(template.HTMLEscapeString(line))
+ s.html.WriteString("\n")
nextLine(s)
return
}
if line == "{{{" {
- s.text.WriteString("{{{")
- s.html.WriteString("{{{")
+ s.text.WriteString("{{{\n")
+ s.html.WriteString("{{{\n")
nextLine(s)
return
}
@@ -788,11 +786,11 @@ func nomarkLine(fc formatConfig, s *state) {
if line == "" {
ensureBlock(s, blockNone)
s.text.WriteString("\n")
+ s.plain.WriteString("\n")
nextLine(s)
return
}
- prevBlock := s.block
ensureBlock(s, blockParagraph)
for s.index < s.lineEnd {
c := s.input[s.index]
@@ -804,15 +802,30 @@ func nomarkLine(fc formatConfig, s *state) {
s.index += 1
}
markup(fc, s)
+
+ s.text.WriteString("\n")
+ s.plain.WriteString("\n")
+
nextLine(s)
+ if s.block == blockParagraph {
+ if s.index < len(s.input) {
+ line = s.input[s.index:s.lineEnd]
+ if isBlank(line) {
+ s.html.WriteString("\n")
+ } else {
+ s.html.WriteString("
\n")
+ }
+ } else {
+ s.html.WriteString("\n")
+ }
+ }
+
if s.index < len(s.input) {
line = s.input[s.index:s.lineEnd]
- if !isBlank(line) && line != "%%%" {
+ if isBlank(line) {
s.text.WriteString("\n")
- if prevBlock != blockRaw {
- s.html.WriteString("
\n")
- }
+ s.plain.WriteString("\n")
}
}
diff --git a/internal/format/nomark/apply_test.go b/internal/format/nomark/apply_test.go
index d741163..e85d14a 100644
--- a/internal/format/nomark/apply_test.go
+++ b/internal/format/nomark/apply_test.go
@@ -11,15 +11,59 @@ var mockCfg = formatConfig{
func TestApply(t *testing.T) {
tests := []struct {
- name string
- title string
- text string
- wantTitle string
+ name string
+ title string
+ text string
+ wantTitle string
wantText string
- wantPlain string
+ wantPlain string
wantHTML string
}{
- {"simple", "WikiPage", "This is a test.", "WikiPage", "\nThis is a test.", "\nThis is a test.", "\nThis is a test.\n
"},
+ {
+ "blank",
+ "WikiPage",
+ "",
+ "WikiPage",
+ "",
+ "",
+ "",
+ },
+ {
+ "blank line",
+ "WikiPage",
+ "\n",
+ "WikiPage",
+ "",
+ "",
+ "",
+ },
+ {
+ "simple",
+ "WikiPage",
+ "This is a test.",
+ "WikiPage",
+ "This is a test.\n",
+ "This is a test.\n",
+ "\nThis is a test.\n
\n",
+ },
+ {
+ "simple line",
+ "WikiPage",
+ "This is a test.\n",
+ "WikiPage",
+ "This is a test.\n",
+ "This is a test.\n",
+ "\nThis is a test.\n
\n",
+ },
+ {
+ "multi line",
+ "WikiPage",
+ "This is a test.\nI love tests.\n",
+ "WikiPage",
+ "This is a test.\nI love tests.\n",
+ "This is a test.\nI love tests.\n",
+ "\nThis is a test.
\nI love tests.\n
\n",
+ },
}
for _, tt := range tests {