diff options
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/init.go | 110 | ||||
| -rw-r--r-- | cmd/root.go | 1 |
2 files changed, 98 insertions, 13 deletions
diff --git a/cmd/init.go b/cmd/init.go index 836670d..b32dad0 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -3,6 +3,8 @@ package cmd import ( "fmt" "os" + "os/exec" + "path/filepath" "github.com/charmbracelet/bubbletea" "github.com/charmbracelet/lipgloss" @@ -36,18 +38,18 @@ var ( ) type InitModel struct { - step int - blogName string - siteTitle string - authorName string - authorRole string - authorBio string - theme string - themes []string - cursor int - inputBuffer string - quitting bool - focusedInput bool + step int + blogName string + siteTitle string + authorName string + authorRole string + authorBio string + theme string + themes []string + cursor int + inputBuffer string + quitting bool + finished bool } func (m *InitModel) Init() tea.Cmd { @@ -140,6 +142,8 @@ func (m *InitModel) handleEnter() (tea.Model, tea.Cmd) { case 6: m.theme = m.themes[m.cursor] m.step++ + m.finished = true + return m, tea.Quit } return m, nil } @@ -190,11 +194,66 @@ func (m *InitModel) View() string { } } s += "\n" + helpStyle.Render("↑↓ to select · enter to confirm") + default: + s = "Setting up your blog..." } return s } +func copyDir(src, dst string) error { + return filepath.Walk(src, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + rel, err := filepath.Rel(src, path) + if err != nil { + return err + } + dstPath := filepath.Join(dst, rel) + if info.IsDir() { + return os.MkdirAll(dstPath, 0o755) + } + data, err := os.ReadFile(path) + if err != nil { + return err + } + return os.WriteFile(dstPath, data, info.Mode()) + }) +} + +func downloadThemes() error { + themesURL := "https://github.com/HimanshuSardana/kite/archive/refs/heads/main.zip" + + fmt.Println(" Downloading themes from GitHub...") + + cmd := exec.Command("curl", "-sL", themesURL, "-o", "kite-main.zip") + if err := cmd.Run(); err != nil { + return fmt.Errorf("failed to download: %w", err) + } + + cmd = exec.Command("unzip", "-qo", "-d", ".", "kite-main.zip") + if err := cmd.Run(); err != nil { + os.Remove("kite-main.zip") + return fmt.Errorf("failed to extract: %w", err) + } + + if err := os.MkdirAll("themes", 0o755); err != nil { + return err + } + + cmd = exec.Command("cp", "-r", "kite-main/themes/.", "themes/") + if err := cmd.Run(); err != nil { + return fmt.Errorf("failed to copy themes: %w", err) + } + + os.Remove("kite-main.zip") + os.RemoveAll("kite-main") + + fmt.Println(" ✓ Themes downloaded successfully") + return nil +} + func RunInit() error { m := &InitModel{} p := tea.NewProgram(m, tea.WithAltScreen()) @@ -207,6 +266,11 @@ func RunInit() error { return nil } + if !m.finished { + fmt.Println("\nInit not complete.") + return nil + } + fmt.Println("\n" + headerStyle.Render("Setting up your blog...")) theme := m.theme @@ -221,6 +285,27 @@ func RunInit() error { } } + if _, err := os.Stat("themes/modern-light/layout.html"); err == nil { + fmt.Println(" ✓ Found themes in current directory") + } else if entries, err := os.ReadDir("../themes"); err == nil && len(entries) > 0 { + fmt.Println(" ✓ Copying themes from parent directory...") + for _, e := range entries { + if e.IsDir() { + src := filepath.Join("../themes", e.Name()) + dst := filepath.Join("themes", e.Name()) + if err := copyDir(src, dst); err != nil { + fmt.Printf(" ⚠ Could not copy theme %s: %v\n", e.Name(), err) + } + } + } + fmt.Println(" ✓ Themes copied successfully") + } else { + fmt.Println(" ⚠ No themes found - downloading from GitHub...") + if err := downloadThemes(); err != nil { + return fmt.Errorf("downloading themes: %w", err) + } + } + siteTitle := m.siteTitle if siteTitle == "" { siteTitle = m.blogName @@ -242,7 +327,6 @@ defaultTheme: "%s" "date: 2026-01-01\n" + "tags: [getting-started]\n" + "---\n\n" + - "# Welcome\n\n" + "This is your first post! Write your content in Markdown here.\n\n" + "## Getting Started\n\n" + "- Add more posts to the content/ directory\n" + diff --git a/cmd/root.go b/cmd/root.go index 3ef07bc..ef43fa8 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -65,5 +65,6 @@ EXAMPLES: DESCRIPTION: Kite converts your content into a static website using themes and templates. + Use 'kite init' to start a new blog project. `) } |
