2019-10-27 17:04:31 +01:00
|
|
|
package formatters
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io"
|
|
|
|
"sort"
|
|
|
|
|
|
|
|
"github.com/alecthomas/chroma"
|
|
|
|
"github.com/alecthomas/chroma/formatters/html"
|
2019-11-08 02:24:08 +01:00
|
|
|
"github.com/alecthomas/chroma/formatters/svg"
|
2019-10-27 17:04:31 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
// NoOp formatter.
|
|
|
|
NoOp = Register("noop", chroma.FormatterFunc(func(w io.Writer, s *chroma.Style, iterator chroma.Iterator) error {
|
|
|
|
for t := iterator(); t != chroma.EOF; t = iterator() {
|
|
|
|
if _, err := io.WriteString(w, t.Value); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}))
|
|
|
|
// Default HTML formatter outputs self-contained HTML.
|
2019-12-28 15:56:19 +01:00
|
|
|
htmlFull = Register("html", html.New(html.Standalone(true), html.WithClasses(true))) // nolint
|
2019-11-08 02:24:08 +01:00
|
|
|
SVG = Register("svg", svg.New(svg.EmbedFont("Liberation Mono", svg.FontLiberationMono, svg.WOFF)))
|
2019-10-27 17:04:31 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
// Fallback formatter.
|
|
|
|
var Fallback = NoOp
|
|
|
|
|
|
|
|
// Registry of Formatters.
|
|
|
|
var Registry = map[string]chroma.Formatter{}
|
|
|
|
|
|
|
|
// Names of registered formatters.
|
|
|
|
func Names() []string {
|
|
|
|
out := []string{}
|
|
|
|
for name := range Registry {
|
|
|
|
out = append(out, name)
|
|
|
|
}
|
|
|
|
sort.Strings(out)
|
|
|
|
return out
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get formatter by name.
|
|
|
|
//
|
|
|
|
// If the given formatter is not found, the Fallback formatter will be returned.
|
|
|
|
func Get(name string) chroma.Formatter {
|
|
|
|
if f, ok := Registry[name]; ok {
|
|
|
|
return f
|
|
|
|
}
|
|
|
|
return Fallback
|
|
|
|
}
|
|
|
|
|
|
|
|
// Register a named formatter.
|
|
|
|
func Register(name string, formatter chroma.Formatter) chroma.Formatter {
|
|
|
|
Registry[name] = formatter
|
|
|
|
return formatter
|
|
|
|
}
|