templates/layout.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 | package templates import ( "go.alanpearce.eu/homestead/internal/config" g "go.alanpearce.eu/gomponents" . "go.alanpearce.eu/gomponents/html" ) type SiteSettings struct { Title string Language string Menu []config.MenuItem InjectLiveReload bool } type Attrs map[string]string type PageSettings struct { Title string TitleAttrs Attrs BodyAttrs Attrs } func extendAttrs(base Attrs, attrs Attrs) g.Node { m := base for key, value := range attrs { if v, found := base[key]; found { m[key] = v + " " + value } else { m[key] = value } } return g.MapMap(m, func(k string, v string) g.Node { return g.Attr(k, v) // can't inline this because it uses ...value, grr }) } func Layout(site SiteSettings, page PageSettings, children ...g.Node) g.Node { return Doctype( HTML( Lang(site.Language), Head( Meta(Charset("utf-8")), Meta(Name("viewport"), Content("width=device-width, initial-scale=1.0")), TitleEl(g.Text(page.Title)), Link( Rel("alternate"), Type("application/atom+xml"), Title(site.Title), Href("/atom.xml"), ), StyleEl(g.Raw(CSS)), ), Body( extendAttrs(page.BodyAttrs, nil), A(Class("skip"), Href("#main"), g.Text("Skip to main content")), Header( H2( A( extendAttrs(Attrs{ "class": "title p-name", "href": "/", }, page.TitleAttrs), g.Text(site.Title)), ), Nav( g.Map(site.Menu, func(item config.MenuItem) g.Node { return A( Href(item.URL.String()), g.If(item.URL.IsAbs(), Target("_blank")), g.Text(item.Name), ) }), ), ), Main(ID("main"), g.Group(children)), Footer( A(Href("https://git.alanpearce.eu/website"), g.Text("Content")), g.Text(" is "), A( Rel("license"), Href("http://creativecommons.org/licenses/by/4.0/"), g.Text("CC BY 4.0"), ), g.Text(". "), A(Href("https://git.alanpearce.eu/homestead"), g.Text("Site source code")), g.Text(" is "), A(Href("https://opensource.org/licenses/MIT"), g.Text("MIT")), ), g.If(site.InjectLiveReload, Script(Defer(), g.Raw(` new EventSource("/_/reload").onmessage = event => { console.log("got message", event) window.location.reload() }; `)), ), ), )) } |