1package lexers
 2
 3import (
 4	"embed"
 5	"io/fs"
 6
 7	"github.com/alecthomas/chroma/v2"
 8)
 9
10//go:embed embedded
11var embedded embed.FS
12
13// GlobalLexerRegistry is the global LexerRegistry of Lexers.
14var GlobalLexerRegistry = func() *chroma.LexerRegistry {
15	reg := chroma.NewLexerRegistry()
16	// index(reg)
17	paths, err := fs.Glob(embedded, "embedded/*.xml")
18	if err != nil {
19		panic(err)
20	}
21	for _, path := range paths {
22		reg.Register(chroma.MustNewXMLLexer(embedded, path))
23	}
24	return reg
25}()
26
27// Names of all lexers, optionally including aliases.
28func Names(withAliases bool) []string {
29	return GlobalLexerRegistry.Names(withAliases)
30}
31
32// Get a Lexer by name, alias or file extension.
33func Get(name string) chroma.Lexer {
34	return GlobalLexerRegistry.Get(name)
35}
36
37// MatchMimeType attempts to find a lexer for the given MIME type.
38func MatchMimeType(mimeType string) chroma.Lexer {
39	return GlobalLexerRegistry.MatchMimeType(mimeType)
40}
41
42// Match returns the first lexer matching filename.
43func Match(filename string) chroma.Lexer {
44	return GlobalLexerRegistry.Match(filename)
45}
46
47// Register a Lexer with the global registry.
48func Register(lexer chroma.Lexer) chroma.Lexer {
49	return GlobalLexerRegistry.Register(lexer)
50}
51
52// Analyse text content and return the "best" lexer..
53func Analyse(text string) chroma.Lexer {
54	return GlobalLexerRegistry.Analyse(text)
55}
56
57// PlaintextRules is used for the fallback lexer as well as the explicit
58// plaintext lexer.
59func PlaintextRules() chroma.Rules {
60	return chroma.Rules{
61		"root": []chroma.Rule{
62			{`.+`, chroma.Text, nil},
63			{`\n`, chroma.Text, nil},
64		},
65	}
66}
67
68// Fallback lexer if no other is found.
69var Fallback chroma.Lexer = chroma.MustNewLexer(&chroma.Config{
70	Name:      "fallback",
71	Filenames: []string{"*"},
72	Priority:  -1,
73}, PlaintextRules)