Skip to content

Instantly share code, notes, and snippets.

@illia-danko
Created January 1, 2023 18:27
Show Gist options
  • Save illia-danko/3245c6e99eca3b092e34a9105e2d1c7f to your computer and use it in GitHub Desktop.
Save illia-danko/3245c6e99eca3b092e34a9105e2d1c7f to your computer and use it in GitHub Desktop.
Generate iterm2 theme from RGB hex colors.
// Generate iterm2 theme from RGB hex colors.
//
// The Golang main file reads rgb hex colors from stdin and produces iterm2 theme to stdout.
//
// The usage example of dark variant of https://github.com/navarasu/onedark.nvim:
//
// cat <<EOF | go run generate-iterm2-theme.go >> onedark.itermcolors
// #282c34
// #abb2bf
// #181a1f
// #e86671
// #98c379
// #e5c07b
// #61afef
// #c678dd
// #56b6c2
// #abb2bf
// #5c6370
// #e86671
// #98c379
// #e5c07b
// #61afef
// #c678dd
// #56b6c2
// #abb2bf
// EOF
//
// The example above is annotating as:
//
// cat <<EOF | go run generate-iterm2-theme.go >> onedark.itermcolors
// bg_color
// fg_color
// color0
// color1
// color2
// color3
// color4
// color5
// color6
// color7
// color8
// color9
// color10
// color11
// color12
// color13
// color14
// color15
// EOF
package main
import (
"bufio"
"os"
"strconv"
"strings"
"text/template"
)
var templ = template.Must(template.New("iterm").Parse(itermTemplate))
func main() {
var a Attrs
r := bufio.NewReader(os.Stdin)
a.CBg = rgb(r.ReadString('\n'))
a.CFg = rgb(r.ReadString('\n'))
a.C0 = rgb(r.ReadString('\n'))
a.C1 = rgb(r.ReadString('\n'))
a.C2 = rgb(r.ReadString('\n'))
a.C3 = rgb(r.ReadString('\n'))
a.C4 = rgb(r.ReadString('\n'))
a.C5 = rgb(r.ReadString('\n'))
a.C6 = rgb(r.ReadString('\n'))
a.C7 = rgb(r.ReadString('\n'))
a.C8 = rgb(r.ReadString('\n'))
a.C9 = rgb(r.ReadString('\n'))
a.C10 = rgb(r.ReadString('\n'))
a.C11 = rgb(r.ReadString('\n'))
a.C12 = rgb(r.ReadString('\n'))
a.C13 = rgb(r.ReadString('\n'))
a.C14 = rgb(r.ReadString('\n'))
a.C15 = rgb(r.ReadString('\n'))
a.CBold = a.CFg
a.CCursor = a.CFg
a.CCursorText = a.CBg
a.CSel = a.CFg
a.CSelText = a.CBg
if err := templ.Execute(os.Stdout, a); err != nil {
panic(err)
}
}
func rgb(s string, err error) RGB {
var rgb RGB
if err != nil {
return rgb
}
s = strings.TrimPrefix(strings.TrimSpace(s), "#")
val, err := strconv.ParseInt(s, 16, 0)
if err != nil {
panic(err)
}
rgb.B = float64(val&0xFF) / 255.0
rgb.G = float64((val&0xFF00)>>8) / 255.0
rgb.R = float64(val>>16) / 255.0
return rgb
}
type RGB struct {
R float64
G float64
B float64
}
type Attrs struct {
C0 RGB
C1 RGB
C10 RGB
C11 RGB
C12 RGB
C13 RGB
C14 RGB
C15 RGB
C2 RGB
C3 RGB
C4 RGB
C5 RGB
C6 RGB
C7 RGB
C8 RGB
C9 RGB
CBg RGB
CBold RGB
CCursor RGB
CCursorText RGB
CFg RGB
CSelText RGB
CSel RGB
}
var itermTemplate = `<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Ansi 0 Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.C0.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.C0.G}}</real>
<key>Red Component</key>
<real>{{.C0.R}}</real>
</dict>
<key>Ansi 1 Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.C1.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.C1.G}}</real>
<key>Red Component</key>
<real>{{.C1.R}}</real>
</dict>
<key>Ansi 10 Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.C10.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.C10.G}}</real>
<key>Red Component</key>
<real>{{.C10.R}}</real>
</dict>
<key>Ansi 11 Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.C11.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.C11.G}}</real>
<key>Red Component</key>
<real>{{.C11.R}}</real>
</dict>
<key>Ansi 12 Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.C12.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.C12.G}}</real>
<key>Red Component</key>
<real>{{.C12.R}}</real>
</dict>
<key>Ansi 13 Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.C13.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.C13.G}}</real>
<key>Red Component</key>
<real>{{.C13.R}}</real>
</dict>
<key>Ansi 14 Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.C14.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.C14.G}}</real>
<key>Red Component</key>
<real>{{.C14.R}}</real>
</dict>
<key>Ansi 15 Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.C15.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.C15.G}}</real>
<key>Red Component</key>
<real>{{.C15.R}}</real>
</dict>
<key>Ansi 2 Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.C2.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.C2.G}}</real>
<key>Red Component</key>
<real>{{.C2.R}}</real>
</dict>
<key>Ansi 3 Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.C3.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.C3.G}}</real>
<key>Red Component</key>
<real>{{.C3.R}}</real>
</dict>
<key>Ansi 4 Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.C4.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.C4.G}}</real>
<key>Red Component</key>
<real>{{.C4.R}}</real>
</dict>
<key>Ansi 5 Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.C5.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.C5.G}}</real>
<key>Red Component</key>
<real>{{.C5.R}}</real>
</dict>
<key>Ansi 6 Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.C6.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.C6.G}}</real>
<key>Red Component</key>
<real>{{.C6.R}}</real>
</dict>
<key>Ansi 7 Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.C7.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.C7.G}}</real>
<key>Red Component</key>
<real>{{.C7.R}}</real>
</dict>
<key>Ansi 8 Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.C8.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.C8.G}}</real>
<key>Red Component</key>
<real>{{.C8.R}}</real>
</dict>
<key>Ansi 9 Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.C9.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.C9.G}}</real>
<key>Red Component</key>
<real>{{.C9.R}}</real>
</dict>
<key>Background Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.CBg.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.CBg.G}}</real>
<key>Red Component</key>
<real>{{.CBg.R}}</real>
</dict>
<key>Bold Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.CBold.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.CBg.G}}</real>
<key>Red Component</key>
<real>{{.CBg.R}}</real>
</dict>
<key>Cursor Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.CCursor.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.CCursor.G}}</real>
<key>Red Component</key>
<real>{{.CCursor.R}}</real>
</dict>
<key>Cursor Text Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.CCursorText.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.CCursorText.G}}</real>
<key>Red Component</key>
<real>{{.CCursorText.R}}</real>
</dict>
<key>Foreground Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.CFg.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.CFg.G}}</real>
<key>Red Component</key>
<real>{{.CFg.R}}</real>
</dict>
<key>Selected Text Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.CSelText.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.CSelText.G}}</real>
<key>Red Component</key>
<real>{{.CSelText.R}}</real>
</dict>
<key>Selection Color</key>
<dict>
<key>Alpha Component</key>
<real>1</real>
<key>Blue Component</key>
<real>{{.CSel.B}}</real>
<key>Color Space</key>
<string>sRGB</string>
<key>Green Component</key>
<real>{{.CSel.G}}</real>
<key>Red Component</key>
<real>{{.CSel.R}}</real>
</dict>
</dict>
</plist>`
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment