Skip to content

Commit f31e7a6

Browse files
authored
Just use a slice when rendering file (#16774)
Highlight currently uses a map which is memory inefficient. Switch to use a slice instead. Signed-off-by: Andrew Thornton <[email protected]>
1 parent 73defbb commit f31e7a6

File tree

3 files changed

+41
-42
lines changed

3 files changed

+41
-42
lines changed

modules/highlight/highlight.go

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -116,8 +116,8 @@ func Code(fileName, code string) string {
116116
return strings.TrimSuffix(htmlbuf.String(), "\n")
117117
}
118118

119-
// File returns map with line lumbers and HTML version of code with chroma syntax highlighting classes
120-
func File(numLines int, fileName string, code []byte) map[int]string {
119+
// File returns a slice of chroma syntax highlighted lines of code
120+
func File(numLines int, fileName string, code []byte) []string {
121121
NewContext()
122122

123123
if len(code) > sizeLimit {
@@ -171,9 +171,8 @@ func File(numLines int, fileName string, code []byte) map[int]string {
171171
finalNewLine = code[len(code)-1] == '\n'
172172
}
173173

174-
m := make(map[int]string, numLines)
175-
for k, v := range strings.SplitN(htmlbuf.String(), "\n", numLines) {
176-
line := k + 1
174+
m := make([]string, 0, numLines)
175+
for _, v := range strings.SplitN(htmlbuf.String(), "\n", numLines) {
177176
content := string(v)
178177
//need to keep lines that are only \n so copy/paste works properly in browser
179178
if content == "" {
@@ -183,26 +182,25 @@ func File(numLines int, fileName string, code []byte) map[int]string {
183182
}
184183
content = strings.TrimSuffix(content, `<span class="w">`)
185184
content = strings.TrimPrefix(content, `</span>`)
186-
m[line] = content
185+
m = append(m, content)
187186
}
188187
if finalNewLine {
189-
m[numLines+1] = "<span class=\"w\">\n</span>"
188+
m = append(m, "<span class=\"w\">\n</span>")
190189
}
191190

192191
return m
193192
}
194193

195194
// return unhiglighted map
196-
func plainText(code string, numLines int) map[int]string {
197-
m := make(map[int]string, numLines)
198-
for k, v := range strings.SplitN(string(code), "\n", numLines) {
199-
line := k + 1
195+
func plainText(code string, numLines int) []string {
196+
m := make([]string, 0, numLines)
197+
for _, v := range strings.SplitN(string(code), "\n", numLines) {
200198
content := string(v)
201199
//need to keep lines that are only \n so copy/paste works properly in browser
202200
if content == "" {
203201
content = "\n"
204202
}
205-
m[line] = gohtml.EscapeString(content)
203+
m = append(m, gohtml.EscapeString(content))
206204
}
207205
return m
208206
}

modules/highlight/highlight_test.go

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ func TestFile(t *testing.T) {
1919
numLines int
2020
fileName string
2121
code string
22-
want map[int]string
22+
want []string
2323
}{
2424
{
2525
name: ".drone.yml",
@@ -38,22 +38,22 @@ steps:
3838
- go build -v
3939
- go test -v -race -coverprofile=coverage.txt -covermode=atomic
4040
`,
41-
want: map[int]string{
42-
1: `<span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">pipeline</span>`,
43-
2: `<span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">default</span>`,
44-
3: `<span class="w">
41+
want: []string{
42+
`<span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">pipeline</span>`,
43+
`<span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">default</span>`,
44+
`<span class="w">
4545
</span>`,
46-
4: `<span class="w"></span><span class="nt">steps</span><span class="p">:</span>`,
47-
5: `<span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">test</span>`,
48-
6: `<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">golang:1.13</span>`,
49-
7: `<span class="w"> </span><span class="nt">environment</span><span class="p">:</span>`,
50-
8: `<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>`,
51-
9: `<span class="w"> </span><span class="nt">commands</span><span class="p">:</span>`,
52-
10: `<span class="w"></span><span class="w"> </span>- <span class="l">go get -u</span>`,
53-
11: `<span class="w"> </span>- <span class="l">go build -v</span>`,
54-
12: `<span class="w"> </span>- <span class="l">go test -v -race -coverprofile=coverage.txt -covermode=atomic</span><span class="w">
46+
`<span class="w"></span><span class="nt">steps</span><span class="p">:</span>`,
47+
`<span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">test</span>`,
48+
`<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">golang:1.13</span>`,
49+
`<span class="w"> </span><span class="nt">environment</span><span class="p">:</span>`,
50+
`<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>`,
51+
`<span class="w"> </span><span class="nt">commands</span><span class="p">:</span>`,
52+
`<span class="w"></span><span class="w"> </span>- <span class="l">go get -u</span>`,
53+
`<span class="w"> </span>- <span class="l">go build -v</span>`,
54+
`<span class="w"> </span>- <span class="l">go test -v -race -coverprofile=coverage.txt -covermode=atomic</span><span class="w">
5555
</span>`,
56-
13: `<span class="w">
56+
`<span class="w">
5757
</span>`,
5858
},
5959
},
@@ -74,21 +74,21 @@ steps:
7474
- go build -v
7575
- go test -v -race -coverprofile=coverage.txt -covermode=atomic
7676
`,
77-
want: map[int]string{
78-
1: `<span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">pipeline</span>`,
79-
2: `<span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">default </span>`,
80-
3: `<span class="w">
77+
want: []string{
78+
`<span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">pipeline</span>`,
79+
`<span class="w"></span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">default </span>`,
80+
`<span class="w">
8181
</span>`,
82-
4: `<span class="w"></span><span class="nt">steps</span><span class="p">:</span>`,
83-
5: `<span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">test</span>`,
84-
6: `<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-
7: `<span class="w"> </span><span class="nt">environment</span><span class="p">:</span>`,
86-
8: `<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-
9: `<span class="w"> </span><span class="nt">commands</span><span class="p">:</span>`,
88-
10: `<span class="w"></span><span class="w"> </span>- <span class="l">go get -u</span>`,
89-
11: `<span class="w"> </span>- <span class="l">go build -v</span>`,
90-
12: `<span class="w"> </span>- <span class="l">go test -v -race -coverprofile=coverage.txt -covermode=atomic</span>`,
91-
13: `<span class="w"> </span>`,
82+
`<span class="w"></span><span class="nt">steps</span><span class="p">:</span>`,
83+
`<span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">test</span>`,
84+
`<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 class="w"> </span><span class="nt">environment</span><span class="p">:</span>`,
86+
`<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 class="w"> </span><span class="nt">commands</span><span class="p">:</span>`,
88+
`<span class="w"></span><span class="w"> </span>- <span class="l">go get -u</span>`,
89+
`<span class="w"> </span>- <span class="l">go build -v</span>`,
90+
`<span class="w"> </span>- <span class="l">go test -v -race -coverprofile=coverage.txt -covermode=atomic</span>`,
91+
`<span class="w"> </span>`,
9292
},
9393
},
9494
}

templates/repo/view_file.tmpl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,8 @@
9999
{{else}}
100100
<table>
101101
<tbody>
102-
{{range $line, $code := .FileContent}}
102+
{{range $idx, $code := .FileContent}}
103+
{{$line := Add $idx 1}}
103104
<tr>
104105
<td id="L{{$line}}" class="lines-num">
105106
<span id="L{{$line}}" data-line-number="{{$line}}"></span>

0 commit comments

Comments
 (0)