Commit 768fd2e0ca
768fd2e0caf5dcb94ac9476f250cd0229f60e305
parent: 968d263f38
Verified · cmc ci/build: success
cmc <hello@cleberg.net> · 2026-08-31T05:17:44Z
web: keep an added line's leading dash in the diff
sideText rebuilt the highlighting source from the raw diff line, stripping
"+" and then "-". On an added line that begins with a dash — a Markdown
bullet, a docstring list — the second strip took the content's own dash,
and the diff rendered the line without it. Content already holds the line
without its marker.
internal/httpd/diff.go
+4 −1
| @@ -192,11 +192,14 @@ func highlightFile(f *diffFile) { |
| 192 | 192 | } |
| 193 | 193 | |
| 194 | 194 | // sideText joins one side of a hunk: context plus the given change class. |
| 195 | // Content, not Text: the marker is already off it. Taking it off Text here |
| 196 | // meant stripping "+" and then "-", which ate the dash of an added line that |
| 197 | // begins with one. |
| 195 | 198 | func sideText(hunk []diffLine, class string) string { |
| 196 | 199 | var b strings.Builder |
| 197 | 200 | for _, l := range hunk { |
| 198 | 201 | if l.Class == "ctx" || l.Class == class { |
| 199 | | b.WriteString(strings.TrimPrefix(strings.TrimPrefix(l.Text, "+"), "-")) |
| 202 | b.WriteString(l.Content) |
| 200 | 203 | b.WriteByte('\n') |
| 201 | 204 | } |
| 202 | 205 | } |
internal/httpd/diff_test.go
+23
| @@ -183,3 +183,26 @@ func stripTags(s string) string { |
| 183 | 183 | } |
| 184 | 184 | return strings.ReplaceAll(b.String(), """, `"`) |
| 185 | 185 | } |
| 186 | |
| 187 | // An added line whose own text begins with a dash — a Markdown bullet, a |
| 188 | // docstring list — keeps it. Deriving the highlighting source from the raw |
| 189 | // line means stripping the marker, and stripping "+" then "-" takes the |
| 190 | // content's dash along with it. |
| 191 | func TestParseDiffKeepsDashAfterMarker(t *testing.T) { |
| 192 | files := parseDiff(`diff --git a/README.md b/README.md |
| 193 | --- a/README.md |
| 194 | +++ b/README.md |
| 195 | @@ -1,2 +1,3 @@ |
| 196 | - one |
| 197 | +- two |
| 198 | - three |
| 199 | `) |
| 200 | for _, l := range files[0].Lines { |
| 201 | if l.Class != "add" { |
| 202 | continue |
| 203 | } |
| 204 | if text := stripTags(string(l.Code)); text != l.Content { |
| 205 | t.Errorf("added line %q highlighted as %q", l.Content, text) |
| 206 | } |
| 207 | } |
| 208 | } |