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