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 109 110 111 112 113 114 115 116 117 118 | 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
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
RenderedContent string
Branches any
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")),
Link(Rel("icon"), Type("image/png"), g.Attr("sizes", "32x32"), Href("/static/elgit.png")),
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.Files != nil:
return fmt.Sprintf("%s — %s (%s)", metaTitle, data.Name, data.Ref)
case data.Commit != nil:
return fmt.Sprintf("%s — %s: %s", metaTitle, data.Name, data.Commit.This)
case data.Branches != nil:
return fmt.Sprintf("%s — %s: refs", metaTitle, data.Name)
case data.Commits != nil:
if data.Log {
return fmt.Sprintf("%s — %s: log", metaTitle, data.Name)
} else {
return fmt.Sprintf("%s — %s", metaTitle, data.Name)
}
case data.Name != "":
return fmt.Sprintf("%s — %s", metaTitle, data.Name)
default:
return metaTitle
}
}
|