diff --git a/quartz/util/siteOg.ts b/quartz/util/siteOg.ts index d920eb6..8b55a0d 100644 --- a/quartz/util/siteOg.ts +++ b/quartz/util/siteOg.ts @@ -1,4 +1,5 @@ import { QuartzPluginData } from "../plugins/vfile" +import { mergeHierarchicalSocialMetadata, socialMetadataSlug } from "./siteSocialOverrides" export type SocialImageRef = | { @@ -23,6 +24,13 @@ export type SiteSocialMetadata = { image?: SocialImageRef } -export function resolveSiteSocialMetadata(_fileData: QuartzPluginData): SiteSocialMetadata { - return {} +const siteSocialMetadata: SiteSocialMetadata = {} +const siteSocialMetadataOverrides: Record = {} + +export function resolveSiteSocialMetadata(fileData: QuartzPluginData): SiteSocialMetadata { + return mergeHierarchicalSocialMetadata( + siteSocialMetadata, + socialMetadataSlug(fileData), + siteSocialMetadataOverrides, + ) } diff --git a/quartz/util/siteSocialOverrides.ts b/quartz/util/siteSocialOverrides.ts new file mode 100644 index 0000000..ab376c6 --- /dev/null +++ b/quartz/util/siteSocialOverrides.ts @@ -0,0 +1,23 @@ +import { QuartzPluginData } from "../plugins/vfile" + +export function socialMetadataSlug(fileData: QuartzPluginData): string { + return typeof fileData.slug === "string" ? fileData.slug : "index" +} + +export function findHierarchicalSocialMetadata( + slug: string, + overrides: Record, +): T | undefined { + return Object.entries(overrides) + .filter(([prefix]) => slug === prefix || slug.startsWith(`${prefix}/`)) + .sort(([left], [right]) => right.length - left.length)[0]?.[1] +} + +export function mergeHierarchicalSocialMetadata( + baseMetadata: T, + slug: string, + overrides: Record>, +): T { + const matchingOverride = findHierarchicalSocialMetadata(slug, overrides) + return matchingOverride ? { ...baseMetadata, ...matchingOverride } : baseMetadata +}