Skip to content

Commit 3ccff16

Browse files
committed
Adjust line detection in highlight.go
The code for detection of lines in highlight.go is somewhat too complex and doesn't take account of how chroma is actually splitting things into lines for us. Replace go-gitea#19967 Signed-off-by: Andrew Thornton <art27@cantab.net>
1 parent a2cfcdb commit 3ccff16

File tree

2 files changed

+68
-49
lines changed

2 files changed

+68
-49
lines changed

Diff for: modules/highlight/highlight.go

+21-24
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import (
2626
)
2727

2828
// don't index files larger than this many bytes for performance purposes
29-
const sizeLimit = 1000000
29+
const sizeLimit = 1024 * 1024
3030

3131
var (
3232
// For custom user mapping
@@ -60,7 +60,7 @@ func NewContext() {
6060
func Code(fileName, language, code string) string {
6161
NewContext()
6262

63-
// diff view newline will be passed as empty, change to literal \n so it can be copied
63+
// diff view newline will be passed as empty, change to literal '\n' so it can be copied
6464
// preserve literal newline in blame view
6565
if code == "" || code == "\n" {
6666
return "\n"
@@ -106,6 +106,11 @@ func Code(fileName, language, code string) string {
106106
return CodeFromLexer(lexer, code)
107107
}
108108

109+
type nopPreWrapper struct{}
110+
111+
func (nopPreWrapper) Start(code bool, styleAttr string) string { return "" }
112+
func (nopPreWrapper) End(code bool) string { return "" }
113+
109114
// CodeFromLexer returns a HTML version of code string with chroma syntax highlighting classes
110115
func CodeFromLexer(lexer chroma.Lexer, code string) string {
111116
formatter := html.New(html.WithClasses(true),
@@ -128,9 +133,9 @@ func CodeFromLexer(lexer chroma.Lexer, code string) string {
128133
return code
129134
}
130135

131-
htmlw.Flush()
136+
_ = htmlw.Flush()
132137
// Chroma will add newlines for certain lexers in order to highlight them properly
133-
// Once highlighted, strip them here so they don't cause copy/paste trouble in HTML output
138+
// Once highlighted, strip them here, so they don't cause copy/paste trouble in HTML output
134139
return strings.TrimSuffix(htmlbuf.String(), "\n")
135140
}
136141

@@ -143,7 +148,7 @@ func File(numLines int, fileName, language string, code []byte) []string {
143148
}
144149
formatter := html.New(html.WithClasses(true),
145150
html.WithLineNumbers(false),
146-
html.PreventSurroundingPre(true),
151+
html.WithPreWrapper(nopPreWrapper{}),
147152
)
148153

149154
if formatter == nil {
@@ -191,27 +196,19 @@ func File(numLines int, fileName, language string, code []byte) []string {
191196
return plainText(string(code), numLines)
192197
}
193198

194-
htmlw.Flush()
199+
_ = htmlw.Flush()
195200
finalNewLine := false
196201
if len(code) > 0 {
197202
finalNewLine = code[len(code)-1] == '\n'
198203
}
199204

200-
m := make([]string, 0, numLines)
201-
for _, v := range strings.SplitN(htmlbuf.String(), "\n", numLines) {
202-
content := v
203-
// need to keep lines that are only \n so copy/paste works properly in browser
204-
if content == "" {
205-
content = "\n"
206-
} else if content == `</span><span class="w">` {
207-
content += "\n</span>"
208-
} else if content == `</span></span><span class="line"><span class="cl">` {
209-
content += "\n"
210-
}
211-
content = strings.TrimSuffix(content, `<span class="w">`)
212-
content = strings.TrimPrefix(content, `</span>`)
213-
m = append(m, content)
205+
m := strings.SplitN(htmlbuf.String(), `</span></span><span class="line"><span class="cl">`, numLines)
206+
if len(m) > 0 {
207+
m[0] = m[0][len(`<span class="line"><span class="cl">`):]
208+
last := m[len(m)-1]
209+
m[len(m)-1] = last[:len(last)-len(`</span></span>`)]
214210
}
211+
215212
if finalNewLine {
216213
m = append(m, "<span class=\"w\">\n</span>")
217214
}
@@ -221,14 +218,14 @@ func File(numLines int, fileName, language string, code []byte) []string {
221218

222219
// return unhiglighted map
223220
func plainText(code string, numLines int) []string {
224-
m := make([]string, 0, numLines)
225-
for _, v := range strings.SplitN(code, "\n", numLines) {
226-
content := v
221+
m := strings.SplitN(code, "\n", numLines)
222+
223+
for i, content := range m {
227224
// need to keep lines that are only \n so copy/paste works properly in browser
228225
if content == "" {
229226
content = "\n"
230227
}
231-
m = append(m, gohtml.EscapeString(content))
228+
m[i] = gohtml.EscapeString(content)
232229
}
233230
return m
234231
}

Diff for: modules/highlight/highlight_test.go

+47-25
Original file line numberDiff line numberDiff line change
@@ -43,18 +43,29 @@ func TestFile(t *testing.T) {
4343
- go test -v -race -coverprofile=coverage.txt -covermode=atomic
4444
`),
4545
want: util.Dedent(`
46-
<span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">pipeline</span>
47-
</span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">default</span>
48-
</span></span><span class="line"><span class="cl">
49-
</span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">steps</span><span class="p">:</span>
50-
</span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">test</span>
51-
</span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">golang:1.13</span>
52-
</span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">environment</span><span class="p">:</span>
53-
</span></span><span class="line"><span class="cl"><span class="w"></span><span class="w"> </span><span class="nt">GOPROXY</span><span class="p">:</span><span class="w"> </span><span class="l">https://goproxy.cn</span>
54-
</span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">commands</span><span class="p">:</span>
55-
</span></span><span class="line"><span class="cl"><span class="w"></span><span class="w"> </span>- <span class="l">go get -u</span>
56-
</span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go build -v</span>
57-
</span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go test -v -race -coverprofile=coverage.txt -covermode=atomic</span></span></span>
46+
<span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">pipeline</span><span class="w">
47+
</span>
48+
<span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">default</span><span class="w">
49+
</span>
50+
<span class="w">
51+
</span>
52+
<span class="w"></span><span class="nt">steps</span><span class="p">:</span><span class="w">
53+
</span>
54+
<span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">test</span><span class="w">
55+
</span>
56+
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">golang:1.13</span><span class="w">
57+
</span>
58+
<span class="w"> </span><span class="nt">environment</span><span class="p">:</span><span class="w">
59+
</span>
60+
<span class="w"></span><span class="w"> </span><span class="nt">GOPROXY</span><span class="p">:</span><span class="w"> </span><span class="l">https://goproxy.cn</span><span class="w">
61+
</span>
62+
<span class="w"> </span><span class="nt">commands</span><span class="p">:</span><span class="w">
63+
</span>
64+
<span class="w"></span><span class="w"> </span>- <span class="l">go get -u</span><span class="w">
65+
</span>
66+
<span class="w"> </span>- <span class="l">go build -v</span><span class="w">
67+
</span>
68+
<span class="w"> </span>- <span class="l">go test -v -race -coverprofile=coverage.txt -covermode=atomic</span>
5869
`),
5970
},
6071
{
@@ -76,19 +87,30 @@ func TestFile(t *testing.T) {
7687
- go test -v -race -coverprofile=coverage.txt -covermode=atomic
7788
`)+"\n", "name: default", "name: default ", 1),
7889
want: util.Dedent(`
79-
<span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">pipeline</span>
80-
</span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">default </span>
81-
</span></span><span class="line"><span class="cl">
82-
</span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">steps</span><span class="p">:</span>
83-
</span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">test</span>
84-
</span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">golang:1.13</span>
85-
</span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">environment</span><span class="p">:</span>
86-
</span></span><span class="line"><span class="cl"><span class="w"></span><span class="w"> </span><span class="nt">GOPROXY</span><span class="p">:</span><span class="w"> </span><span class="l">https://goproxy.cn</span>
87-
</span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">commands</span><span class="p">:</span>
88-
</span></span><span class="line"><span class="cl"><span class="w"></span><span class="w"> </span>- <span class="l">go get -u</span>
89-
</span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go build -v</span>
90-
</span></span><span class="line"><span class="cl"><span class="w"> </span>- <span class="l">go test -v -race -coverprofile=coverage.txt -covermode=atomic</span>
91-
</span></span>
90+
<span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">pipeline</span><span class="w">
91+
</span>
92+
<span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">default </span><span class="w">
93+
</span>
94+
<span class="w">
95+
</span>
96+
<span class="w"></span><span class="nt">steps</span><span class="p">:</span><span class="w">
97+
</span>
98+
<span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">test</span><span class="w">
99+
</span>
100+
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">golang:1.13</span><span class="w">
101+
</span>
102+
<span class="w"> </span><span class="nt">environment</span><span class="p">:</span><span class="w">
103+
</span>
104+
<span class="w"></span><span class="w"> </span><span class="nt">GOPROXY</span><span class="p">:</span><span class="w"> </span><span class="l">https://goproxy.cn</span><span class="w">
105+
</span>
106+
<span class="w"> </span><span class="nt">commands</span><span class="p">:</span><span class="w">
107+
</span>
108+
<span class="w"></span><span class="w"> </span>- <span class="l">go get -u</span><span class="w">
109+
</span>
110+
<span class="w"> </span>- <span class="l">go build -v</span><span class="w">
111+
</span>
112+
<span class="w"> </span>- <span class="l">go test -v -race -coverprofile=coverage.txt -covermode=atomic</span><span class="w">
113+
</span>
92114
<span class="w">
93115
</span>
94116
`),

0 commit comments

Comments
 (0)