Add navigation settings, fix page generation
This commit is contained in:
@ -13,7 +13,7 @@ struct FeedEntry {
|
||||
}
|
||||
|
||||
var content: String {
|
||||
var result = "<div class='card\(cardLinkClassText)'>"
|
||||
var result = "<article><div class='card\(cardLinkClassText)'>"
|
||||
ImageGallery(id: data.entryId, images: data.images)
|
||||
.addContent(to: &result)
|
||||
|
||||
@ -34,7 +34,7 @@ struct FeedEntry {
|
||||
if let url = data.link {
|
||||
result += "<div class='link-center'><div class='link'>\(url.text)</div></div>"
|
||||
}
|
||||
result += "</div></div>" // Closes card-content and card
|
||||
result += "</div></div></article>" // Closes card-content, card, article
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
28
CHDataManagement/Page Elements/GenericPage.swift
Normal file
28
CHDataManagement/Page Elements/GenericPage.swift
Normal file
@ -0,0 +1,28 @@
|
||||
import Foundation
|
||||
|
||||
struct GenericPage {
|
||||
|
||||
let header: PageHeader
|
||||
|
||||
let additionalFooter: String
|
||||
|
||||
let insertedContent: (inout String) -> Void
|
||||
|
||||
init(header: PageHeader,
|
||||
additionalFooter: String,
|
||||
insertedContent: @escaping (inout String) -> Void) {
|
||||
self.header = header
|
||||
self.additionalFooter = additionalFooter
|
||||
self.insertedContent = insertedContent
|
||||
}
|
||||
|
||||
var content: String {
|
||||
var result = ""
|
||||
header.populate(&result) // Opens <html><body><main>
|
||||
insertedContent(&result)
|
||||
result += "</main>" // Close <main>
|
||||
result += additionalFooter
|
||||
result += "</body></html>" // Close <body><html>
|
||||
return result
|
||||
}
|
||||
}
|
@ -12,25 +12,29 @@ struct NavigationBar: HtmlProducer {
|
||||
|
||||
private let links: [Link]
|
||||
|
||||
init(links: [Link]) {
|
||||
private let languageButton: Link
|
||||
|
||||
private let iconUrl: String
|
||||
|
||||
init(links: [Link], languageButton: Link, iconUrl: String) {
|
||||
self.links = links
|
||||
self.languageButton = languageButton
|
||||
self.iconUrl = iconUrl
|
||||
}
|
||||
|
||||
func populate(_ result: inout String) {
|
||||
result += "<nav class='navbar'><div class='navbar-fade'></div><div class='nav-center'>"
|
||||
let middleIndex = links.count / 2
|
||||
let leftNavigationItems = links[..<middleIndex]
|
||||
let rightNavigationItems = links[middleIndex...]
|
||||
|
||||
for item in leftNavigationItems {
|
||||
result += "<a class='nav-animate' href='\(item.url)'>\(item.text)</a>"
|
||||
result += "<nav class='navbar'>"
|
||||
result += "<div class='fade'></div>"
|
||||
result += "<div class='centered'>"
|
||||
result += "<a class='icon-link' href='\(iconUrl)'><div class='icon'></div></a>"
|
||||
result += "<div class='buttons'><input type='checkbox' id='menu-toggle'>"
|
||||
result += "<label for='menu-toggle' class='burger'><div></div><div></div><div></div></label>"
|
||||
result += "<ul>"
|
||||
for item in links {
|
||||
result += "<li><a href='\(item.url)'>\(item.text)</a></li>"
|
||||
}
|
||||
|
||||
result += "<a id='nav-image' href='/'><div class='icon-ch'></div></a>"
|
||||
|
||||
for item in rightNavigationItems {
|
||||
result += "<a class='nav-animate' href='\(item.url)'>\(item.text)</a>"
|
||||
}
|
||||
result += "</div></nav>" // Close nav-center, navbar
|
||||
result += "</ul>"
|
||||
result += "<a class='lang-button' href='\(languageButton.url)'>\(languageButton.text)</a>"
|
||||
result += "</div></div></nav>" // Close buttons, centered, navbar
|
||||
}
|
||||
}
|
||||
|
60
CHDataManagement/Page Elements/PageHeader.swift
Normal file
60
CHDataManagement/Page Elements/PageHeader.swift
Normal file
@ -0,0 +1,60 @@
|
||||
|
||||
struct PageHeader: HtmlProducer {
|
||||
|
||||
let language: ContentLanguage
|
||||
|
||||
let iconUrl: String
|
||||
|
||||
let languageButton: NavigationBar.Link
|
||||
|
||||
let links: [NavigationBar.Link]
|
||||
|
||||
let headers: [HeaderElement]
|
||||
|
||||
let icons: Set<PageIcon>
|
||||
|
||||
init(
|
||||
language: ContentLanguage,
|
||||
title: String,
|
||||
description: String?,
|
||||
iconUrl: String,
|
||||
languageButton: NavigationBar.Link,
|
||||
links: [NavigationBar.Link],
|
||||
headers: Set<HeaderElement>,
|
||||
icons: Set<PageIcon>) {
|
||||
self.language = language
|
||||
self.iconUrl = iconUrl
|
||||
self.languageButton = languageButton
|
||||
self.links = links
|
||||
self.icons = icons
|
||||
|
||||
var headers = headers
|
||||
headers.insert(.title(title))
|
||||
if let description {
|
||||
headers.insert(.description(description))
|
||||
}
|
||||
self.headers = headers.sorted()
|
||||
}
|
||||
|
||||
func populate(_ result: inout String) {
|
||||
result += "<!DOCTYPE html><html lang=\"\(language.rawValue)\">"
|
||||
result += PageHead(items: headers).content
|
||||
result += "<body>"
|
||||
result += NavigationBar(links: links, languageButton: languageButton, iconUrl: iconUrl).content
|
||||
result += symbols // Add the svg images required by the page as hidden elements
|
||||
result += "<main>"
|
||||
result += "<div class='navbar-spacer'></div>"
|
||||
}
|
||||
|
||||
private var symbols: String {
|
||||
guard !icons.isEmpty else {
|
||||
return ""
|
||||
}
|
||||
var result = "<div style='display:none'>"
|
||||
for icon in icons {
|
||||
result += icon.icon.content
|
||||
}
|
||||
result += "</div>"
|
||||
return result
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user