annotate vendor/github.com/alecthomas/chroma/v2/registry.go @ 66:787b5ee0289d draft

Use vendored modules Signed-off-by: Izuru Yakumo <yakumo.izuru@chaotic.ninja>
author yakumo.izuru
date Sun, 23 Jul 2023 13:18:53 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
66
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
1 package chroma
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
2
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
3 import (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
4 "path/filepath"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
5 "sort"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
6 "strings"
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
7 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
8
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
9 var (
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
10 ignoredSuffixes = [...]string{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
11 // Editor backups
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
12 "~", ".bak", ".old", ".orig",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
13 // Debian and derivatives apt/dpkg/ucf backups
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
14 ".dpkg-dist", ".dpkg-old", ".ucf-dist", ".ucf-new", ".ucf-old",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
15 // Red Hat and derivatives rpm backups
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
16 ".rpmnew", ".rpmorig", ".rpmsave",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
17 // Build system input/template files
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
18 ".in",
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
19 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
20 )
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
21
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
22 // LexerRegistry is a registry of Lexers.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
23 type LexerRegistry struct {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
24 Lexers Lexers
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
25 byName map[string]Lexer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
26 byAlias map[string]Lexer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
27 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
28
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
29 // NewLexerRegistry creates a new LexerRegistry of Lexers.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
30 func NewLexerRegistry() *LexerRegistry {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
31 return &LexerRegistry{
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
32 byName: map[string]Lexer{},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
33 byAlias: map[string]Lexer{},
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
34 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
35 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
36
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
37 // Names of all lexers, optionally including aliases.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
38 func (l *LexerRegistry) Names(withAliases bool) []string {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
39 out := []string{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
40 for _, lexer := range l.Lexers {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
41 config := lexer.Config()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
42 out = append(out, config.Name)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
43 if withAliases {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
44 out = append(out, config.Aliases...)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
45 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
46 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
47 sort.Strings(out)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
48 return out
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
49 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
50
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
51 // Get a Lexer by name, alias or file extension.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
52 func (l *LexerRegistry) Get(name string) Lexer {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
53 if lexer := l.byName[name]; lexer != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
54 return lexer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
55 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
56 if lexer := l.byAlias[name]; lexer != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
57 return lexer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
58 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
59 if lexer := l.byName[strings.ToLower(name)]; lexer != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
60 return lexer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
61 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
62 if lexer := l.byAlias[strings.ToLower(name)]; lexer != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
63 return lexer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
64 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
65
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
66 candidates := PrioritisedLexers{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
67 // Try file extension.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
68 if lexer := l.Match("filename." + name); lexer != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
69 candidates = append(candidates, lexer)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
70 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
71 // Try exact filename.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
72 if lexer := l.Match(name); lexer != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
73 candidates = append(candidates, lexer)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
74 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
75 if len(candidates) == 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
76 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
77 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
78 sort.Sort(candidates)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
79 return candidates[0]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
80 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
81
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
82 // MatchMimeType attempts to find a lexer for the given MIME type.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
83 func (l *LexerRegistry) MatchMimeType(mimeType string) Lexer {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
84 matched := PrioritisedLexers{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
85 for _, l := range l.Lexers {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
86 for _, lmt := range l.Config().MimeTypes {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
87 if mimeType == lmt {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
88 matched = append(matched, l)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
89 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
90 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
91 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
92 if len(matched) != 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
93 sort.Sort(matched)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
94 return matched[0]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
95 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
96 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
97 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
98
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
99 // Match returns the first lexer matching filename.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
100 func (l *LexerRegistry) Match(filename string) Lexer {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
101 filename = filepath.Base(filename)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
102 matched := PrioritisedLexers{}
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
103 // First, try primary filename matches.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
104 for _, lexer := range l.Lexers {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
105 config := lexer.Config()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
106 for _, glob := range config.Filenames {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
107 ok, err := filepath.Match(glob, filename)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
108 if err != nil { // nolint
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
109 panic(err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
110 } else if ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
111 matched = append(matched, lexer)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
112 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
113 for _, suf := range &ignoredSuffixes {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
114 ok, err := filepath.Match(glob+suf, filename)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
115 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
116 panic(err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
117 } else if ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
118 matched = append(matched, lexer)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
119 break
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
120 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
121 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
122 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
123 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
124 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
125 if len(matched) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
126 sort.Sort(matched)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
127 return matched[0]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
128 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
129 matched = nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
130 // Next, try filename aliases.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
131 for _, lexer := range l.Lexers {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
132 config := lexer.Config()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
133 for _, glob := range config.AliasFilenames {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
134 ok, err := filepath.Match(glob, filename)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
135 if err != nil { // nolint
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
136 panic(err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
137 } else if ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
138 matched = append(matched, lexer)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
139 } else {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
140 for _, suf := range &ignoredSuffixes {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
141 ok, err := filepath.Match(glob+suf, filename)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
142 if err != nil {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
143 panic(err)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
144 } else if ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
145 matched = append(matched, lexer)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
146 break
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
147 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
148 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
149 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
150 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
151 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
152 if len(matched) > 0 {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
153 sort.Sort(matched)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
154 return matched[0]
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
155 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
156 return nil
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
157 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
158
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
159 // Analyse text content and return the "best" lexer..
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
160 func (l *LexerRegistry) Analyse(text string) Lexer {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
161 var picked Lexer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
162 highest := float32(0.0)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
163 for _, lexer := range l.Lexers {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
164 if analyser, ok := lexer.(Analyser); ok {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
165 weight := analyser.AnalyseText(text)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
166 if weight > highest {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
167 picked = lexer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
168 highest = weight
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
169 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
170 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
171 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
172 return picked
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
173 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
174
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
175 // Register a Lexer with the LexerRegistry.
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
176 func (l *LexerRegistry) Register(lexer Lexer) Lexer {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
177 lexer.SetRegistry(l)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
178 config := lexer.Config()
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
179 l.byName[config.Name] = lexer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
180 l.byName[strings.ToLower(config.Name)] = lexer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
181 for _, alias := range config.Aliases {
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
182 l.byAlias[alias] = lexer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
183 l.byAlias[strings.ToLower(alias)] = lexer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
184 }
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
185 l.Lexers = append(l.Lexers, lexer)
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
186 return lexer
787b5ee0289d Use vendored modules
yakumo.izuru
parents:
diff changeset
187 }