From 57234acf3a7b85e773863b6781c4b2cebf6e0232 Mon Sep 17 00:00:00 2001 From: Christian Beutel <> Date: Fri, 4 Jul 2025 10:00:52 +0200 Subject: [PATCH] adds ogp meta tags --- web/src/lib/components/base/meta_tags.svelte | 557 ++++++++++++++++++ web/src/lib/models/trail.ts | 1 + .../map/trail/[handle]/[id]/+page.svelte | 26 +- .../routes/profile/[handle]/+layout.svelte | 24 +- web/src/routes/profile/[handle]/+page.svelte | 2 - .../trail/view/[handle]/[id]/+page.svelte | 26 +- 6 files changed, 625 insertions(+), 11 deletions(-) create mode 100644 web/src/lib/components/base/meta_tags.svelte diff --git a/web/src/lib/components/base/meta_tags.svelte b/web/src/lib/components/base/meta_tags.svelte new file mode 100644 index 00000000..308eaede --- /dev/null +++ b/web/src/lib/components/base/meta_tags.svelte @@ -0,0 +1,557 @@ + + + + {#if updatedTitle} + {updatedTitle} + {/if} + + {#if robots !== false} + + {/if} + + {#if description} + + {/if} + + {#if canonical} + + {/if} + + {#if keywords?.length} + + {/if} + + {#if mobileAlternate} + + {/if} + + {#if languageAlternates && languageAlternates.length > 0} + {#each languageAlternates as languageAlternate (languageAlternate)} + + {/each} + {/if} + + {#if openGraph} + {#if openGraph.url || canonical} + + {/if} + + {#if openGraph.type} + + {#if openGraph.type.toLowerCase() === "profile" && openGraph.profile} + {#if openGraph.profile.firstName} + + {/if} + + {#if openGraph.profile.lastName} + + {/if} + + {#if openGraph.profile.username} + + {/if} + + {#if openGraph.profile.gender} + + {/if} + {:else if openGraph.type.toLowerCase() === "book" && openGraph.book} + {#if openGraph.book.authors && openGraph.book.authors.length} + {#each openGraph.book.authors as author (author)} + + {/each} + {/if} + + {#if openGraph.book.isbn} + + {/if} + + {#if openGraph.book.releaseDate} + + {/if} + + {#if openGraph.book.tags && openGraph.book.tags.length} + {#each openGraph.book.tags as tag (tag)} + + {/each} + {/if} + {:else if openGraph.type.toLowerCase() === "article" && openGraph.article} + {#if openGraph.article.publishedTime} + + {/if} + + {#if openGraph.article.modifiedTime} + + {/if} + + {#if openGraph.article.expirationTime} + + {/if} + + {#if openGraph.article.authors && openGraph.article.authors.length} + {#each openGraph.article.authors as author (author)} + + {/each} + {/if} + + {#if openGraph.article.section} + + {/if} + + {#if openGraph.article.tags && openGraph.article.tags.length} + {#each openGraph.article.tags as tag (tag)} + + {/each} + {/if} + {:else if openGraph.type.toLowerCase() === "video.movie" || openGraph.type.toLowerCase() === "video.episode" || openGraph.type.toLowerCase() === "video.tv_show" || (openGraph.type.toLowerCase() === "video.other" && openGraph.video)} + {#if openGraph.video?.actors && openGraph.video.actors.length} + {#each openGraph.video.actors as actor (actor)} + {#if actor.profile} + + {/if} + {#if actor.role} + + {/if} + {/each} + {/if} + + {#if openGraph.video?.directors && openGraph.video.directors.length} + {#each openGraph.video.directors as director (director)} + + {/each} + {/if} + + {#if openGraph.video?.writers && openGraph.video.writers.length} + {#each openGraph.video.writers as writer (writer)} + + {/each} + {/if} + + {#if openGraph.video?.duration} + + {/if} + + {#if openGraph.video?.releaseDate} + + {/if} + + {#if openGraph.video?.tags && openGraph.video.tags.length} + {#each openGraph.video.tags as tag (tag)} + + {/each} + {/if} + + {#if openGraph.video?.series} + + {/if} + {/if} + {/if} + + {#if openGraph.title || updatedTitle} + + {/if} + + {#if openGraph.description || description} + + {/if} + + {#if openGraph.images && openGraph.images.length} + {#each openGraph.images as image (image)} + + {#if image.alt} + + {/if} + {#if image.width} + + {/if} + {#if image.height} + + {/if} + {#if image.secureUrl} + + {/if} + {#if image.type} + + {/if} + {/each} + {/if} + + {#if openGraph.videos && openGraph.videos.length} + {#each openGraph.videos as video (video)} + + {#if video.width} + + {/if} + {#if video.height} + + {/if} + {#if video.secureUrl} + + {/if} + {#if video.type} + + {/if} + {/each} + {/if} + + {#if openGraph.audio && openGraph.audio.length} + {#each openGraph.audio as audio (audio)} + + {#if audio.secureUrl} + + {/if} + {#if audio.type} + + {/if} + {/each} + {/if} + + {#if openGraph.locale} + + {/if} + + {#if openGraph.siteName} + + {/if} + {/if} + + {#if additionalMetaTags && Array.isArray(additionalMetaTags)} + {#each additionalMetaTags as tag (tag)} + + {/each} + {/if} + + {#if additionalLinkTags?.length} + {#each additionalLinkTags as tag (tag)} + + {/each} + {/if} + diff --git a/web/src/lib/models/trail.ts b/web/src/lib/models/trail.ts index 48ebab2a..bd0fa084 100644 --- a/web/src/lib/models/trail.ts +++ b/web/src/lib/models/trail.ts @@ -24,6 +24,7 @@ class Trail { photos: string[]; gpx?: string; created?: string; + updated?: string; category?: string; tags: string[]; waypoints: string[]; diff --git a/web/src/routes/map/trail/[handle]/[id]/+page.svelte b/web/src/routes/map/trail/[handle]/[id]/+page.svelte index 0c530c3e..2c2d0627 100644 --- a/web/src/routes/map/trail/[handle]/[id]/+page.svelte +++ b/web/src/routes/map/trail/[handle]/[id]/+page.svelte @@ -1,7 +1,9 @@ - - {trail.name} | {$_("map")} | wanderer - + + t.name), + }, + images: data.trail.photos.map((p) => ({ + url: page.url.origin + getFileURL(data.trail, p), + })), + }} +>