Generate open graph meta tags

This commit is contained in:
Christoph Hagen
2025-01-15 22:04:48 +01:00
parent 4b448f3415
commit f6b868502d
21 changed files with 324 additions and 109 deletions

View File

@ -24,9 +24,11 @@ final class FeedPageGenerator {
func generatePage(language: ContentLanguage,
posts: [FeedEntryData],
title: String,
title: String?,
description: String?,
showTitle: Bool,
image: FileResource?,
pageUrl: String,
pageTitle: String?,
pageNumber: Int,
totalPages: Int,
languageButtonUrl: String,
@ -44,10 +46,14 @@ final class FeedPageGenerator {
text: language.next.rawValue,
url: languageButtonUrl)
let imageUrl = image?.linkPreviewImage(results: results)
let pageHeader = PageHeader(
language: language,
title: title,
title: title ?? pageTitle,
description: description,
image: imageUrl,
pageUrl: pageUrl,
iconUrl: iconUrl,
languageButton: languageButton,
links: content.navigationBar(in: language),
@ -57,8 +63,8 @@ final class FeedPageGenerator {
let page = GenericPage(
header: pageHeader,
additionalFooter: footer) { content in
if showTitle {
content += "<h1 class='separated-headline'>\(title)</h1>"
if let pageTitle {
content += "<h1 class='separated-headline'>\(pageTitle)</h1>"
}
for post in posts {
content += FeedEntry(data: post).content

View File

@ -25,7 +25,7 @@ final class PageGenerator {
text: settings.emptyPageText).content
}
func generate(page: Page, language: ContentLanguage, results: PageGenerationResults) -> String? {
func generate(page: Page, language: ContentLanguage, results: PageGenerationResults, pageUrl: String) -> String? {
let contentGenerator = PageContentParser(
content: content,
language: language, results: results)
@ -51,7 +51,7 @@ final class PageGenerator {
}
let headers = makeHeaders(requiredItems: results.requiredHeaders, results: results)
results.require(files: headers.compactMap { $0.file })
results.require(files: headers.compactMap { $0.requiredFile })
let iconUrl = content.settings.navigation.localized(in: language).rootUrl
let languageUrl = page.absoluteUrl(in: language.next)
@ -59,10 +59,14 @@ final class PageGenerator {
text: language.next.rawValue,
url: languageUrl)
let imageUrl = localized.linkPreview.image?.linkPreviewImage(results: results)
let pageHeader = PageHeader(
language: language,
title: localized.linkPreview.title ?? localized.title,
description: localized.linkPreview.description,
image: imageUrl,
pageUrl: pageUrl,
iconUrl: iconUrl,
languageButton: languageButton,
links: content.navigationBar(in: language),

View File

@ -34,22 +34,45 @@ private struct TagHeaderContent {
let description: String?
let image: String?
let iconUrl: String
let links: [NavigationBar.Link]
let headers: Set<HeaderElement>
let baseUrl: String
let basePath: String
let websiteUrl: String
let localizedBaseUrl: String
private func url(pageNumber: Int) -> String {
baseUrl + "/\(pageNumber)"
/**
The path (relative to the output folder) for the html file
*/
func filePath(pageNumber: Int) -> String {
basePath + "/\(pageNumber).html"
}
func fileUrl(pageNumber: Int) -> String {
url(pageNumber: pageNumber) + ".html"
/**
The absolute url (without domain) for the language button of the page
*/
private func languageButtonUrl(page: Int) -> String {
guard page > 1 else {
return localizedBaseUrl
}
return localizedBaseUrl + "/\(page)"
}
/**
The full url (including domain) to the page.
*/
private func pageUrl(page: Int) -> String {
guard page > 1 else {
return websiteUrl + basePath
}
return websiteUrl + basePath + "/\(page)"
}
func pageHeader(pageNumber: Int) -> PageHeader {
@ -57,10 +80,12 @@ private struct TagHeaderContent {
language: language,
title: title,
description: description,
image: image,
pageUrl: pageUrl(page: pageNumber),
iconUrl: iconUrl,
languageButton: .init(
text: language.next.rawValue,
url: localizedBaseUrl + "/\(pageNumber)"),
url: languageButtonUrl(page: pageNumber)),
links: links,
headers: headers,
icons: [])
@ -83,14 +108,19 @@ final class TagOverviewGenerator {
func generatePages(tags: [Tag], overview: Tag) {
let localized = overview.localized(in: language)
let imageUrl = localized.linkPreview.image?.linkPreviewImage(results: results)
let header = TagHeaderContent(
language: language,
title: localized.linkPreview.title ?? localized.title,
description: localized.linkPreview.description,
image: imageUrl,
iconUrl: content.settings.navigation.localized(in: language).rootUrl,
links: content.navigationBar(in: language),
headers: content.postPageHeaders,
baseUrl: overview.absoluteUrl(in: language),
basePath: overview.absoluteUrl(in: language),
websiteUrl: content.settings.general.url,
localizedBaseUrl: overview.absoluteUrl(in: language.next))
// Sort tags by title
@ -140,16 +170,16 @@ final class TagOverviewGenerator {
}
if totalPages > 1 {
content += PostFeedPageNavigation(
linkPrefix: header.baseUrl,
linkPrefix: header.basePath,
currentPage: pageNumber,
numberOfPages: totalPages).content
}
}
let fileContent = page.content
let url = header.fileUrl(pageNumber: pageNumber)
let filePath = header.filePath(pageNumber: pageNumber)
guard content.storage.write(fileContent, to: url) else {
results.unsavedOutput(url, source: .tagOverview)
guard content.storage.write(fileContent, to: filePath) else {
results.unsavedOutput(filePath, source: .tagOverview)
return
}
}