Refactor Hyprland configs, introduce Sithego for theming, and add supporting scripts
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
package intellij
|
||||
|
||||
import (
|
||||
"Sithego/themer"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"text/template"
|
||||
)
|
||||
|
||||
type Adapter struct {
|
||||
OutputDir string
|
||||
}
|
||||
|
||||
type Option func(*Adapter)
|
||||
|
||||
func WithOutputDir(dir string) Option {
|
||||
abs, err := filepath.Abs(dir)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return func(a *Adapter) {
|
||||
a.OutputDir = abs
|
||||
}
|
||||
}
|
||||
|
||||
func New(opt ...Option) *Adapter {
|
||||
home, _ := os.UserHomeDir()
|
||||
a := &Adapter{
|
||||
OutputDir: home + "/.themes/",
|
||||
}
|
||||
for _, o := range opt {
|
||||
o(a)
|
||||
}
|
||||
return a
|
||||
}
|
||||
|
||||
func (a *Adapter) Name() string {
|
||||
return "IntelliJ"
|
||||
}
|
||||
|
||||
func (a *Adapter) Generate(t themer.Theme) error {
|
||||
// 1. Create temporary directory structure for JAR bundling
|
||||
tmpDir, err := os.MkdirTemp("", "intellij-theme-*")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer func(path string) {
|
||||
err := os.RemoveAll(path)
|
||||
if err != nil {
|
||||
|
||||
}
|
||||
}(tmpDir)
|
||||
|
||||
metaInfDir := filepath.Join(tmpDir, "META-INF")
|
||||
if err := os.MkdirAll(metaInfDir, 0775); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
funcMap := template.FuncMap{
|
||||
"lower": strings.ToLower,
|
||||
}
|
||||
|
||||
// 2. Generate plugin.xml
|
||||
pluginTempl := template.New("template.plugin.xml").Funcs(funcMap)
|
||||
pluginTempl, err = pluginTempl.ParseFiles("themer/adapters/intellij/template.plugin.xml")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
pluginFile, err := os.Create(filepath.Join(metaInfDir, "plugin.xml"))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := pluginTempl.Execute(pluginFile, struct{ Theme themer.Theme }{Theme: t}); err != nil {
|
||||
_ = pluginFile.Close()
|
||||
return err
|
||||
}
|
||||
_ = pluginFile.Close()
|
||||
|
||||
// 3. Generate .theme.json
|
||||
themeTempl, err := template.ParseFiles("themer/adapters/intellij/template.theme.json")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
themeName := t.Meta.Name + ".theme.json"
|
||||
themeFile, err := os.Create(filepath.Join(tmpDir, themeName))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := themeTempl.Execute(themeFile, struct{ Theme themer.Theme }{Theme: t}); err != nil {
|
||||
_ = themeFile.Close()
|
||||
return err
|
||||
}
|
||||
_ = themeFile.Close()
|
||||
|
||||
// 4. Bundle everything into a JAR (using zip)
|
||||
jarName := t.Meta.Name + ".jar"
|
||||
outputDir := filepath.Join(a.OutputDir, t.Meta.Name, "intellij")
|
||||
if err := os.MkdirAll(outputDir, 0775); err != nil {
|
||||
return err
|
||||
}
|
||||
jarPath := filepath.Join(outputDir, jarName)
|
||||
_ = os.Remove(jarPath) // Remove old JAR if exists
|
||||
cmd := exec.Command("zip", "-r", jarPath, ".")
|
||||
cmd.Dir = tmpDir
|
||||
if err := cmd.Run(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user