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