From 70b51a7fb24bef8ff04f66d9325c1abefc2fa54e Mon Sep 17 00:00:00 2001 From: Aki Kareha Date: Fri, 21 Nov 2025 23:32:55 +0900 Subject: [PATCH] Refactor Nomark --- internal/format/diff_test.go | 6 +- internal/format/nomark/apply.go | 125 +++++++++++++++------------ internal/format/nomark/apply_test.go | 56 ++++++++++-- 3 files changed, 122 insertions(+), 65 deletions(-) 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

") + s.html.WriteString("

\n") if nextBlock != blockRaw && nextBlock != blockCode { skipBlankLines(s) } - if s.index < len(s.input) { - if nextBlock != blockMath { - s.text.WriteString("\n") - s.plain.WriteString("\n") - } - s.html.WriteString("\n") - } } else if s.block == blockRaw { - s.html.WriteString("") - if s.index < len(s.input) { - c := s.input[s.index] - if c != '\r' && c != '\n' { - s.text.WriteString("\n") - } - } + s.html.WriteString("\n") skipBlankLines(s) - if s.index < len(s.input) { - s.html.WriteString("\n") - } } else if s.block == blockCode { - s.html.WriteString("") + s.html.WriteString("\n") skipBlankLines(s) - if s.index < len(s.input) { - s.html.WriteString("\n") - } } else if s.block == blockMath { - s.text.WriteString("%%%\n") - s.html.WriteString("\n\\]\n") + s.text.WriteString("%%%\n\n") + + s.plain.WriteString("\n") + + s.html.WriteString("\\]\n") s.html.WriteString("%%%\n") - s.html.WriteString("") + s.html.WriteString("\n") + skipBlankLines(s) - if s.index < len(s.input) { - s.html.WriteString("\n") - } } s.block = blockNone } @@ -177,17 +157,13 @@ func openBlock(s *state, nextBlock blockMode) { if nextBlock == blockNone { // do nothing } else if nextBlock == blockParagraph { - s.text.WriteString("\n") - s.plain.WriteString("\n") s.html.WriteString("

\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 {