113 lines
2.4 KiB
Go
113 lines
2.4 KiB
Go
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
|
|
}
|