import Foundation import HTML /// The base page layout used to render the different sections of the website. /// /// - Parameters: /// - conocicalURL: The url for the page. /// - section: The section of the page. /// - title: The page title. /// - rssLink: A prefix for generating an rss feed for the page (generally only used for articles). /// - extraHeader: Any extra items to be placed in the `head` of the html. func baseLayout( canocicalURL: String, section: Section, title pageTitle: String, rssLink: String = "", extraHeader: NodeConvertible = Node.fragment([]), @NodeBuilder children: () -> NodeConvertible ) -> Node { return [ .documentType("html"), html(lang: "en-US") { generateHeader(pageTitle, extraHeader) body(class: "bg-page text-white pb-5 font-avenir \(section.rawValue)") { div(class: "content") { children() } footer() } }, ] } private func footer() -> Node { div(class: "site-footer text-gray gray-links border-t border-light text-center pt-6 mt-8 text-sm") { p { "Copyright © Michael Housh 2023-\(Date().description.prefix(4))." } p { "Built in Swift using" a(href: "https://github.com/loopwerk/Saga", rel: "nofollow", target: "_blank") { "Saga" } } } } private func generateHeader(_ pageTitle: String, _ extraHeader: NodeConvertible) -> Node { head { meta(charset: "utf-8") title { SiteMetadata.name + ": \(pageTitle)" } link(href: "/static/style.css", rel: "stylesheet") } }