diff options
Diffstat (limited to 'pkg/handler/static')
| -rw-r--r-- | pkg/handler/static/handler.go | 49 | 
1 files changed, 49 insertions, 0 deletions
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)) +}  | 
