Compare commits

...

2 commits

3 changed files with 13 additions and 13 deletions

View file

@ -33,7 +33,7 @@ let matchedImage_src;
if (matchedImage && !customFeaturedImage) { if (matchedImage && !customFeaturedImage) {
matchedImage_src = await getImage({src: featuredImages[matchedImage], format: 'webp'}) || null; matchedImage_src = await getImage({src: featuredImages[matchedImage], format: 'webp'}) || null;
} }
const firstImageURL = await ExtractFirstImage(Content,Astro.url.origin) const firstImageURL = await ExtractFirstImage(Content)
const cover = customFeaturedImage || matchedImage_src?.src || firstImageURL || `/post/${slug}/featured.png` || ''; const cover = customFeaturedImage || matchedImage_src?.src || firstImageURL || `/post/${slug}/featured.png` || '';
--- ---

View file

@ -20,14 +20,22 @@ async function getExternalImage(post) {
return matchedImage_?.src; return matchedImage_?.src;
} }
// Function to check for images in markdown without rendering
function checkForImages(markdownContent) {
// Match markdown image syntax ![alt](url) or HTML <img> tags
const imageRegex = /!\[.*?]\(.*?\)|<img.*?src=["'].*?["'].*?>/g;
return imageRegex.test(markdownContent);
}
// This function dynamically generates og:images for posts that don't have a featured image // This function dynamically generates og:images for posts that don't have a featured image
export async function GET({ props }) { export async function GET({ props }) {
const {post} = props; const {post} = props;
const ExternalImageURL = await getExternalImage(post); const ExternalImageURL = await getExternalImage(post);
const hasImage = checkForImages(post.body);
try { try {
// Check if a custom cover image already exists // Check if a custom cover image already exists
if (post.data.cover || ExternalImageURL) { if (post.data.cover || ExternalImageURL || hasImage) {
// Redirect to the existing image // set it to empty to prevent the image generation
return new Response(null); return new Response(null);
} }

View file

@ -3,7 +3,7 @@ import {getContainerRenderer as getMDXRenderer} from "@astrojs/mdx";
import {experimental_AstroContainer as AstroContainer} from "astro/container"; import {experimental_AstroContainer as AstroContainer} from "astro/container";
import {transform, walk} from "ultrahtml"; import {transform, walk} from "ultrahtml";
export async function ExtractFirstImage(Content, baseUrl = '') { export async function ExtractFirstImage(Content) {
// Load MDX renderer. Other renderers for UI frameworks (e.g. React, Vue, etc.) would need adding here if you were using those. // Load MDX renderer. Other renderers for UI frameworks (e.g. React, Vue, etc.) would need adding here if you were using those.
const renderers = await loadRenderers([getMDXRenderer()]); const renderers = await loadRenderers([getMDXRenderer()]);
@ -22,15 +22,7 @@ export async function ExtractFirstImage(Content, baseUrl = '') {
await walk(node, (node) => { await walk(node, (node) => {
if (node.name === "img" && node.attributes.src) { if (node.name === "img" && node.attributes.src) {
// Store the first image URL we find // Store the first image URL we find
if (!firstImageUrl) { firstImageUrl = node.attributes.src;
firstImageUrl = node.attributes.src.startsWith("/")
? baseUrl + node.attributes.src
: node.attributes.src;
}
// Still update the src attribute if needed
if (node.attributes.src.startsWith("/")) {
node.attributes.src = baseUrl + node.attributes.src;
}
} }
}); });
return node; return node;