package main import ( "flag" "fmt" "html/template" "os" "path/filepath" "sort" "strings" ) type IndexData struct { Dir string Files []FileEntry RootURL string } type FileEntry struct { Name string URL string } func generateIndex(dir string, rootURL string) error { entries, err := os.ReadDir(dir) if err != nil { return fmt.Errorf("failed to read directory: %w", err) } // Normalize root URL (remove trailing slash) rootURL = strings.TrimSuffix(rootURL, "/") var fileNames []string for _, entry := range entries { name := entry.Name() // Skip the index.html itself and hidden files if name != "index.html" && !filepath.HasPrefix(name, ".") { fileNames = append(fileNames, name) } } sort.Strings(fileNames) // Build file entries with absolute URLs var files []FileEntry dirName := filepath.Base(dir) for _, name := range fileNames { // URL encode the filename for the path url := fmt.Sprintf("%s/%s/%s", rootURL, dirName, name) files = append(files, FileEntry{ Name: name, URL: url, }) } templatePath := "build/index.html.tmpl" tmpl, err := template.ParseFiles(templatePath) if err != nil { return fmt.Errorf("failed to parse template: %w", err) } indexPath := filepath.Join(dir, "index.html") f, err := os.Create(indexPath) if err != nil { return fmt.Errorf("failed to create index.html: %w", err) } defer f.Close() data := IndexData{ Dir: dirName, Files: files, RootURL: rootURL, } if err := tmpl.Execute(f, data); err != nil { return fmt.Errorf("failed to execute template: %w", err) } fmt.Printf("Generated index.html in %s\n", dir) return nil } func main() { rootURL := flag.String("root", "https://ss-6r6jq.ondigitalocean.app", "Root domain URL for absolute links") flag.Parse() dirs := flag.Args() if len(dirs) == 0 { fmt.Println("Usage: generate-index [-root ] [...]") fmt.Println(" -root string") fmt.Println(" Root domain URL for absolute links (default \"https://ss-6r6jq.ondigitalocean.app\")") os.Exit(1) } for _, dir := range dirs { if err := generateIndex(dir, *rootURL); err != nil { fmt.Fprintf(os.Stderr, "Error processing %s: %v\n", dir, err) os.Exit(1) } } }