all repos — elgit @ 8decac83bcee6c44838e3715a86190052a584c67

fork of legit: web frontend for git, written in go

templates/page.go (view raw)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package templates

import (
	"fmt"
	"strings"

	"go.alanpearce.eu/elgit/config"
	"go.alanpearce.eu/elgit/git"
	g "go.alanpearce.eu/gomponents"
	c "go.alanpearce.eu/gomponents/components"
	. "go.alanpearce.eu/gomponents/html"
)

type PageData struct {
	Meta        config.Meta
	DisplayName string
	Name        string
	Ref         string
	Readme      string
	Description string
	Path        string
	Parent      string
	Files       any
	Diff        []git.Diff
	Stat        git.Stat
	Commit      *git.Commit
	Commits     []*git.Commit
	LineCount   []int
	Content     string
	Branches    any
	Log         bool
	Servername  string
	Gomod       bool
}

func RenderHead(data PageData) []g.Node {
	var title string
	metaTitle := data.Meta.Title

	switch {
	case data.Parent != "":
		title = fmt.Sprintf("%s — %s (%s): %s/", metaTitle, data.Name, data.Ref, data.Parent)
	case data.Path != "":
		title = fmt.Sprintf("%s — %s (%s): %s", metaTitle, data.Name, data.Ref, data.Path)
	case data.Files != nil:
		title = fmt.Sprintf("%s — %s (%s)", metaTitle, data.Name, data.Ref)
	case data.Commit != nil:
		title = fmt.Sprintf("%s — %s: %s", metaTitle, data.Name, data.Commit.This)
	case data.Branches != nil:
		title = fmt.Sprintf("%s — %s: refs", metaTitle, data.Name)
	case data.Commits != nil:
		if data.Log {
			title = fmt.Sprintf("%s — %s: log", metaTitle, data.Name)
		} else {
			title = fmt.Sprintf("%s — %s", metaTitle, data.Name)
		}
	default:
		title = metaTitle
	}

	return []g.Node{
		Link(Rel("stylesheet"), Href("/static/style.css"), Type("text/css")),
		Link(Rel("icon"), Type("image/png"), g.Attr("sizes", "32x32"), Href("/static/elgit.png")),
		TitleEl(g.Text(title)),
		g.If(data.Servername != "" && data.Gomod,
			Meta(
				Name("go-import"),
				Content(fmt.Sprintf("%s/%s git https://%[1]s/%[2]s", data.Servername, data.Name)),
			),
		),
	}
}

func RenderNav(data PageData) g.Node {
	return Nav(Ul(
		g.If(data.Name != "", NavItem(joinPaths(data.Name), "summary")),
		g.If(data.Name != "", NavItem(joinPaths(data.Name, "refs", ""), "refs")),
		g.If(data.Ref != "", NavItem(joinPaths(data.Name, "tree", data.Ref, ""), "tree")),
		g.If(data.Ref != "", NavItem(joinPaths(data.Name, "log", data.Ref), "log")),
	))
}

func NavItem(href string, text string) g.Node {
	return Li(A(Href(href), g.Text(text)))
}

func RepoHeader(data PageData) g.Node {
	return Header(
		H2(
			A(Href("/"), g.Text("all repos")),
			g.Textf(" — %s", data.DisplayName),
			g.If(data.Ref != "", Span(Class("ref"), g.Textf(" @ %s", data.Ref))),
		),
		H3(Class("desc"), g.Text(data.Description)),
	)
}

func Page(data PageData, body []g.Node) g.Node {
	return c.HTML5(c.HTML5Props{
		Language: "en",
		Head:     RenderHead(data),
		Body:     body,
	})
}

func joinPaths(paths ...string) string {
	return "/" + strings.Join(paths, "/")
}