diff options
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/handler/git/handler.go | 2 | ||||
| -rw-r--r-- | pkg/handler/router.go | 9 | ||||
| -rw-r--r-- | pkg/handler/static/handler.go | 49 | 
3 files changed, 60 insertions, 0 deletions
diff --git a/pkg/handler/git/handler.go b/pkg/handler/git/handler.go index ffa5dfd..d046d19 100644 --- a/pkg/handler/git/handler.go +++ b/pkg/handler/git/handler.go @@ -349,6 +349,7 @@ func (g *GitHandler) Blob(w http.ResponseWriter, r *ext.Request) error {  	formatter := html.New(  		html.WithLineNumbers(true),  		html.WithLinkableLineNumbers(true, "L"), +		html.WithClasses(true),  	)  	iterator, err := lexer.Tokenise(nil, string(file)) @@ -440,6 +441,7 @@ func (g *GitHandler) Commit(w http.ResponseWriter, r *ext.Request) error {  	formatter := html.New(  		html.WithLineNumbers(true),  		html.WithLinkableLineNumbers(true, "L"), +		html.WithClasses(true),  	)  	iterator, err := lexer.Tokenise(nil, diff) diff --git a/pkg/handler/router.go b/pkg/handler/router.go index fea8827..bc81350 100644 --- a/pkg/handler/router.go +++ b/pkg/handler/router.go @@ -31,6 +31,14 @@ func MountHandler(  		return nil, err  	} +	cssStaticHandler, err := static.ServeStaticCSSHandler( +		configRepo.GetSyntaxHighlight(), +		configRepo.GetSyntaxHighlightDark(), +	) +	if err != nil { +		return nil, err +	} +  	mux := ext.NewRouter()  	mux.AddMiddleware(ext.Compress)  	mux.AddMiddleware(ext.Log) @@ -45,6 +53,7 @@ func MountHandler(  	}  	mux.HandleFunc("/static/{file}", staticHandler) +	mux.HandleFunc("/static/theme", cssStaticHandler)  	mux.HandleFunc("/{name}/about/{$}", gitHandler.About)  	mux.HandleFunc("/{name}", gitHandler.Multiplex)  	mux.HandleFunc("/{name}/{rest...}", gitHandler.Multiplex) diff --git a/pkg/handler/static/handler.go b/pkg/handler/static/handler.go index cdb2ae6..779c786 100644 --- a/pkg/handler/static/handler.go +++ b/pkg/handler/static/handler.go @@ -1,6 +1,8 @@  package static  import ( +	"fmt" +	"io"  	"io/fs"  	"mime"  	"net/http" @@ -8,6 +10,9 @@ import (  	"git.gabrielgio.me/cerrado/pkg/ext"  	"git.gabrielgio.me/cerrado/static" +	"github.com/alecthomas/chroma/v2" +	"github.com/alecthomas/chroma/v2/formatters/html" +	"github.com/alecthomas/chroma/v2/styles"  )  func ServeStaticHandler() (ext.ErrorRequestHandler, error) { @@ -28,3 +33,47 @@ func ServeStaticHandler() (ext.ErrorRequestHandler, error) {  		return nil  	}, nil  } + +func ServeStaticCSSHandler(lightTheme, darkTheme string) (ext.ErrorRequestHandler, error) { +	var ( +		lightStyle = styles.Get(lightTheme) +		darkStyle  = styles.Get(darkTheme) +		formatter  = html.New( +			html.WithCSSComments(false), +		) +	) + +	return func(w http.ResponseWriter, r *ext.Request) error { +		ext.SetMIME(w, "text/css") + +		var style *chroma.Style +		style = darkStyle +		w.Write([]byte("[data-bs-theme=\"dark\"] {\n")) +		err := formatter.WriteCSS(&ws{w}, style) +		if err != nil { +			return err +		} +		w.Write([]byte("}\n")) + +		style = lightStyle +		w.Write([]byte("[data-bs-theme=\"light\"] {\n")) +		err = formatter.WriteCSS(&ws{w}, style) +		if err != nil { +			return err +		} +		w.Write([]byte("\n}")) + +		return nil +	}, nil +} + +type ws struct { +	inner io.Writer +} + +// This is very cursed, and rely on the fact that it writes every css rule at time. +// it adds & to the begging so it can be nested by the ServeStaticCSSHandler. +// This will allow the follow bootstrap data-bs-theme. +func (w *ws) Write(p []byte) (n int, err error) { +	return fmt.Fprintf(w.inner, "& %s", string(p)) +}  | 
