aboutsummaryrefslogtreecommitdiff
path: root/pkg/handler/static
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/handler/static')
-rw-r--r--pkg/handler/static/handler.go49
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))
+}