mirror of
https://github.com/tiennm99/ghglance.git
synced 2026-10-11 03:13:20 +00:00
The Marketplace rejects ghstats as an action name, so the repo, Go module, binary, and action share the name ghglance instead. The demo workflow keeps reading the existing GHSTATS_TOKEN repo secret.
60 lines
1.6 KiB
Go
60 lines
1.6 KiB
Go
// Package card renders Profile data into SVG cards on disk.
|
|
package card
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/tiennm99/ghglance/internal/github"
|
|
"github.com/tiennm99/ghglance/internal/theme"
|
|
)
|
|
|
|
// Card renders one SVG for a Profile under the given theme.
|
|
type Card interface {
|
|
// Filename is the on-disk basename (e.g. "profile-details.svg").
|
|
Filename() string
|
|
// SVG returns the rendered SVG bytes.
|
|
SVG(p *github.Profile, t theme.Theme) ([]byte, error)
|
|
}
|
|
|
|
// allCards is the ordered list rendered by RenderAll. Filenames are plain
|
|
// kebab-case — README authors embed them by name, not by lexicographic order.
|
|
var allCards = []Card{
|
|
profileCard{},
|
|
reposPerLanguageCard{},
|
|
mostCommitLanguageCard{},
|
|
statsCard{},
|
|
productiveCard{},
|
|
productiveWeekdayCard{},
|
|
contributionsCard{},
|
|
contributionsHeatmapCard{},
|
|
topStarredReposCard{},
|
|
streakCard{},
|
|
mostCommitLanguageAllTimeCard{},
|
|
productiveAllTimeCard{},
|
|
productiveWeekdayAllTimeCard{},
|
|
contributionsAllTimeCard{},
|
|
contributionsByYearCard{},
|
|
recordsCard{},
|
|
}
|
|
|
|
// RenderAll writes every card into outDir/<themeID>/.
|
|
func RenderAll(p *github.Profile, t theme.Theme, outDir string) error {
|
|
dir := filepath.Join(outDir, t.ID)
|
|
if err := os.MkdirAll(dir, 0o755); err != nil {
|
|
return fmt.Errorf("mkdir %s: %w", dir, err)
|
|
}
|
|
for _, c := range allCards {
|
|
data, err := c.SVG(p, t)
|
|
if err != nil {
|
|
return fmt.Errorf("render %s: %w", c.Filename(), err)
|
|
}
|
|
path := filepath.Join(dir, c.Filename())
|
|
if err := os.WriteFile(path, data, 0o644); err != nil {
|
|
return fmt.Errorf("write %s: %w", path, err)
|
|
}
|
|
}
|
|
return nil
|
|
}
|