Skip to content

Commit 0747592

Browse files
wxiaoguangzeripathlafriks
authored
Adjust line detection in highlight.go (#20612)
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. Remove both the .line and .cl classes from Chroma's HTML which made the old conditional work again. This fixed Copy of YAML files while also reducing the amount of rendered HTML nodes. Co-authored-by: zeripath <[email protected]> Co-authored-by: Lauris BH <[email protected]>
1 parent 07d1406 commit 0747592

File tree

2 files changed

+68
-49
lines changed

2 files changed

+68
-49
lines changed

modules/highlight/highlight.go

Lines changed: 21 additions & 24 deletions
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
@@ -58,7 +58,7 @@ func NewContext() {
5858
func Code(fileName, language, code string) string {
5959
NewContext()
6060

61-
// diff view newline will be passed as empty, change to literal \n so it can be copied
61+
// diff view newline will be passed as empty, change to literal '\n' so it can be copied
6262
// preserve literal newline in blame view
6363
if code == "" || code == "\n" {
6464
return "\n"
@@ -104,6 +104,11 @@ func Code(fileName, language, code string) string {
104104
return CodeFromLexer(lexer, code)
105105
}
106106

107+
type nopPreWrapper struct{}
108+
109+
func (nopPreWrapper) Start(code bool, styleAttr string) string { return "" }
110+
func (nopPreWrapper) End(code bool) string { return "" }
111+
107112
// CodeFromLexer returns a HTML version of code string with chroma syntax highlighting classes
108113
func CodeFromLexer(lexer chroma.Lexer, code string) string {
109114
formatter := html.New(html.WithClasses(true),
@@ -126,9 +131,9 @@ func CodeFromLexer(lexer chroma.Lexer, code string) string {
126131
return code
127132
}
128133

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

@@ -141,7 +146,7 @@ func File(numLines int, fileName, language string, code []byte) []string {
141146
}
142147
formatter := html.New(html.WithClasses(true),
143148
html.WithLineNumbers(false),
144-
html.PreventSurroundingPre(true),
149+
html.WithPreWrapper(nopPreWrapper{}),
145150
)
146151

147152
if formatter == nil {
@@ -189,27 +194,19 @@ func File(numLines int, fileName, language string, code []byte) []string {
189194
return plainText(string(code), numLines)
190195
}
191196

192-
htmlw.Flush()
197+
_ = htmlw.Flush()
193198
finalNewLine := false
194199
if len(code) > 0 {
195200
finalNewLine = code[len(code)-1] == '\n'
196201
}
197202

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

220217
// return unhiglighted map
221218
func plainText(code string, numLines int) []string {
222-
m := make([]string, 0, numLines)
223-
for _, v := range strings.SplitN(string(code), "\n", numLines) {
224-
content := string(v)
219+
m := strings.SplitN(code, "\n", numLines)
220+
221+
for i, content := range m {
225222
// need to keep lines that are only \n so copy/paste works properly in browser
226223
if content == "" {
227224
content = "\n"
228225
}
229-
m = append(m, gohtml.EscapeString(content))
226+
m[i] = gohtml.EscapeString(content)
230227
}
231228
return m
232229
}

modules/highlight/highlight_test.go

Lines changed: 47 additions & 25 deletions
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)