2022-08-28 11:14:11 +02:00
|
|
|
import Foundation
|
|
|
|
|
2022-12-19 23:31:06 +01:00
|
|
|
typealias SVGSelection = (x: Int, y: Int, width: Int, height: Int)
|
|
|
|
|
2022-08-28 11:14:11 +02:00
|
|
|
struct HTMLElementsGenerator {
|
|
|
|
|
|
|
|
func make(title: String, suffix: String) -> String {
|
|
|
|
"\(title)<span class=\"suffix\">\(suffix)</span>"
|
|
|
|
}
|
2022-08-28 14:01:53 +02:00
|
|
|
|
2022-09-04 17:47:13 +02:00
|
|
|
func topBarWebsiteTitle(language: String, from page: Element) -> String {
|
|
|
|
guard let pathToRoot = page.pathToRoot else {
|
|
|
|
return Element.htmlPageName(for: language)
|
|
|
|
}
|
|
|
|
return pathToRoot + Element.htmlPagePathAddition(for: language)
|
2022-08-28 14:01:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func topBarLanguageButton(_ language: String) -> String {
|
2022-08-31 00:02:42 +02:00
|
|
|
"<a href=\"\(Element.htmlPageName(for: language))\">\(language)</a>"
|
2022-08-28 14:01:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func topBarNavigationLink(url: String, text: String, isActive: Bool) -> String {
|
|
|
|
"<a\(isActive ? " class=\"active\"" : "") href=\"/\(url)\">\(text)</a>"
|
|
|
|
}
|
|
|
|
|
|
|
|
func linkPreviewImage(file: String) -> String {
|
|
|
|
"<meta property=\"og:image\" content=\"\(file)\" />"
|
|
|
|
}
|
|
|
|
|
|
|
|
func makePrevText(_ text: String) -> String {
|
|
|
|
"<span class=\"icon-back\"></span>\(text)"
|
|
|
|
}
|
|
|
|
|
|
|
|
func makeNextText(_ text: String) -> String {
|
|
|
|
"\(text)<span class=\"icon-next\"></span>"
|
|
|
|
}
|
2022-08-29 13:35:25 +02:00
|
|
|
|
2022-12-21 12:59:42 +01:00
|
|
|
func image(file: String, width: Int, height: Int, altText: String) -> String {
|
2022-12-27 09:57:34 +01:00
|
|
|
let ratio = Float(width) / Float(height)
|
|
|
|
return """
|
2022-08-29 13:35:25 +02:00
|
|
|
<span class="image">
|
2022-12-27 09:57:34 +01:00
|
|
|
<img src="\(file)" loading="lazy" style="aspect-ratio:\(ratio)" alt="\(altText)"/>
|
2022-08-29 13:35:25 +02:00
|
|
|
</span>
|
|
|
|
"""
|
|
|
|
}
|
|
|
|
|
2022-12-27 09:57:34 +01:00
|
|
|
func svgImage(file: String, part: SVGSelection, altText: String) -> String {
|
|
|
|
let path = "\(file)#svgView(viewBox(\(part.x), \(part.y), \(part.width), \(part.height)))"
|
|
|
|
return image(file: path, width: part.width, height: part.height, altText: altText)
|
2022-08-29 13:35:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func downloadButtons(_ buttons: [(file: String, text: String, downloadName: String?)]) -> String {
|
|
|
|
let content = buttons.map {
|
|
|
|
if let download = $0.downloadName {
|
|
|
|
return button(file: $0.file, text: $0.text, downloadName: download)
|
|
|
|
} else {
|
|
|
|
return button(file: $0.file, text: $0.text)
|
|
|
|
}
|
|
|
|
}.joined(separator: "\n")
|
|
|
|
return flexParagraph(content)
|
|
|
|
}
|
|
|
|
|
2022-08-30 11:29:53 +02:00
|
|
|
func externalButtons(_ buttons: [(url: String, text: String)]) -> String {
|
|
|
|
let content = buttons
|
|
|
|
.map { externalLink(url: $0.url, text: $0.text) }
|
|
|
|
.joined(separator: "\n")
|
|
|
|
return flexParagraph(content)
|
|
|
|
}
|
|
|
|
|
2022-08-29 13:35:25 +02:00
|
|
|
private func flexParagraph(_ content: String) -> String {
|
|
|
|
"""
|
|
|
|
<p style="display: flex">
|
|
|
|
\(content)
|
|
|
|
</p>
|
|
|
|
"""
|
|
|
|
}
|
|
|
|
|
|
|
|
private func button(file: String, text: String) -> String {
|
|
|
|
"""
|
|
|
|
<a class="download-button" href="\(file)">
|
2022-08-30 11:29:53 +02:00
|
|
|
\(text)<span class="icon icon-download"></span>
|
2022-08-29 13:35:25 +02:00
|
|
|
</a>
|
|
|
|
"""
|
|
|
|
}
|
|
|
|
|
|
|
|
private func button(file: String, text: String, downloadName: String) -> String {
|
|
|
|
"""
|
|
|
|
<a class="download-button" href="\(file)" download="\(downloadName)">
|
2022-08-30 11:29:53 +02:00
|
|
|
\(text)<span class="icon icon-download"></span>
|
2022-08-29 13:35:25 +02:00
|
|
|
</a>
|
2022-08-30 11:29:53 +02:00
|
|
|
"""
|
|
|
|
}
|
2022-08-29 13:35:25 +02:00
|
|
|
|
2022-08-30 11:29:53 +02:00
|
|
|
private func externalLink(url: String, text: String) -> String {
|
|
|
|
"""
|
|
|
|
<a class="download-button" href="\(url)">
|
|
|
|
\(text)<span class="icon icon-download icon-rotate"></span>
|
|
|
|
</a>
|
2022-08-29 13:35:25 +02:00
|
|
|
"""
|
|
|
|
}
|
|
|
|
|
2023-12-18 21:30:39 +01:00
|
|
|
func scriptInclude(path: String, asModule: Bool) -> String {
|
|
|
|
if asModule {
|
|
|
|
return "<script type=\"module\" src=\"\(path)\"></script>"
|
|
|
|
}
|
|
|
|
return "<script src=\"\(path)\"></script>"
|
2022-08-29 13:35:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func codeHighlightFooter() -> String {
|
|
|
|
"<script>hljs.highlightAll();</script>"
|
|
|
|
}
|
2022-08-28 11:14:11 +02:00
|
|
|
}
|