From ada6a68b4f25c912705542a6b03aae7ffffb5e99 Mon Sep 17 00:00:00 2001 From: "Gabriel A. Giovanini" Date: Sat, 5 Oct 2024 16:47:32 +0200 Subject: feat: Make syntax highlight configurable Now cerrado has configurable theme through "syntax-highlight". --- config.example.scfg | 1 + main.go | 16 ++++++++++++--- pkg/config/config.go | 50 ++++++++++++++++++++++++++++++---------------- pkg/config/config_test.go | 9 +++++---- pkg/handler/git/handler.go | 10 ++++++---- 5 files changed, 58 insertions(+), 28 deletions(-) diff --git a/config.example.scfg b/config.example.scfg index f29e3ca..0c27591 100644 --- a/config.example.scfg +++ b/config.example.scfg @@ -5,6 +5,7 @@ listen-addr unix://var/run/cerrado.sock root-readme /srv/git/README.md passphrase $2a$14$VnB/ZcB1DUDkMnosRA6Y7.dj8h5eroslDxTeXlLwfQX/x86mh6WAq aes-key 8XHptZxSWCGs1m7QzztX5zNQ7D9NiQevVX0DaUTNMbDpRwFzoJiB0U7K6O/kqIt01jJVgzBUfiR8ES46ZLLb4w== +syntax-highlight monokailight scan /srv/git/ { public true diff --git a/main.go b/main.go index 8bf5141..918b794 100644 --- a/main.go +++ b/main.go @@ -11,6 +11,7 @@ import ( "os/signal" "time" + "github.com/alecthomas/chroma/v2/styles" "golang.org/x/crypto/bcrypt" "git.gabrielgio.me/cerrado/pkg/config" @@ -71,9 +72,7 @@ func key() error { } func run(ctx context.Context) error { - var ( - configPath = flag.String("config", "/etc/cerrado.scfg", "File path for the configuration file") - ) + configPath := flag.String("config", "/etc/cerrado.scfg", "File path for the configuration file") flag.Parse() @@ -83,6 +82,17 @@ func run(ctx context.Context) error { return err } + // checking chroma configurationo + + if _, ok := styles.Registry[configRepo.GetSyntaxHighlight()]; !ok { + slog.Warn( + "Invalid Syntax highlight selected", + "invalid-style", configRepo.GetSyntaxHighlight(), + "using", "monokailight", + ) + styles.Fallback = styles.Registry["monokailight"] + } + // services gitService := service.NewGitService(configRepo) diff --git a/pkg/config/config.go b/pkg/config/config.go index 902ff0d..812a06e 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -30,12 +30,13 @@ type ( // configuration represents file configuration. // fields needs to be exported to cmp to work configuration struct { - Scan *scan - RootReadme string - ListenAddr string - Passphrase string - AESKey string - Repositories []*GitRepositoryConfiguration + Scan *scan + RootReadme string + ListenAddr string + Passphrase string + SyntaxHighlight string + AESKey string + Repositories []*GitRepositoryConfiguration } // This is a per repository configuration. @@ -52,11 +53,12 @@ type ( // This holds all the function necessary to ask for configuration // information. ConfigurationRepository struct { - rootReadme string - listenAddr string - passphrase string - aesKey string - repositories []*GitRepositoryConfiguration + rootReadme string + listenAddr string + passphrase string + aesKey string + syntaxHighlight string + repositories []*GitRepositoryConfiguration } ) @@ -72,11 +74,12 @@ func LoadConfigurationRepository(configPath string) (*ConfigurationRepository, e } repo := &ConfigurationRepository{ - rootReadme: config.RootReadme, - listenAddr: config.ListenAddr, - repositories: config.Repositories, - passphrase: config.Passphrase, - aesKey: config.AESKey, + aesKey: config.AESKey, + listenAddr: config.ListenAddr, + passphrase: config.Passphrase, + repositories: config.Repositories, + rootReadme: config.RootReadme, + syntaxHighlight: config.SyntaxHighlight, } if config.Scan.Path != "" { @@ -87,7 +90,6 @@ func LoadConfigurationRepository(configPath string) (*ConfigurationRepository, e } return repo, nil - } // GetRootReadme returns root read path @@ -95,6 +97,10 @@ func (c *ConfigurationRepository) GetRootReadme() string { return c.rootReadme } +func (c *ConfigurationRepository) GetSyntaxHighlight() string { + return c.syntaxHighlight +} + func (c *ConfigurationRepository) GetListenAddr() string { return c.listenAddr } @@ -186,6 +192,11 @@ func parse(r io.Reader) (*configuration, error) { return nil, err } + err = setSyntaxHighlight(block, &config.SyntaxHighlight) + if err != nil { + return nil, err + } + err = setRepositories(block, &config.Repositories) if err != nil { return nil, err @@ -289,6 +300,11 @@ func setAESKey(block scfg.Block, listenAddr *string) error { return setString(scanDir, listenAddr) } +func setSyntaxHighlight(block scfg.Block, listenAddr *string) error { + scanDir := block.Get("syntax-highlight") + return setString(scanDir, listenAddr) +} + func setListenAddr(block scfg.Block, listenAddr *string) error { scanDir := block.Get("listen-addr") return setString(scanDir, listenAddr) diff --git a/pkg/config/config_test.go b/pkg/config/config_test.go index 0970cfa..9080351 100644 --- a/pkg/config/config_test.go +++ b/pkg/config/config_test.go @@ -105,6 +105,7 @@ repository /srv/git/cerrado.git { listen-addr unix://var/run/cerrado/cerrado.sock passphrase $2a$14$VnB/ZcB1DUDkMnosRA6Y7.dj8h5eroslDxTeXlLwfQX/x86mh6WAq aes-key 8XHptZxSWCGs1m7QzztX5zNQ7D9NiQevVX0DaUTNMbDpRwFzoJiB0U7K6O/kqIt01jJVgzBUfiR8ES46ZLLb4w== +syntax-highlight monokailight scan "/srv/git" { public true @@ -123,9 +124,10 @@ repository /srv/git/cerrado.git { Public: true, Path: "/srv/git", }, - ListenAddr: "unix://var/run/cerrado/cerrado.sock", - Passphrase: "$2a$14$VnB/ZcB1DUDkMnosRA6Y7.dj8h5eroslDxTeXlLwfQX/x86mh6WAq", - AESKey: "8XHptZxSWCGs1m7QzztX5zNQ7D9NiQevVX0DaUTNMbDpRwFzoJiB0U7K6O/kqIt01jJVgzBUfiR8ES46ZLLb4w==", + ListenAddr: "unix://var/run/cerrado/cerrado.sock", + Passphrase: "$2a$14$VnB/ZcB1DUDkMnosRA6Y7.dj8h5eroslDxTeXlLwfQX/x86mh6WAq", + AESKey: "8XHptZxSWCGs1m7QzztX5zNQ7D9NiQevVX0DaUTNMbDpRwFzoJiB0U7K6O/kqIt01jJVgzBUfiR8ES46ZLLb4w==", + SyntaxHighlight: "monokailight", Repositories: []*GitRepositoryConfiguration{ { Name: "linux.git", @@ -158,6 +160,5 @@ repository /srv/git/cerrado.git { t.Errorf("Wrong result given - wanted + got\n %s", diff) } }) - } } diff --git a/pkg/handler/git/handler.go b/pkg/handler/git/handler.go index 6fae146..5739c8e 100644 --- a/pkg/handler/git/handler.go +++ b/pkg/handler/git/handler.go @@ -27,18 +27,19 @@ import ( type ( GitHandler struct { gitService *service.GitService - readmePath string + config configurationRepository } configurationRepository interface { GetRootReadme() string + GetSyntaxHighlight() string } ) func NewGitHandler(gitService *service.GitService, confRepo configurationRepository) *GitHandler { return &GitHandler{ gitService: gitService, - readmePath: confRepo.GetRootReadme(), + config: confRepo, } } @@ -48,7 +49,7 @@ func (g *GitHandler) List(w http.ResponseWriter, _ *http.Request) error { return err } - f, err := os.Open(g.readmePath) + f, err := os.Open(g.config.GetRootReadme()) if err != nil { return err } @@ -280,7 +281,8 @@ func (g *GitHandler) Blob(w http.ResponseWriter, r *http.Request) error { filename := filepath.Base(rest) lexer := GetLexers(filename) - style := styles.Get("xcode") + style := styles.Get(g.config.GetSyntaxHighlight()) + formatter := html.New( html.WithLineNumbers(true), html.WithLinkableLineNumbers(true, "L"), -- cgit v1.2.3