Simplify context implementation and fix new lines bug

This commit is contained in:
Thomas Pelletier
2021-03-31 09:57:19 -04:00
parent 4a4c2c2a5f
commit 92b16cad91
2 changed files with 53 additions and 22 deletions
+31 -22
View File
@@ -128,33 +128,42 @@ func formatLineNumber(line int, width int) string {
func linesOfContext(document []byte, highlight []byte, offset int, linesAround int) ([][]byte, [][]byte) { func linesOfContext(document []byte, highlight []byte, offset int, linesAround int) ([][]byte, [][]byte) {
var beforeLines [][]byte var beforeLines [][]byte
for beforeOffset, lastOffset := offset, offset; beforeOffset >= 0 && len(beforeLines) <= linesAround; beforeOffset-- {
if beforeOffset == len(document) { // Walk the document in reverse from the highlight to find previous lines
beforeLines = append(beforeLines, []byte{}) // of context.
continue rest := document[:offset]
} for o := len(rest) - 1; o >= 0 && len(beforeLines) <= linesAround && len(rest) > 0; {
if document[beforeOffset] == '\n' { if rest[o] == '\n' {
if beforeOffset == lastOffset { // handle individual lines
beforeLines = append(beforeLines, []byte{}) beforeLines = append(beforeLines, rest[o+1:])
} else { rest = rest[:o]
beforeLines = append(beforeLines, document[beforeOffset+1:lastOffset]) o = len(rest) - 1
} } else if o == 0 {
lastOffset = beforeOffset // add the first line only if it's non-empty
} else if beforeOffset == 0 && beforeOffset != lastOffset { beforeLines = append(beforeLines, rest)
beforeLines = append(beforeLines, document[beforeOffset:lastOffset]) break
} else {
o--
} }
} }
var afterLines [][]byte var afterLines [][]byte
document = document[offset+len(highlight):] // Walk the document forward from the highlight to find the following
for afterOffset, lastOffset := 0, 0; afterOffset < len(document) && len(afterLines) <= linesAround; afterOffset++ { // lines of context.
if document[afterOffset] == '\n' { rest = document[offset+len(highlight):]
afterLines = append(afterLines, document[lastOffset:afterOffset]) for o := 0; o < len(rest) && len(afterLines) <= linesAround; {
afterOffset++ // skip \n if rest[o] == '\n' {
lastOffset = afterOffset // handle individual lines
} else if afterOffset == len(document)-1 && lastOffset != afterOffset+1 { afterLines = append(afterLines, rest[:o])
afterLines = append(afterLines, document[lastOffset:afterOffset+1]) rest = rest[o+1:]
o = 0
} else if o == len(rest)-1 && o > 0 {
// add last line only if it's non-empty
afterLines = append(afterLines, rest)
break
} else {
o++
} }
} }
return beforeLines, afterLines return beforeLines, afterLines
+22
View File
@@ -121,6 +121,28 @@ before `, "highlighted", ``},
10| line3 10| line3
11| before highlighted 11| before highlighted
| ~~~~~~~~~~~ this is wrong | ~~~~~~~~~~~ this is wrong
`,
},
{
desc: "handle empty lines in the before/after blocks",
doc: [3]string{`line1
line 2
before `, "highlighted", ` after
line 3
line 4
line 5`,
},
expected: `
1| line1
2|
3| line 2
4| before highlighted after
| ~~~~~~~~~~~
5| line 3
6|
7| line 4
`, `,
}, },
} }