1package styles
2
3import (
4 "embed"
5 "io/fs"
6 "sort"
7 "strings"
8
9 "github.com/alecthomas/chroma/v2"
10)
11
12//go:embed *.xml
13var embedded embed.FS
14
15// Registry of Styles.
16var Registry = func() map[string]*chroma.Style {
17 registry := map[string]*chroma.Style{}
18 // Register all embedded styles.
19 files, err := fs.ReadDir(embedded, ".")
20 if err != nil {
21 panic(err)
22 }
23 for _, file := range files {
24 if file.IsDir() {
25 continue
26 }
27 r, err := embedded.Open(file.Name())
28 if err != nil {
29 panic(err)
30 }
31 style, err := chroma.NewXMLStyle(r)
32 if err != nil {
33 panic(err)
34 }
35 registry[strings.ToLower(style.Name)] = style
36 _ = r.Close()
37 }
38 return registry
39}()
40
41// Fallback style. Reassign to change the default fallback style.
42var Fallback = Registry["swapoff"]
43
44// Register a chroma.Style.
45func Register(style *chroma.Style) *chroma.Style {
46 Registry[strings.ToLower(style.Name)] = style
47 return style
48}
49
50// Names of all available styles.
51func Names() []string {
52 out := []string{}
53 for name := range Registry {
54 out = append(out, name)
55 }
56 sort.Strings(out)
57 return out
58}
59
60// Get named style, or Fallback.
61func Get(name string) *chroma.Style {
62 if style, ok := Registry[strings.ToLower(name)]; ok {
63 return style
64 }
65 return Fallback
66}