From 0f8156e3a22e2202ec05c6faf4d8706bce4f44a3 Mon Sep 17 00:00:00 2001 From: Federico <16429579+rawnly@users.noreply.github.com> Date: Sun, 26 Oct 2025 00:57:08 +0200 Subject: [PATCH 1/6] feat: add theme generation --- __tests__/parser_test.go | 4 +- cmd/extract/root.go | 48 ++++++++ cmd/root.go | 8 +- go.mod | 10 +- go.sum | 16 ++- iterm.itermcolors | 82 +++++++++++++ lib/template.go | 17 ++- pkg/base16/builder.go | 255 +++++++++++++++++++++++++++++++++++++++ pkg/base16/extractor.go | 99 +++++++++++++++ showcase.sh | 10 ++ 10 files changed, 532 insertions(+), 17 deletions(-) create mode 100644 cmd/extract/root.go create mode 100644 iterm.itermcolors create mode 100644 pkg/base16/builder.go create mode 100644 pkg/base16/extractor.go create mode 100755 showcase.sh diff --git a/__tests__/parser_test.go b/__tests__/parser_test.go index 75a6ece8..fe8e411d 100644 --- a/__tests__/parser_test.go +++ b/__tests__/parser_test.go @@ -54,9 +54,9 @@ func parseResult(s string) string { } } -func TestParsePhotoIDFromUrl(t *testing.T) { +func TestParsePhotoIDFromURL(t *testing.T) { for i, tCase := range photoUrls { - result := lib.ParsePhotoIDFromUrl(tCase.data) + result := lib.ParsePhotoIDFromURL(tCase.data) if result != tCase.expected { t.Errorf("[%d] Expected \"%s\" received \"%s\"", i, tCase.expected, parseResult(result)) diff --git a/cmd/extract/root.go b/cmd/extract/root.go new file mode 100644 index 00000000..3cf55e4c --- /dev/null +++ b/cmd/extract/root.go @@ -0,0 +1,48 @@ +package extract + +import ( + "fmt" + + "github.com/rawnly/splash-cli/pkg/base16" + "github.com/reujab/wallpaper" + "github.com/spf13/cobra" +) + +var flagPlatform base16.Platform + +func init() { + Cmd.Flags().Var(&flagPlatform, "platform", fmt.Sprintf("platform to extract colors for (%v)", flagPlatform.Values())) +} + +var Cmd = &cobra.Command{ + Use: "extract", + Short: "extract colors from the current wallpaper", + Example: "splash extract -p wezterm", + Aliases: []string{"export", "e"}, + RunE: func(cmd *cobra.Command, args []string) error { + filepath, err := wallpaper.Get() + if err != nil { + return err + } + + if flagPlatform.String() == "" { + var json []byte + _, json, err = base16.GetScheme(filepath) + if err != nil { + return err + } + + fmt.Println(string(json)) + return nil + } + + thm, err := base16.GetTheme(filepath, flagPlatform) + if err != nil { + return err + } + + fmt.Println(thm) + + return nil + }, +} diff --git a/cmd/root.go b/cmd/root.go index 4f6f6750..a3653867 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -15,6 +15,7 @@ import ( "github.com/rawnly/splash-cli/cmd/alias" "github.com/rawnly/splash-cli/cmd/auth" "github.com/rawnly/splash-cli/cmd/collection" + "github.com/rawnly/splash-cli/cmd/extract" "github.com/rawnly/splash-cli/cmd/settings" "github.com/rawnly/splash-cli/config" "github.com/rawnly/splash-cli/lib" @@ -213,12 +214,6 @@ var rootCmd = &cobra.Command{ } var location string - - // debug printing - fmt.Println("Download location:", downloadLocation) - fmt.Println("Ignore cache:", ignoreCacheFlag) - fmt.Println("File exists:", lib.FileExists(downloadLocation)) - if lib.FileExists(downloadLocation) && !ignoreCacheFlag { location = downloadLocation @@ -359,6 +354,7 @@ func init() { rootCmd.AddCommand(alias.Cmd) rootCmd.AddCommand(settings.Cmd) rootCmd.AddCommand(collection.Cmd) + rootCmd.AddCommand(extract.Cmd) rootCmd.SetVersionTemplate("{{ .Version }}") } diff --git a/go.mod b/go.mod index 75bf59c7..c36ff9cb 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/rawnly/splash-cli -go 1.23.0 +go 1.24.0 toolchain go1.24.1 @@ -9,13 +9,16 @@ require ( github.com/MakeNowJust/heredoc v1.0.0 github.com/bbrks/go-blurhash v1.1.1 github.com/briandowns/spinner v1.23.0 + github.com/cenkalti/dominantcolor v1.0.3 github.com/cli/browser v1.3.0 github.com/eiannone/keyboard v0.0.0-20220611211555-0d226195f203 github.com/getsentry/sentry-go v0.25.0 github.com/google/uuid v1.6.0 + github.com/lucasb-eyer/go-colorful v1.3.0 github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d github.com/posthog/posthog-go v0.0.0-20230801140217-d607812dee69 github.com/rawnly/go-wallpaper v1.0.2 + github.com/reujab/wallpaper v0.0.0-20210630195606-5f9f655b3740 github.com/rs/zerolog v1.34.0 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cast v1.6.0 @@ -47,9 +50,10 @@ require ( github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/exp v0.0.0-20231226003508-02704c960a9b // indirect - golang.org/x/sys v0.33.0 // indirect + golang.org/x/image v0.18.0 // indirect + golang.org/x/sys v0.37.0 // indirect golang.org/x/term v0.15.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/text v0.30.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index b5264985..a5be10e7 100644 --- a/go.sum +++ b/go.sum @@ -11,6 +11,8 @@ github.com/bbrks/go-blurhash v1.1.1 h1:uoXOxRPDca9zHYabUTwvS4KnY++KKUbwFo+Yxb8ME github.com/bbrks/go-blurhash v1.1.1/go.mod h1:lkAsdyXp+EhARcUo85yS2G1o+Sh43I2ebF5togC4bAY= github.com/briandowns/spinner v1.23.0 h1:alDF2guRWqa/FOZZYWjlMIx2L6H0wyewPxo/CH4Pt2A= github.com/briandowns/spinner v1.23.0/go.mod h1:rPG4gmXeN3wQV/TsAY4w8lPdIM6RX3yqeBQJSrbXjuE= +github.com/cenkalti/dominantcolor v1.0.3 h1:Pt0vfRZ8enkZh1n22RvoboA53SMM/v2aEwNQTZKSqww= +github.com/cenkalti/dominantcolor v1.0.3/go.mod h1:mGpFMbWUnyXaGN48Zbf9bU9HJP1eCCD7dnsscb4lyR4= github.com/cli/browser v1.3.0 h1:LejqCrpWr+1pRqmEPDGnTZOjsMe7sehifLynZJuqJpo= github.com/cli/browser v1.3.0/go.mod h1:HH8s+fOAxjhQoBUAsKuPCbqUuxZDhQ2/aD+SzsEfBTk= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= @@ -60,6 +62,8 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= +github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= @@ -91,6 +95,8 @@ github.com/posthog/posthog-go v0.0.0-20230801140217-d607812dee69 h1:01dHVodha5Bz github.com/posthog/posthog-go v0.0.0-20230801140217-d607812dee69/go.mod h1:migYMxlAqcnQy+3eN8mcL0b2tpKy6R+8Zc0lxwk4dKM= github.com/rawnly/go-wallpaper v1.0.2 h1:ttmYCIMwzjuPDTpL7pG9eXjN8PZ3TOVu8wEKO9ojuFA= github.com/rawnly/go-wallpaper v1.0.2/go.mod h1:qpQ8yj7TK2yZL2YtBjbGf8l0QwtHRwjXfW28j1XjhBs= +github.com/reujab/wallpaper v0.0.0-20210630195606-5f9f655b3740 h1:X6IDPPN+zrSClp0Q+JiERA//d8L0WcU5MqcGeulCW1A= +github.com/reujab/wallpaper v0.0.0-20210630195606-5f9f655b3740/go.mod h1:WYwPVmM/8szeItLeWkwZSLRvQgrvsvstRzgznR8+E4Q= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= @@ -145,6 +151,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp v0.0.0-20231226003508-02704c960a9b h1:kLiC65FbiHWFAOu+lxwNPujcsl8VYyTYYEZnsOO1WK4= golang.org/x/exp v0.0.0-20231226003508-02704c960a9b/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +golang.org/x/image v0.18.0 h1:jGzIakQa/ZXI1I0Fxvaa9W7yP25TqT6cHIHn+6CqvSQ= +golang.org/x/image v0.18.0/go.mod h1:4yyo5vMFQjVjUcVk4jEQcU9MGy/rulF5WvUILseCM2E= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -162,8 +170,8 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= @@ -172,8 +180,8 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= diff --git a/iterm.itermcolors b/iterm.itermcolors new file mode 100644 index 00000000..fd2630d4 --- /dev/null +++ b/iterm.itermcolors @@ -0,0 +1,82 @@ + + + + + + Ansi 0 Color Red Component0.015686 +Green Component0.125490 +Blue Component0.164706 + Ansi 1 Color Red Component0.454902 +Green Component0.384314 +Blue Component0.427451 + Ansi 2 Color Red Component0.043137 +Green Component0.137255 +Blue Component0.176471 + Ansi 3 Color Red Component0.098039 +Green Component0.164706 +Blue Component0.203922 + Ansi 4 Color Red Component0.015686 +Green Component0.125490 +Blue Component0.164706 + Ansi 5 Color Red Component0.015686 +Green Component0.125490 +Blue Component0.164706 + Ansi 6 Color Red Component0.023529 +Green Component0.129412 +Blue Component0.168627 + Ansi 7 Color Red Component0.572549 +Green Component0.447059 +Blue Component0.415686 + + + Ansi 8 Color Red Component0.172549 +Green Component0.274510 +Blue Component0.329412 + Ansi 9 Color Red Component0.454902 +Green Component0.384314 +Blue Component0.427451 + Ansi 10 Color Red Component0.043137 +Green Component0.137255 +Blue Component0.176471 + Ansi 11 Color Red Component0.098039 +Green Component0.164706 +Blue Component0.203922 + Ansi 12 Color Red Component0.015686 +Green Component0.125490 +Blue Component0.164706 + Ansi 13 Color Red Component0.015686 +Green Component0.125490 +Blue Component0.164706 + Ansi 14 Color Red Component0.023529 +Green Component0.129412 +Blue Component0.168627 + Ansi 15 Color Red Component0.921569 +Green Component0.670588 +Blue Component0.725490 + + + Background Color Red Component0.015686 +Green Component0.125490 +Blue Component0.164706 + Foreground Color Red Component0.572549 +Green Component0.447059 +Blue Component0.415686 + Cursor Color Red Component0.572549 +Green Component0.447059 +Blue Component0.415686 + Cursor Text Color Red Component0.015686 +Green Component0.125490 +Blue Component0.164706 + Selection Color Red Component0.019608 +Green Component0.211765 +Blue Component0.282353 + Selected Text Color Red Component0.572549 +Green Component0.447059 +Blue Component0.415686 + Bold Color Red Component0.921569 +Green Component0.670588 +Blue Component0.725490 + + + diff --git a/lib/template.go b/lib/template.go index 7fc8541a..ce8fba70 100644 --- a/lib/template.go +++ b/lib/template.go @@ -3,11 +3,13 @@ package lib import ( "bytes" "fmt" - "github.com/mgutz/ansi" "io" "math" "strconv" "text/template" + + "github.com/lucasb-eyer/go-colorful" + "github.com/mgutz/ansi" ) type Template struct { @@ -25,6 +27,18 @@ var templateFunctions = map[string]interface{}{ "diff": func(a interface{}, b interface{}) interface{} { return a.(int32) - b.(int32) }, "abs": math.Abs, "formatNumber": formatNumber, + "itermRGB": itermRGB, +} + +func itermRGB(hex string) string { + c, _ := colorful.Hex(hex) + + return fmt.Sprintf( + `Red Component%.6f +Green Component%.6f +Blue Component%.6f`, + c.R, c.G, c.B, + ) } func NewTemplate(templateString string, name string) (*template.Template, error) { @@ -36,7 +50,6 @@ func NewTemplate(templateString string, name string) (*template.Template, error) func (t Template) Execute(w io.Writer) error { temp, err := NewTemplate(t.Template, "") - if err != nil { return err } diff --git a/pkg/base16/builder.go b/pkg/base16/builder.go new file mode 100644 index 00000000..57046c31 --- /dev/null +++ b/pkg/base16/builder.go @@ -0,0 +1,255 @@ +package base16 + +import ( + "fmt" + + "github.com/MakeNowJust/heredoc" + "github.com/rawnly/splash-cli/lib" +) + +var ghosttyTemplate = heredoc.Doc(` +## author: Splash CLI + +background = {{ .Base00 }} +foreground= {{ .Base07 }} + +selection-foreground= {{ .Base00 }} +selection-background = {{ .Base07 }} + + +# black +palette = 0={{ .Base00 }} +palette = 8={{ .Base08 }} +# red +palette = 1={{ .Base01 }} +palette = 9={{ .Base09 }} +# green +palette = 2={{ .Base02 }} +palette = 10={{ .Base10 }} +# yellow +palette = 3={{ .Base03 }} +palette = 11={{ .Base11 }} +# blue +palette = 4={{ .Base04 }} +palette = 12={{ .Base12 }} +# purple +palette = 5={{ .Base05 }} +palette = 13={{ .Base13 }} +# aqua +palette = 6={{ .Base06 }} +palette = 14={{ .Base14 }} +# white +palette = 7={{ .Base07 }} +palette = 15={{ .Base15 }} +`) + +var weztermTemplate = heredoc.Doc(` +[colors] +# Standard colors +base00 = "{{ .Base00 }}" # 0 - Background +base01 = "{{ .Base01 }}" # 1 +base02 = "{{ .Base02 }}" # 2 +base03 = "{{ .Base03 }}" # 3 +base04 = "{{ .Base04 }}" # 4 +base05 = "{{ .Base05 }}" # 5 - Default text / foreground +base06 = "{{ .Base06 }}" # 6 +base07 = "{{ .Base07 }}" # 7 +base08 = "{{ .Base08 }}" # 8 - Red / errors +base09 = "{{ .Base09 }}" # 9 - Orange / warnings +base10 = "{{ .Base10 }}" # 10 - Yellow / highlights +base11 = "{{ .Base11 }}" # 11 - Green / success +base12 = "{{ .Base12 }}" # 12 - Cyan / accents +base13 = "{{ .Base13 }}" # 13 - Blue / keywords +base14 = "{{ .Base14 }}" # 14 - Magenta / constants +base15 = "{{ .Base15 }}" # 15 - Brightest / white + +[colors.mapping] +foreground = "{base07}" +background = "{base00}" +cursor_bg = "{base07}" +cursor_fg = "{base00}" +cursor_border = "{base07}" +selection_bg = "{base07}" +selection_fg = "{base00}" + +ansi = [ + "{base00}", # 0 + "{base08}", # 1 + "{base11}", # 2 + "{base10}", # 3 + "{base13}", # 4 + "{base14}", # 5 + "{base12}", # 6 + "{base05}", # 7 +] + +brights = [ + "{base03}", # 8 + "{base08}", # 9 + "{base11}", # 10 + "{base10}", # 11 + "{base13}", # 12 + "{base14}", # 13 + "{base12}", # 14 + "{base07}", # 15 +] +`) + +var kittyTemplate = heredoc.Doc(` +# 0–7: Normal colors +color0 {{ .Base00 }} # base00 - Background +color1 {{ .Base01 }} # base01 +color2 {{ .Base02 }} # base02 +color3 {{ .Base03 }} # base03 +color4 {{ .Base04 }} # base04 +color5 {{ .Base05 }} # base05 +color6 {{ .Base06 }} # base06 +color7 {{ .Base07 }} # base07 + +# 8–15: Bright colors +color8 {{ .Base08 }} # base08 +color9 {{ .Base09 }} # base09 +color10 {{ .Base10 }} # base10 +color11 {{ .Base11 }} # base11 +color12 {{ .Base12 }} # base12 +color13 {{ .Base13 }} # base13 +color14 {{ .Base14 }} # base14 +color15 {{ .Base15 }} # base15 + +# UI colors +background {{ .Base00 }} +foreground {{ .Base05 }} +cursor {{ .Base05 }} +selection_background {{ .Base02 }} +selection_foreground {{ .Base05 }} +url_color {{ .Base08 }} +active_border_color {{ .Base05 }} +inactive_border_color {{ .Base02 }} +active_tab_foreground {{ .Base07 }} +active_tab_background {{ .Base00 }} +inactive_tab_foreground {{ .Base04 }} +inactive_tab_background {{ .Base01 }} +`) + +var itermTemplate = heredoc.Doc(` + + + + + + Ansi 0 Color {{ itermRGB .Base00 }} + Ansi 1 Color {{ itermRGB .Base08 }} + Ansi 2 Color {{ itermRGB .Base11 }} + Ansi 3 Color {{ itermRGB .Base10 }} + Ansi 4 Color {{ itermRGB .Base13 }} + Ansi 5 Color {{ itermRGB .Base14 }} + Ansi 6 Color {{ itermRGB .Base12 }} + Ansi 7 Color {{ itermRGB .Base05 }} + + + Ansi 8 Color {{ itermRGB .Base03 }} + Ansi 9 Color {{ itermRGB .Base08 }} + Ansi 10 Color {{ itermRGB .Base11 }} + Ansi 11 Color {{ itermRGB .Base10 }} + Ansi 12 Color {{ itermRGB .Base13 }} + Ansi 13 Color {{ itermRGB .Base14 }} + Ansi 14 Color {{ itermRGB .Base12 }} + Ansi 15 Color {{ itermRGB .Base07 }} + + + Background Color {{ itermRGB .Base00 }} + Foreground Color {{ itermRGB .Base05 }} + Cursor Color {{ itermRGB .Base05 }} + Cursor Text Color {{ itermRGB .Base00 }} + Selection Color {{ itermRGB .Base02 }} + Selected Text Color {{ itermRGB .Base05 }} + Bold Color {{ itermRGB .Base07 }} + + +`) + +type Platform string + +func (t *Platform) Values() []string { + return []string{ + string(PlatformGhostty), + string(PlatfromIterm), + string(PlatformKitty), + string(PlatformWezterm), + string(PlatformAlacritty), + } +} + +func (t *Platform) String() string { + return string(*t) +} + +func (t *Platform) Type() string { + return "Theme" +} + +func (t *Platform) Set(v string) error { + switch v { + case string(PlatformGhostty), string(PlatfromIterm), string(PlatformKitty), string(PlatformWezterm), string(PlatformAlacritty): + *t = Platform(v) + return nil + } + + return fmt.Errorf("invalid platform: %s. Must be one of %v", v, t.Values()) +} + +func ThemeFromString(s string) (*Platform, error) { + var t Platform + + switch s { + case "ghostty": + t = PlatformGhostty + case "wezterm": + t = PlatformWezterm + case "kitty": + t = PlatformKitty + case "iterm": + t = PlatfromIterm + } + + if t == "" { + return nil, fmt.Errorf("invalid platform: %s, must be one of: %v", s, t.Values()) + } + + return &t, nil +} + +const ( + PlatformGhostty Platform = "ghostty" + PlatformKitty Platform = "kitty" + PlatfromIterm Platform = "iterm" + PlatformWezterm Platform = "wezterm" + PlatformAlacritty Platform = "alacritty" +) + +func GetTheme(imagePath string, theme Platform) (string, error) { + scheme, _, err := GetScheme(imagePath) + if err != nil { + return "", err + } + + templates := map[Platform]string{ + PlatformGhostty: ghosttyTemplate, + PlatfromIterm: itermTemplate, + PlatformKitty: kittyTemplate, + PlatformWezterm: weztermTemplate, + } + + template, ok := templates[theme] + if !ok { + return "", fmt.Errorf("unsupported platform: %v", theme) + } + + thm, err := lib.StringTemplate(template, scheme) + if err != nil { + return "", err + } + + return thm, nil +} diff --git a/pkg/base16/extractor.go b/pkg/base16/extractor.go new file mode 100644 index 00000000..add6ccc8 --- /dev/null +++ b/pkg/base16/extractor.go @@ -0,0 +1,99 @@ +package base16 + +import ( + "encoding/json" + "image" + "os" + "sort" + + _ "image/jpeg" + _ "image/png" + + "github.com/cenkalti/dominantcolor" + "github.com/lucasb-eyer/go-colorful" +) + +type Scheme struct { + Base00 string `json:"base00"` + Base01 string `json:"base01"` + Base02 string `json:"base02"` + Base03 string `json:"base03"` + Base04 string `json:"base04"` + Base05 string `json:"base05"` + Base06 string `json:"base06"` + Base07 string `json:"base07"` + Base08 string `json:"base08"` + Base09 string `json:"base09"` + Base10 string `json:"base10"` + Base11 string `json:"base11"` + Base12 string `json:"base12"` + Base13 string `json:"base13"` + Base14 string `json:"base14"` + Base15 string `json:"base15"` +} + +func buildScheme(cols []colorful.Color) Scheme { + return Scheme{ + Base00: cols[0].Hex(), + Base01: cols[1].Hex(), + Base02: cols[2].Hex(), + Base03: cols[3].Hex(), + Base04: cols[4].Hex(), + Base05: cols[5].Hex(), + Base06: cols[6].Hex(), + Base07: cols[7].Hex(), + Base08: cols[8].Hex(), + Base09: cols[9].Hex(), + Base10: cols[10].Hex(), + Base11: cols[11].Hex(), + Base12: cols[12].Hex(), + Base13: cols[13].Hex(), + Base14: cols[14].Hex(), + Base15: cols[15].Hex(), + } +} + +func GetScheme(imagePath string) (*Scheme, []byte, error) { + f, err := os.Open(imagePath) + if err != nil { + return nil, nil, err + } + + defer f.Close() + + img, _, err := image.Decode(f) + if err != nil { + return nil, nil, err + } + + raw := dominantcolor.FindN(img, 8) + var cols []colorful.Color + for _, c := range raw { + col, _ := colorful.MakeColor(c) + cols = append(cols, col) + } + + sort.Slice(cols, func(i, j int) bool { + _, _, vi := cols[i].Hsv() + _, _, vj := cols[j].Hsv() + + return vi < vj + }) + + for len(cols) < 16 { + a := cols[len(cols)-1] + b := cols[0] + + mid := a.BlendLab(b, float64(len(cols))/16.0) + cols = append(cols, mid) + } + + scheme := buildScheme(cols) + + out, err := json.MarshalIndent(scheme, "", " ") + if err != nil { + return &scheme, nil, err + } + + return &scheme, out, nil +} diff --git a/showcase.sh b/showcase.sh new file mode 100755 index 00000000..1da182d9 --- /dev/null +++ b/showcase.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +clear + +./splash +sleep 1 +./splash e >"$HOME/.config/ghostty/themes/splash" +echo "Reload your config in 2 seconds" +sleep 2 + +neofetch From 137a4658881cb8b986828700374cb834d91aca13 Mon Sep 17 00:00:00 2001 From: Federico <16429579+rawnly@users.noreply.github.com> Date: Sun, 26 Oct 2025 01:38:30 +0200 Subject: [PATCH 2/6] fix add tests --- .DS_Store | Bin 0 -> 6148 bytes cmd/extract/root.go | 9 +- pkg/base16/extractor.go | 26 ++-- pkg/{base16 => theme-generator}/builder.go | 162 +++++++-------------- pkg/theme-generator/builder_test.go | 30 ++++ pkg/theme-generator/platform.go | 43 ++++++ showcase.sh | 2 +- test-assets/.DS_Store | Bin 0 -> 6148 bytes test-assets/demo.jpeg | Bin 0 -> 29205 bytes unsplash/auth.go | 2 +- 10 files changed, 145 insertions(+), 129 deletions(-) create mode 100644 .DS_Store rename pkg/{base16 => theme-generator}/builder.go (55%) create mode 100644 pkg/theme-generator/builder_test.go create mode 100644 pkg/theme-generator/platform.go create mode 100644 test-assets/.DS_Store create mode 100644 test-assets/demo.jpeg diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..16414a13d174af08976594faef33a3f41e6590ed GIT binary patch literal 6148 zcmeHK!AiqG5Z!I7O(;SR3Oz1(t=QHgh?fxS4;aydN=-=6V9b^#wTDv3S%1hc@q3)v z-H4_3;69jC<3l$C$$yvp^ARHZ(s7j-#$f&3F*GddC3^SPoCj zij`<`{6_|G?^>{1G3;8wzVBZi&hl}X$`B&n!*QDAMYsFGYxTy~cGGHFE$hyIlrz5w zifQfzlN;<^N|}b09fVg&JR3Q?XEG~-B#S31A&FuLxxG%ZNX|St&7xf8`g*{!Eqmm& z=ktE=q$38s!J;GPC;cwiN5_kWZSCzJo?eWe(&tRRYDzhLeM)u=R`3SKn$^AdlPs0l z14LBWRTd#JKnxHAo6dka_pH{YFO=3t3=jjqW&qCz0gC7vEH$d50~-8&#PJ3q3fOp; zKokaDgQZ3o0pU6oP^WTp#o#&}{KCY!21|`PopCiYyvNMU%?*XC*}*SVIODEHYKZ}2 zV3~os?mAfi&)47omy@VR3=jhw#Q<*%{h Ansi 0 Color {{ itermRGB .Base00 }} Ansi 1 Color {{ itermRGB .Base08 }} - Ansi 2 Color {{ itermRGB .Base11 }} - Ansi 3 Color {{ itermRGB .Base10 }} - Ansi 4 Color {{ itermRGB .Base13 }} - Ansi 5 Color {{ itermRGB .Base14 }} - Ansi 6 Color {{ itermRGB .Base12 }} + Ansi 2 Color {{ itermRGB .Base0B }} + Ansi 3 Color {{ itermRGB .Base0A }} + Ansi 4 Color {{ itermRGB .Base0D }} + Ansi 5 Color {{ itermRGB .Base0E }} + Ansi 6 Color {{ itermRGB .Base0C }} Ansi 7 Color {{ itermRGB .Base05 }} Ansi 8 Color {{ itermRGB .Base03 }} Ansi 9 Color {{ itermRGB .Base08 }} - Ansi 10 Color {{ itermRGB .Base11 }} - Ansi 11 Color {{ itermRGB .Base10 }} - Ansi 12 Color {{ itermRGB .Base13 }} - Ansi 13 Color {{ itermRGB .Base14 }} - Ansi 14 Color {{ itermRGB .Base12 }} + Ansi 10 Color {{ itermRGB .Base0B }} + Ansi 11 Color {{ itermRGB .Base0A }} + Ansi 12 Color {{ itermRGB .Base0D }} + Ansi 13 Color {{ itermRGB .Base0E }} + Ansi 14 Color {{ itermRGB .Base0C }} Ansi 15 Color {{ itermRGB .Base07 }} @@ -169,67 +170,8 @@ var itermTemplate = heredoc.Doc(` `) -type Platform string - -func (t *Platform) Values() []string { - return []string{ - string(PlatformGhostty), - string(PlatfromIterm), - string(PlatformKitty), - string(PlatformWezterm), - string(PlatformAlacritty), - } -} - -func (t *Platform) String() string { - return string(*t) -} - -func (t *Platform) Type() string { - return "Theme" -} - -func (t *Platform) Set(v string) error { - switch v { - case string(PlatformGhostty), string(PlatfromIterm), string(PlatformKitty), string(PlatformWezterm), string(PlatformAlacritty): - *t = Platform(v) - return nil - } - - return fmt.Errorf("invalid platform: %s. Must be one of %v", v, t.Values()) -} - -func ThemeFromString(s string) (*Platform, error) { - var t Platform - - switch s { - case "ghostty": - t = PlatformGhostty - case "wezterm": - t = PlatformWezterm - case "kitty": - t = PlatformKitty - case "iterm": - t = PlatfromIterm - } - - if t == "" { - return nil, fmt.Errorf("invalid platform: %s, must be one of: %v", s, t.Values()) - } - - return &t, nil -} - -const ( - PlatformGhostty Platform = "ghostty" - PlatformKitty Platform = "kitty" - PlatfromIterm Platform = "iterm" - PlatformWezterm Platform = "wezterm" - PlatformAlacritty Platform = "alacritty" -) - func GetTheme(imagePath string, theme Platform) (string, error) { - scheme, _, err := GetScheme(imagePath) + scheme, _, err := base16.GetSchemeFromImage(imagePath) if err != nil { return "", err } diff --git a/pkg/theme-generator/builder_test.go b/pkg/theme-generator/builder_test.go new file mode 100644 index 00000000..f6ced9e6 --- /dev/null +++ b/pkg/theme-generator/builder_test.go @@ -0,0 +1,30 @@ +package themegenerator_test + +import ( + "testing" + + themegenerator "github.com/rawnly/splash-cli/pkg/theme-generator" +) + +func TestGetTheme(t *testing.T) { + platforms := themegenerator.PlatformValues() + + for _, platform := range platforms { + _, e := themegenerator.GetTheme("../../test-assets/demo.jpeg", themegenerator.Platform(platform)) + + if e != nil { + panic(e.Error()) + } + } +} + +// func TestParsePhotoIDFromURL(t *testing.T) { +// for i, tCase := range photoUrls { +// result := lib.ParsePhotoIDFromURL(tCase.data) +// +// if result != tCase.expected { +// t.Errorf("[%d] Expected \"%s\" received \"%s\"", i, tCase.expected, parseResult(result)) +// } +// } +// } +// diff --git a/pkg/theme-generator/platform.go b/pkg/theme-generator/platform.go new file mode 100644 index 00000000..5e8e89e2 --- /dev/null +++ b/pkg/theme-generator/platform.go @@ -0,0 +1,43 @@ +package themegenerator + +import "fmt" + +type Platform string + +const ( + PlatformGhostty Platform = "ghostty" + PlatformKitty Platform = "kitty" + PlatfromIterm Platform = "iterm" + PlatformWezterm Platform = "wezterm" +) + +func PlatformValues() []string { + return []string{ + string(PlatformGhostty), + string(PlatfromIterm), + string(PlatformKitty), + string(PlatformWezterm), + } +} + +func (p *Platform) Values() []string { + return PlatformValues() +} + +func (p *Platform) String() string { + return string(*p) +} + +func (p *Platform) Type() string { + return "Platform" +} + +func (p *Platform) Set(v string) error { + switch v { + case string(PlatformGhostty), string(PlatfromIterm), string(PlatformKitty), string(PlatformWezterm): + *p = Platform(v) + return nil + } + + return fmt.Errorf("invalid platform: %s. Must be one of %v", v, p.Values()) +} diff --git a/showcase.sh b/showcase.sh index 1da182d9..620e0604 100755 --- a/showcase.sh +++ b/showcase.sh @@ -3,7 +3,7 @@ clear ./splash sleep 1 -./splash e >"$HOME/.config/ghostty/themes/splash" +./splash e --platform ghostty >"$HOME/.config/ghostty/themes/splash" echo "Reload your config in 2 seconds" sleep 2 diff --git a/test-assets/.DS_Store b/test-assets/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 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 I!GB->2hw(LP5=M^ literal 0 HcmV?d00001 diff --git a/unsplash/auth.go b/unsplash/auth.go index b264c2a8..707fd0d0 100644 --- a/unsplash/auth.go +++ b/unsplash/auth.go @@ -57,7 +57,7 @@ func (a Api) Authenticate(code string) (*models.AuthRes, error) { } logrus.WithField("error", errorRes).WithField("status", response.Status).Error("Error while authenticating") - return nil, fmt.Errorf(errorRes.ErrorDescription) + return nil, fmt.Errorf("%s", errorRes.ErrorDescription) } var authRes models.AuthRes From fc33ce32d0a476fd7b2df4b6603a23005e36bd88 Mon Sep 17 00:00:00 2001 From: Federico <16429579+rawnly@users.noreply.github.com> Date: Sun, 26 Oct 2025 01:42:09 +0200 Subject: [PATCH 3/6] typos --- pkg/theme-generator/builder.go | 2 +- pkg/theme-generator/platform.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pkg/theme-generator/builder.go b/pkg/theme-generator/builder.go index 2f2fce25..e457245a 100644 --- a/pkg/theme-generator/builder.go +++ b/pkg/theme-generator/builder.go @@ -178,7 +178,7 @@ func GetTheme(imagePath string, theme Platform) (string, error) { templates := map[Platform]string{ PlatformGhostty: ghosttyTemplate, - PlatfromIterm: itermTemplate, + PlatformIterm: itermTemplate, PlatformKitty: kittyTemplate, PlatformWezterm: weztermTemplate, } diff --git a/pkg/theme-generator/platform.go b/pkg/theme-generator/platform.go index 5e8e89e2..7f5667c6 100644 --- a/pkg/theme-generator/platform.go +++ b/pkg/theme-generator/platform.go @@ -7,14 +7,14 @@ type Platform string const ( PlatformGhostty Platform = "ghostty" PlatformKitty Platform = "kitty" - PlatfromIterm Platform = "iterm" + PlatformIterm Platform = "iterm" PlatformWezterm Platform = "wezterm" ) func PlatformValues() []string { return []string{ string(PlatformGhostty), - string(PlatfromIterm), + string(PlatformIterm), string(PlatformKitty), string(PlatformWezterm), } @@ -34,7 +34,7 @@ func (p *Platform) Type() string { func (p *Platform) Set(v string) error { switch v { - case string(PlatformGhostty), string(PlatfromIterm), string(PlatformKitty), string(PlatformWezterm): + case string(PlatformGhostty), string(PlatformIterm), string(PlatformKitty), string(PlatformWezterm): *p = Platform(v) return nil } From 9872b56b409a3b554697e79b7de7158357b5a473 Mon Sep 17 00:00:00 2001 From: Federico <16429579+rawnly@users.noreply.github.com> Date: Sun, 26 Oct 2025 01:42:49 +0200 Subject: [PATCH 4/6] fix: improved error handling in test --- pkg/theme-generator/builder_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/theme-generator/builder_test.go b/pkg/theme-generator/builder_test.go index f6ced9e6..b0f54c42 100644 --- a/pkg/theme-generator/builder_test.go +++ b/pkg/theme-generator/builder_test.go @@ -13,7 +13,7 @@ func TestGetTheme(t *testing.T) { _, e := themegenerator.GetTheme("../../test-assets/demo.jpeg", themegenerator.Platform(platform)) if e != nil { - panic(e.Error()) + t.Fatal(e.Error()) } } } From 4dc6bfc13542914196109aeba8c4f90b3255cffb Mon Sep 17 00:00:00 2001 From: Federico <16429579+rawnly@users.noreply.github.com> Date: Sun, 26 Oct 2025 01:44:34 +0200 Subject: [PATCH 5/6] remove files --- .DS_Store | Bin 6148 -> 8196 bytes .gitignore | 1 + iterm.itermcolors | 82 ---------------------------------------------- showcase.sh | 10 ------ 4 files changed, 1 insertion(+), 92 deletions(-) delete mode 100644 iterm.itermcolors delete mode 100755 showcase.sh diff --git a/.DS_Store b/.DS_Store index 16414a13d174af08976594faef33a3f41e6590ed..1142932b9b485ebc2e80f890fb5f23b9b3e3dbd0 100644 GIT binary patch literal 8196 zcmeHMX^a#_6t361K(%W_?Ex&%NV6jdvMaO8f-Z-d-B}3BwYamevj+@4GcC0AbT89A zGsq!pJR%Y`(P#`Fza(A>zdTT5qCulS)EHbb#y?&$G5#>osDHrts;h^{;`}p!v1`)x zs$SKr*YDN)s^-lQLZGXVZ6&0U5JK_cl+|GM4~38O=aM1?oNA6=B7h2)o7o%YvdLZ<`|I!2ee9-XWG#1b?LH(lxD?bH5 z%2NQpU>oxQUq%aPETCh8`l7g|$Q~dNg&@TMA&%o3pN=#Z&@n-UH~}F}AkYj!h628J zl+*m_1Y&}Qb?AZ61DAS$!>0zbbpx|@@1p$OO_$u!wB@96#;NqEWx8H8dKRRr>PeHQ z&?&Tr?nvx$N(oQ*3T~I4ALhM&$Fb7oww~T@8l@C#hYo3@en1qb-WTW7h&xUjA&UAFG4vUTz`HPmZ)azyTDjmt_fVfE8e8LUhk-3mtQHa_E0+H?$Pr`ZwceGEU}qVe}9qBMb>6b z&&dmKG^w{yI>;C6%w};NHha#jM8B%07&GmniDT zzM~_ts2Gs(2AoIQ$vU!yq)Cn(ArFw_R|@VghrST zi(x5rz)DyRYhWGp!dB>m1ndG6?tr~ef-$%o?ty#ZC_D;}!Q=1*JO$6e33wh}fRpe# zoPsyuEjSGy!N>3kd;wp>H}D;N55K}WI1hhHvQ#J4OAXROX{i*ITBTJ|w=^IPN<-4H zG$I+2EtRB0(tW}Nsf@#&qF=71`>|EwltCN@r;PM=1srPYd)9B*xamKM!!M@^Wg6IpN~lWbR6l0KMb+0 f;Z!aY3+R}j$iZ^ie+am|-^0WEKfM31%KQH>)_0(t delta 117 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{MGjUEV6q~50$jG!YU^nAr0~wad`~qJm=ZnwS z*pSV#n4N<|kQt~92n4u+geyqL#=`H+llf&FK}Iq#GBB`!XeNl6V6n~dJad=<(83b* diff --git a/.gitignore b/.gitignore index 865bcb3c..7ddd2961 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ splash-cli .envrc dist/ *.log +./showcase.sh diff --git a/iterm.itermcolors b/iterm.itermcolors deleted file mode 100644 index fd2630d4..00000000 --- a/iterm.itermcolors +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - Ansi 0 Color Red Component0.015686 -Green Component0.125490 -Blue Component0.164706 - Ansi 1 Color Red Component0.454902 -Green Component0.384314 -Blue Component0.427451 - Ansi 2 Color Red Component0.043137 -Green Component0.137255 -Blue Component0.176471 - Ansi 3 Color Red Component0.098039 -Green Component0.164706 -Blue Component0.203922 - Ansi 4 Color Red Component0.015686 -Green Component0.125490 -Blue Component0.164706 - Ansi 5 Color Red Component0.015686 -Green Component0.125490 -Blue Component0.164706 - Ansi 6 Color Red Component0.023529 -Green Component0.129412 -Blue Component0.168627 - Ansi 7 Color Red Component0.572549 -Green Component0.447059 -Blue Component0.415686 - - - Ansi 8 Color Red Component0.172549 -Green Component0.274510 -Blue Component0.329412 - Ansi 9 Color Red Component0.454902 -Green Component0.384314 -Blue Component0.427451 - Ansi 10 Color Red Component0.043137 -Green Component0.137255 -Blue Component0.176471 - Ansi 11 Color Red Component0.098039 -Green Component0.164706 -Blue Component0.203922 - Ansi 12 Color Red Component0.015686 -Green Component0.125490 -Blue Component0.164706 - Ansi 13 Color Red Component0.015686 -Green Component0.125490 -Blue Component0.164706 - Ansi 14 Color Red Component0.023529 -Green Component0.129412 -Blue Component0.168627 - Ansi 15 Color Red Component0.921569 -Green Component0.670588 -Blue Component0.725490 - - - Background Color Red Component0.015686 -Green Component0.125490 -Blue Component0.164706 - Foreground Color Red Component0.572549 -Green Component0.447059 -Blue Component0.415686 - Cursor Color Red Component0.572549 -Green Component0.447059 -Blue Component0.415686 - Cursor Text Color Red Component0.015686 -Green Component0.125490 -Blue Component0.164706 - Selection Color Red Component0.019608 -Green Component0.211765 -Blue Component0.282353 - Selected Text Color Red Component0.572549 -Green Component0.447059 -Blue Component0.415686 - Bold Color Red Component0.921569 -Green Component0.670588 -Blue Component0.725490 - - - diff --git a/showcase.sh b/showcase.sh deleted file mode 100755 index 620e0604..00000000 --- a/showcase.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash -clear - -./splash -sleep 1 -./splash e --platform ghostty >"$HOME/.config/ghostty/themes/splash" -echo "Reload your config in 2 seconds" -sleep 2 - -neofetch From e02989757fa1f4078f5b9b11a815c0767010de2a Mon Sep 17 00:00:00 2001 From: Federico <16429579+rawnly@users.noreply.github.com> Date: Sun, 26 Oct 2025 01:45:55 +0200 Subject: [PATCH 6/6] ignore files --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7ddd2961..30a3fba9 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,4 @@ splash-cli .envrc dist/ *.log -./showcase.sh +showcase.sh