This repository was archived by the owner on Sep 30, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
Copy pathhighlight.go
107 lines (87 loc) · 2.84 KB
/
highlight.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package graphqlbackend
import (
"context"
"html/template"
"github.com/gogo/protobuf/jsonpb"
"github.com/sourcegraph/sourcegraph/cmd/frontend/internal/highlight"
"github.com/sourcegraph/sourcegraph/internal/gosyntect"
"github.com/sourcegraph/sourcegraph/internal/search/result"
)
type highlightedRangeResolver struct {
inner result.HighlightedRange
}
func (h highlightedRangeResolver) Line() int32 { return h.inner.Line }
func (h highlightedRangeResolver) Character() int32 { return h.inner.Character }
func (h highlightedRangeResolver) Length() int32 { return h.inner.Length }
type highlightedStringResolver struct {
inner result.HighlightedString
}
func (s *highlightedStringResolver) Value() string { return s.inner.Value }
func (s *highlightedStringResolver) Highlights() []highlightedRangeResolver {
res := make([]highlightedRangeResolver, len(s.inner.Highlights))
for i, hl := range s.inner.Highlights {
res[i] = highlightedRangeResolver{hl}
}
return res
}
type HighlightArgs struct {
DisableTimeout bool
IsLightTheme *bool
HighlightLongLines bool
Format string
}
type highlightedFileResolver struct {
aborted bool
response *highlight.HighlightedCode
}
func (h *highlightedFileResolver) Aborted() bool { return h.aborted }
func (h *highlightedFileResolver) HTML() string {
html, err := h.response.HTML()
if err != nil {
return ""
}
return string(html)
}
func (h *highlightedFileResolver) LSIF() string {
if h.response == nil {
return "{}"
}
marshaller := &jsonpb.Marshaler{
EnumsAsInts: true,
EmitDefaults: false,
}
// TODO(tjdevries): We could probably serialize the error, but it wouldn't do anything for now.
lsif, err := marshaller.MarshalToString(h.response.LSIF())
if err != nil {
return "{}"
}
return lsif
}
func (h *highlightedFileResolver) LineRanges(args *struct{ Ranges []highlight.LineRange }) ([][]string, error) {
if h.response != nil && h.response.LSIF() != nil {
return h.response.LinesForRanges(args.Ranges)
}
return highlight.SplitLineRanges(template.HTML(h.HTML()), args.Ranges)
}
func highlightContent(ctx context.Context, args *HighlightArgs, content, path string, metadata highlight.Metadata) (*highlightedFileResolver, error) {
var (
result = &highlightedFileResolver{}
err error
simulateTimeout = metadata.RepoName == "github.com/sourcegraph/AlwaysHighlightTimeoutTest"
)
response, aborted, err := highlight.Code(ctx, highlight.Params{
Content: []byte(content),
Filepath: path,
DisableTimeout: args.DisableTimeout,
HighlightLongLines: args.HighlightLongLines,
SimulateTimeout: simulateTimeout,
Metadata: metadata,
Format: gosyntect.GetResponseFormat(args.Format),
})
result.aborted = aborted
result.response = response
if err != nil {
return nil, err
}
return result, nil
}