128 lines
2.3 KiB
Go
128 lines
2.3 KiB
Go
package dunst
|
|
|
|
import (
|
|
"Sithego/themer"
|
|
"os"
|
|
"path/filepath"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
"text/template"
|
|
)
|
|
|
|
type Adapter struct {
|
|
OutputDir string
|
|
}
|
|
|
|
type Option func(*Adapter)
|
|
|
|
func WithOutputDir(dir string) Option {
|
|
return func(a *Adapter) {
|
|
a.OutputDir = dir
|
|
}
|
|
}
|
|
|
|
func New(opt ...Option) *Adapter {
|
|
home, _ := os.UserHomeDir()
|
|
a := &Adapter{
|
|
OutputDir: filepath.Join(home, ".config", "dunst"),
|
|
}
|
|
for _, o := range opt {
|
|
o(a)
|
|
}
|
|
return a
|
|
}
|
|
|
|
func (a *Adapter) Name() string { return "Dunst" }
|
|
|
|
type tmplData struct {
|
|
Theme themer.Theme
|
|
Padding struct {
|
|
V int
|
|
H int
|
|
}
|
|
Radius struct {
|
|
Small int
|
|
Base int
|
|
Large int
|
|
}
|
|
}
|
|
|
|
func (a *Adapter) Generate(t themer.Theme) error {
|
|
templatePath := filepath.Join("themer", "adapters", "dunst", "dunstrc")
|
|
templ, err := template.ParseFiles(templatePath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := os.MkdirAll(a.OutputDir, 0o755); err != nil {
|
|
return err
|
|
}
|
|
outputPath := filepath.Join(a.OutputDir, "dunstrc")
|
|
f, err := os.Create(outputPath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer f.Close()
|
|
|
|
data := tmplData{Theme: t}
|
|
|
|
vp, hp := parsePaddingPair(t.Spacing.Padding)
|
|
data.Padding.V = vp
|
|
data.Padding.H = hp
|
|
data.Radius.Small = parsePx(t.Spacing.RadiusSmall)
|
|
if data.Radius.Small == 0 {
|
|
data.Radius.Small = 4
|
|
}
|
|
data.Radius.Base = parsePx(t.Spacing.Radius)
|
|
if data.Radius.Base == 0 {
|
|
data.Radius.Base = data.Radius.Small
|
|
}
|
|
data.Radius.Large = parsePx(t.Spacing.RadiusLarge)
|
|
if data.Radius.Large == 0 {
|
|
data.Radius.Base = data.Radius.Large
|
|
}
|
|
|
|
if err := templ.Execute(f, data); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
var rePxPair = regexp.MustCompile(`(?i)\b(\d+)\s*px\b(?:\s+(\d+)\s*px\b)?`)
|
|
var rePx = regexp.MustCompile(`(?i)\b(\d+)\s*px\b`)
|
|
|
|
func parsePaddingPair(s string) (int, int) {
|
|
s = strings.TrimSpace(s)
|
|
if s == "" {
|
|
return 0, 0
|
|
}
|
|
m := rePxPair.FindStringSubmatch(s)
|
|
if len(m) == 3 {
|
|
v, _ := strconv.Atoi(m[1])
|
|
if m[2] != "" {
|
|
h, _ := strconv.Atoi(m[2])
|
|
return v, h
|
|
}
|
|
// single value provided -> use for both
|
|
return v, v
|
|
}
|
|
// fallback: try generic px
|
|
m2 := rePx.FindStringSubmatch(s)
|
|
if len(m2) == 2 {
|
|
v, _ := strconv.Atoi(m2[1])
|
|
return v, v
|
|
}
|
|
return 0, 0
|
|
}
|
|
|
|
func parsePx(s string) int {
|
|
s = strings.TrimSpace(s)
|
|
m := rePx.FindStringSubmatch(s)
|
|
if len(m) == 2 {
|
|
v, _ := strconv.Atoi(m[1])
|
|
return v
|
|
}
|
|
return 0
|
|
}
|