Simplify context implementation and fix new lines bug
This commit is contained in:
@@ -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:])
|
||||||
|
rest = rest[:o]
|
||||||
|
o = len(rest) - 1
|
||||||
|
} else if o == 0 {
|
||||||
|
// add the first line only if it's non-empty
|
||||||
|
beforeLines = append(beforeLines, rest)
|
||||||
|
break
|
||||||
} else {
|
} else {
|
||||||
beforeLines = append(beforeLines, document[beforeOffset+1:lastOffset])
|
o--
|
||||||
}
|
|
||||||
lastOffset = beforeOffset
|
|
||||||
} else if beforeOffset == 0 && beforeOffset != lastOffset {
|
|
||||||
beforeLines = append(beforeLines, document[beforeOffset:lastOffset])
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
|
|||||||
@@ -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
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user