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}