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

@ -0,0 +1,42 @@
import Foundation
final class GeneralSettings: ObservableObject {
@Published
var url: String
@Published
var linkPreviewImageWidth: Int
@Published
var linkPreviewImageHeight: Int
init(url: String, linkPreviewImageWidth: Int, linkPreviewImageHeight: Int) {
self.url = url
self.linkPreviewImageWidth = linkPreviewImageWidth
self.linkPreviewImageHeight = linkPreviewImageHeight
}
}
extension GeneralSettings {
convenience init(data: Data) {
self.init(
url: data.url,
linkPreviewImageWidth: data.linkPreviewImageWidth,
linkPreviewImageHeight: data.linkPreviewImageHeight)
}
var data: Data {
.init(
url: url,
linkPreviewImageWidth: linkPreviewImageWidth,
linkPreviewImageHeight: linkPreviewImageHeight)
}
struct Data: Codable {
let url: String
let linkPreviewImageWidth: Int
let linkPreviewImageHeight: Int
}
}

View File

@ -2,13 +2,7 @@ import Foundation
final class LocalizedPostSettings: ObservableObject {
/// The page title for the post feed
@Published
var title: String
/// The page description for the post feed
@Published
var description: String
var linkPreview: LinkPreview
/// The path to the feed in the final website, appended with the page number
@Published
@ -22,11 +16,10 @@ final class LocalizedPostSettings: ObservableObject {
@Published
var defaultPageLinkText: String
init(title: String, description: String, feedUrlPrefix: String, defaultPageLinkText: String) {
self.title = title
self.description = description
init(feedUrlPrefix: String, defaultPageLinkText: String, linkPreview: LinkPreview) {
self.feedUrlPrefix = feedUrlPrefix
self.defaultPageLinkText = defaultPageLinkText
self.linkPreview = linkPreview
}
}
@ -34,26 +27,23 @@ final class LocalizedPostSettings: ObservableObject {
extension LocalizedPostSettings {
convenience init(data: Data) {
convenience init(context: LoadingContext, data: Data) {
self.init(
title: data.feedTitle,
description: data.feedDescription,
feedUrlPrefix: data.feedUrlPrefix,
defaultPageLinkText: data.defaultPageLinkText)
defaultPageLinkText: data.defaultPageLinkText,
linkPreview: .init(context: context, data: data.linkPreview))
}
var data: Data {
.init(
feedTitle: title,
feedDescription: description,
feedUrlPrefix: feedUrlPrefix,
defaultPageLinkText: defaultPageLinkText)
defaultPageLinkText: defaultPageLinkText,
linkPreview: linkPreview.data)
}
struct Data: Codable {
let feedTitle: String
let feedDescription: String
let feedUrlPrefix: String
let defaultPageLinkText: String
let linkPreview: LinkPreview.Data
}
}

View File

@ -65,8 +65,8 @@ extension PostSettings {
swiperCssFile: data.swiperCssFile.map(context.file),
swiperJsFile: data.swiperJsFile.map(context.file),
defaultCssFile: data.defaultCssFile.map(context.file),
german: .init(data: data.german),
english: .init(data: data.english))
german: .init(context: context, data: data.german),
english: .init(context: context, data: data.english))
}
var data: PostSettings.Data {

View File

@ -2,6 +2,9 @@ import Foundation
final class Settings: ObservableObject {
@Published
var general: GeneralSettings
@Published
var paths: PathSettings
@ -18,11 +21,13 @@ final class Settings: ObservableObject {
@Published
var audioPlayer: AudioPlayerSettings
init(paths: PathSettings,
init(general: GeneralSettings,
paths: PathSettings,
navigation: NavigationSettings,
posts: PostSettings,
pages: PageSettings,
audioPlayer: AudioPlayerSettings) {
self.general = general
self.paths = paths
self.navigation = navigation
self.posts = posts
@ -43,6 +48,7 @@ extension Settings {
convenience init(context: LoadingContext, data: Settings.Data) {
self.init(
general: .init(data: data.general),
paths: .init(data: data.paths),
navigation: .init(context: context, data: data.navigation),
posts: .init(context: context, data: data.posts),
@ -52,6 +58,7 @@ extension Settings {
func data(tagOverview: Tag?) -> Data {
.init(
general: general.data,
paths: paths.data,
navigation: navigation.data,
posts: posts.data,
@ -61,6 +68,7 @@ extension Settings {
}
struct Data: Codable {
let general: GeneralSettings.Data
let paths: PathSettings.Data
let navigation: NavigationSettings.Data
let posts: PostSettings.Data
@ -73,6 +81,7 @@ extension Settings {
extension Settings {
static let `default`: Settings = .init(
general: .default,
paths: .default,
navigation: .default,
posts: .default,
@ -80,6 +89,14 @@ extension Settings {
audioPlayer: .default)
}
extension GeneralSettings {
static let `default`: GeneralSettings = .init(
url: "https://example.com",
linkPreviewImageWidth: 1200,
linkPreviewImageHeight: 630)
}
extension AudioPlayerSettings {
static let `default`: AudioPlayerSettings = .init(
@ -100,15 +117,18 @@ extension PostSettings {
swiperJsFile: nil,
defaultCssFile: nil,
german: .init(
title: "Beiträge",
description: "Alle Beiträge",
feedUrlPrefix: "blog",
defaultPageLinkText: "Anzeigen"),
defaultPageLinkText: "Anzeigen",
linkPreview: .init(
title: "Beiträge",
description: "Alle Beiträge")),
english: .init(
title: "Blog posts",
description: "All blog posts",
feedUrlPrefix: "blog",
defaultPageLinkText: "View"))
defaultPageLinkText: "View",
linkPreview: .init(
title: "Blog posts",
description: "All blog posts"))
)
}
}