all repos — elgit @ a943f744c1f12ceda9e066cfe350c1aa782f3290

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
package templates

import (
	"fmt"
	"strings"

	"alin.ovh/elgit/config"
	"alin.ovh/elgit/git"
	g "alin.ovh/gomponents"
	c "alin.ovh/gomponents/components"
	. "alin.ovh/gomponents/html"
)

type Error struct {
	Code    int
	Message string
}

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

func RenderHead(data PageData) []g.Node {
	return []g.Node{
		Link(Rel("stylesheet"), Href("/static/style.css"), Type("text/css")),
		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",
		Title:    GenerateTitle(data),
		Head:     RenderHead(data),
		Body:     body,
	})
}

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

func GenerateTitle(data PageData) string {
	metaTitle := data.Meta.Title

	switch {
	case data.Parent != "":
		return fmt.Sprintf("%s — %s (%s): %s/", metaTitle, data.Name, data.Ref, data.Parent)
	case data.Path != "":
		return fmt.Sprintf("%s — %s (%s): %s", metaTitle, data.Name, data.Ref, data.Path)
	case data.Name != "":
		return fmt.Sprintf("%s — %s", metaTitle, data.Name)
	default:
		return metaTitle
	}
}