101 lines
2.2 KiB
Go
101 lines
2.2 KiB
Go
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 <url>] <directory> [<directory>...]")
|
|
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)
|
|
}
|
|
}
|
|
}
|