GitRoot

craft your forge, build your project, grow your community freely
 1// SPDX-FileCopyrightText: 2025 Romain Maneschi <romain@gitroot.dev>
 2//
 3// SPDX-License-Identifier: EUPL-1.2
 4
 5package main
 6
 7import (
 8	"fmt"
 9	"strings"
10
11	"github.com/alecthomas/chroma"
12	codeHtml "github.com/alecthomas/chroma/formatters/html"
13	"github.com/alecthomas/chroma/lexers"
14	"github.com/alecthomas/chroma/styles"
15	gitroot "gitroot.dev/libs/golang/plugin"
16	"gitroot.dev/libs/golang/plugin/model"
17)
18
19var defaultRun = []model.PluginRun{}
20
21type Plugin struct {
22	server model.Server
23}
24
25func (p *Plugin) Init(repoName string, confHasChanged bool, serializedConf string) error { return nil }
26func (p *Plugin) StartCommit(commit model.Commit) error                                  { return nil }
27func (p *Plugin) AddFile(file model.File) error                                          { return nil }
28func (p *Plugin) ModFile(file model.File) error                                          { return nil }
29func (p *Plugin) DelFile(file model.File) error                                          { return nil }
30func (p *Plugin) EndCommit(commit model.Commit) error                                    { return nil }
31func (p *Plugin) Finish() error                                                          { return nil }
32
33func Build(server model.Server) model.Plugin {
34	p := &Plugin{
35		server: server,
36	}
37	server.ExportFunc("renderCode", func(args map[string]string) (map[string]string, error) {
38		code := args["code"]
39		lang := args["lang"]
40		html, err := renderCode(code, lang)
41		if err != nil {
42			return nil, err
43		}
44		return map[string]string{
45			"html": html,
46		}, nil
47	})
48	return p
49}
50
51func renderCode(source, lang string) (string, error) {
52	l := lexers.Get(lang)
53	if l == nil {
54		l = lexers.Analyse(source)
55	}
56	if l == nil {
57		l = lexers.Fallback
58	}
59	l = chroma.Coalesce(l)
60
61	it, err := l.Tokenise(nil, source)
62	if err != nil {
63		return "", err
64	}
65	highlightStyle := styles.Get("dracula")
66	if highlightStyle == nil {
67		return "", fmt.Errorf("didn't find style '%s'", "dracula")
68	}
69	var builder strings.Builder
70	if err := codeHtml.New(codeHtml.WithLineNumbers(true), codeHtml.LinkableLineNumbers(true, "L")).Format(&builder, highlightStyle, it); err != nil {
71		return "", err
72	}
73	return builder.String(), nil
74}
75
76//go:wasmexport install
77func main() {
78	gitroot.Register(defaultRun, Build, nil)
79}